From 80cacedd89011117b78534133b31d87995f89569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucio=20Andr=C3=A9s=20Illanes=20Albornoz?= Date: Fri, 23 Nov 2018 15:27:33 +0100 Subject: [PATCH] =?UTF-8?q?asciiblaster-cordoba/:=20preliminarily=20added?= =?UTF-8?q?=20for=20standalone=20Android=20app=20support=20via=20Apache=20?= =?UTF-8?q?C=C3=B3rdoba.=20.gitignore:=20adds=20asciiblaster-cordoba/{node?= =?UTF-8?q?=5Fmodules,platforms/android/{.gradle,app/build,CordovaLib/buil?= =?UTF-8?q?d}}.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + asciiblaster-cordoba/config.xml | 27 + asciiblaster-cordoba/package-lock.json | 218 + asciiblaster-cordoba/package.json | 34 + .../platforms/android/.gitignore | 14 + .../android/CordovaLib/AndroidManifest.xml | 23 + .../platforms/android/CordovaLib/build.gradle | 137 + .../android/CordovaLib/cordova.gradle | 205 + .../android/CordovaLib/project.properties | 16 + .../apache/cordova/AuthenticationToken.java | 69 + .../src/org/apache/cordova/BuildHelper.java | 70 + .../org/apache/cordova/CallbackContext.java | 142 + .../src/org/apache/cordova/CallbackMap.java | 65 + .../src/org/apache/cordova/Config.java | 71 + .../org/apache/cordova/ConfigXmlParser.java | 145 + .../org/apache/cordova/CordovaActivity.java | 519 ++ .../src/org/apache/cordova/CordovaArgs.java | 113 + .../src/org/apache/cordova/CordovaBridge.java | 187 + .../cordova/CordovaClientCertRequest.java | 105 + .../apache/cordova/CordovaDialogsHelper.java | 152 + .../cordova/CordovaHttpAuthHandler.java | 51 + .../org/apache/cordova/CordovaInterface.java | 97 + .../apache/cordova/CordovaInterfaceImpl.java | 249 + .../src/org/apache/cordova/CordovaPlugin.java | 422 + .../apache/cordova/CordovaPreferences.java | 101 + .../apache/cordova/CordovaResourceApi.java | 472 + .../org/apache/cordova/CordovaWebView.java | 142 + .../apache/cordova/CordovaWebViewEngine.java | 85 + .../apache/cordova/CordovaWebViewImpl.java | 615 ++ .../src/org/apache/cordova/CoreAndroid.java | 390 + .../src/org/apache/cordova/ExposedJsApi.java | 31 + .../cordova/ICordovaClientCertRequest.java | 66 + .../apache/cordova/ICordovaCookieManager.java | 33 + .../cordova/ICordovaHttpAuthHandler.java | 38 + .../src/org/apache/cordova/LOG.java | 244 + .../cordova/NativeToJsMessageQueue.java | 542 ++ .../org/apache/cordova/PermissionHelper.java | 87 + .../src/org/apache/cordova/PluginEntry.java | 70 + .../src/org/apache/cordova/PluginManager.java | 526 ++ .../src/org/apache/cordova/PluginResult.java | 198 + .../org/apache/cordova/ResumeCallback.java | 76 + .../src/org/apache/cordova/Whitelist.java | 170 + .../cordova/engine/SystemCookieManager.java | 69 + .../cordova/engine/SystemExposedJsApi.java | 53 + .../cordova/engine/SystemWebChromeClient.java | 277 + .../apache/cordova/engine/SystemWebView.java | 88 + .../cordova/engine/SystemWebViewClient.java | 367 + .../cordova/engine/SystemWebViewEngine.java | 319 + .../platforms/android/android.json | 30 + .../platforms/android/app/build.gradle | 329 + .../android/app/src/main/AndroidManifest.xml | 14 + .../app/src/main/assets/www/assets/css/ak.css | 139 + .../main/assets/www/assets/css/nitelite.css | 119 + .../src/main/assets/www/assets/css/sally.css | 211 + .../src/main/assets/www/assets/doc/index.html | 38 + .../src/main/assets/www/assets/doc/irssi.txt | 153 + .../main/assets/www/assets/doc/nopaint.txt | 58 + .../assets/www/assets/doc/shaders/brush.txt | 126 + .../assets/www/assets/doc/shaders/canvas.txt | 237 + .../assets/www/assets/doc/shaders/util.txt | 38 + .../main/assets/www/assets/doc/shadetut.txt | 156 + .../src/main/assets/www/assets/doc/tips.txt | 16 + .../www/assets/fonts/fsex300-webfont.eot | Bin 0 -> 136761 bytes .../www/assets/fonts/fsex300-webfont.svg | 6006 +++++++++++++ .../www/assets/fonts/fsex300-webfont.ttf | Bin 0 -> 659104 bytes .../www/assets/fonts/fsex300-webfont.woff | Bin 0 -> 185100 bytes .../main/assets/www/assets/images/bucket.png | Bin 0 -> 1219 bytes .../main/assets/www/assets/images/dropper.gif | Bin 0 -> 1170 bytes .../assets/www/assets/images/gray-dither.gif | Bin 0 -> 1102 bytes .../main/assets/www/assets/images/tile.jpg | Bin 0 -> 2526 bytes .../app/src/main/assets/www/assets/js/app.js | 99 + .../main/assets/www/assets/js/clipboard.js | 212 + .../main/assets/www/assets/js/ext/color.js | 106 + .../main/assets/www/assets/js/ext/nopaint.js | 896 ++ .../main/assets/www/assets/js/ext/oktween.js | 167 + .../main/assets/www/assets/js/ext/unicode.js | 203 + .../src/main/assets/www/assets/js/ext/util.js | 199 + .../app/src/main/assets/www/assets/js/gfx.js | 387 + .../app/src/main/assets/www/assets/js/lex.js | 142 + .../src/main/assets/www/assets/js/matrix.js | 549 ++ .../src/main/assets/www/assets/js/ui/brush.js | 108 + .../main/assets/www/assets/js/ui/canvas.js | 144 + .../main/assets/www/assets/js/ui/controls.js | 342 + .../main/assets/www/assets/js/ui/custom.js | 29 + .../src/main/assets/www/assets/js/ui/keys.js | 213 + .../main/assets/www/assets/js/ui/letters.js | 89 + .../main/assets/www/assets/js/ui/palette.js | 116 + .../main/assets/www/assets/js/ui/selection.js | 159 + .../src/main/assets/www/assets/js/ui/tool.js | 170 + .../main/assets/www/assets/js/ui/transform.js | 176 + .../src/main/assets/www/assets/text/LICENCE | 29 + .../app/src/main/assets/www/assets/text/TODO | 9 + .../android/nativeapiprovider.js | 36 + .../android/promptbasednativeapi.js | 35 + .../main/assets/www/cordova-js-src/exec.js | 286 + .../assets/www/cordova-js-src/platform.js | 125 + .../www/cordova-js-src/plugin/android/app.js | 108 + .../app/src/main/assets/www/cordova.js | 2189 +++++ .../src/main/assets/www/cordova_plugins.js | 9 + .../app/src/main/assets/www/index.html | 139 + .../lalbornoz/asciiblaster/MainActivity.java | 41 + .../cordova/whitelist/WhitelistPlugin.java | 161 + .../main/res/drawable-land-hdpi/screen.png | Bin 0 -> 64368 bytes .../main/res/drawable-land-ldpi/screen.png | Bin 0 -> 15341 bytes .../main/res/drawable-land-mdpi/screen.png | Bin 0 -> 31136 bytes .../main/res/drawable-land-xhdpi/screen.png | Bin 0 -> 142334 bytes .../main/res/drawable-land-xxhdpi/screen.png | Bin 0 -> 227190 bytes .../main/res/drawable-land-xxxhdpi/screen.png | Bin 0 -> 293416 bytes .../main/res/drawable-port-hdpi/screen.png | Bin 0 -> 67702 bytes .../main/res/drawable-port-ldpi/screen.png | Bin 0 -> 15345 bytes .../main/res/drawable-port-mdpi/screen.png | Bin 0 -> 30079 bytes .../main/res/drawable-port-xhdpi/screen.png | Bin 0 -> 141738 bytes .../main/res/drawable-port-xxhdpi/screen.png | Bin 0 -> 211817 bytes .../main/res/drawable-port-xxxhdpi/screen.png | Bin 0 -> 299018 bytes .../app/src/main/res/mipmap-hdpi/icon.png | Bin 0 -> 3345 bytes .../app/src/main/res/mipmap-ldpi/icon.png | Bin 0 -> 1821 bytes .../app/src/main/res/mipmap-mdpi/icon.png | Bin 0 -> 2368 bytes .../app/src/main/res/mipmap-xhdpi/icon.png | Bin 0 -> 4085 bytes .../app/src/main/res/mipmap-xxhdpi/icon.png | Bin 0 -> 6421 bytes .../app/src/main/res/mipmap-xxxhdpi/icon.png | Bin 0 -> 7934 bytes .../app/src/main/res/values/strings.xml | 6 + .../android/app/src/main/res/xml/config.xml | 24 + .../platforms/android/build.gradle | 54 + .../platforms/android/cordova/Api.js | 411 + .../android/cordova/android_sdk_version | 29 + .../android/cordova/android_sdk_version.bat | 26 + .../platforms/android/cordova/build | 50 + .../platforms/android/cordova/build.bat | 26 + .../platforms/android/cordova/check_reqs | 31 + .../platforms/android/cordova/check_reqs.bat | 26 + .../platforms/android/cordova/clean | 51 + .../platforms/android/cordova/clean.bat | 26 + .../platforms/android/cordova/defaults.xml | 26 + .../platforms/android/cordova/lib/Adb.js | 101 + .../android/cordova/lib/AndroidManifest.js | 160 + .../android/cordova/lib/AndroidProject.js | 209 + .../android/cordova/lib/AndroidStudio.js | 11 + .../android/cordova/lib/android_sdk.js | 102 + .../platforms/android/cordova/lib/build.js | 294 + .../cordova/lib/builders/GenericBuilder.js | 124 + .../cordova/lib/builders/GradleBuilder.js | 331 + .../cordova/lib/builders/StudioBuilder.js | 303 + .../android/cordova/lib/builders/builders.js | 46 + .../android/cordova/lib/check_reqs.js | 424 + .../platforms/android/cordova/lib/device.js | 112 + .../platforms/android/cordova/lib/emulator.js | 534 ++ .../android/cordova/lib/getASPath.bat | 3 + .../android/cordova/lib/install-device | 42 + .../android/cordova/lib/install-device.bat | 26 + .../android/cordova/lib/install-emulator | 38 + .../android/cordova/lib/install-emulator.bat | 26 + .../android/cordova/lib/list-devices | 34 + .../android/cordova/lib/list-devices.bat | 26 + .../android/cordova/lib/list-emulator-images | 34 + .../cordova/lib/list-emulator-images.bat | 26 + .../cordova/lib/list-started-emulators | 34 + .../cordova/lib/list-started-emulators.bat | 26 + .../platforms/android/cordova/lib/log.js | 56 + .../android/cordova/lib/plugin-build.gradle | 72 + .../android/cordova/lib/pluginHandlers.js | 345 + .../platforms/android/cordova/lib/prepare.js | 480 + .../platforms/android/cordova/lib/retry.js | 68 + .../platforms/android/cordova/lib/run.js | 132 + .../android/cordova/lib/start-emulator | 39 + .../android/cordova/lib/start-emulator.bat | 26 + .../platforms/android/cordova/log | 36 + .../platforms/android/cordova/log.bat | 26 + .../android/cordova/loggingHelper.js | 18 + .../android/cordova/node_modules/.bin/nopt | 15 + .../cordova/node_modules/.bin/nopt.cmd | 7 + .../android/cordova/node_modules/.bin/semver | 15 + .../cordova/node_modules/.bin/semver.cmd | 7 + .../android/cordova/node_modules/.bin/shjs | 15 + .../cordova/node_modules/.bin/shjs.cmd | 7 + .../cordova/node_modules/abbrev/LICENSE | 46 + .../cordova/node_modules/abbrev/README.md | 23 + .../cordova/node_modules/abbrev/abbrev.js | 61 + .../cordova/node_modules/abbrev/package.json | 57 + .../android-versions/.jshintignore | 8 + .../node_modules/android-versions/.jshintrc | 28 + .../node_modules/android-versions/.travis.yml | 3 + .../node_modules/android-versions/README.md | 87 + .../node_modules/android-versions/index.js | 154 + .../android-versions/package.json | 67 + .../android-versions/tests/index.test.js | 118 + .../cordova/node_modules/ansi/.jshintrc | 4 + .../cordova/node_modules/ansi/.npmignore | 1 + .../cordova/node_modules/ansi/History.md | 23 + .../android/cordova/node_modules/ansi/LICENSE | 24 + .../cordova/node_modules/ansi/README.md | 98 + .../node_modules/ansi/examples/beep/index.js | 16 + .../node_modules/ansi/examples/clear/index.js | 15 + .../ansi/examples/cursorPosition.js | 32 + .../ansi/examples/progress/index.js | 87 + .../cordova/node_modules/ansi/lib/ansi.js | 405 + .../cordova/node_modules/ansi/lib/newlines.js | 71 + .../cordova/node_modules/ansi/package.json | 56 + .../node_modules/balanced-match/.npmignore | 5 + .../node_modules/balanced-match/LICENSE.md | 21 + .../node_modules/balanced-match/README.md | 91 + .../node_modules/balanced-match/index.js | 59 + .../node_modules/balanced-match/package.json | 78 + .../cordova/node_modules/base64-js/LICENSE | 21 + .../cordova/node_modules/base64-js/README.md | 32 + .../node_modules/base64-js/base64js.min.js | 1 + .../cordova/node_modules/base64-js/index.js | 114 + .../node_modules/base64-js/package.json | 66 + .../node_modules/base64-js/test/big-data.js | 24 + .../node_modules/base64-js/test/convert.js | 48 + .../node_modules/base64-js/test/url-safe.js | 18 + .../node_modules/big-integer/BigInteger.d.ts | 2385 +++++ .../node_modules/big-integer/BigInteger.js | 1308 +++ .../big-integer/BigInteger.min.js | 1 + .../cordova/node_modules/big-integer/LICENSE | 24 + .../node_modules/big-integer/README.md | 570 ++ .../node_modules/big-integer/bower.json | 29 + .../node_modules/big-integer/package.json | 81 + .../node_modules/big-integer/tsconfig.json | 25 + .../node_modules/bplist-parser/.npmignore | 8 + .../node_modules/bplist-parser/README.md | 47 + .../bplist-parser/bplistParser.js | 357 + .../node_modules/bplist-parser/package.json | 59 + .../bplist-parser/test/airplay.bplist | Bin 0 -> 341 bytes .../bplist-parser/test/iTunes-small.bplist | Bin 0 -> 24433 bytes .../bplist-parser/test/int64.bplist | Bin 0 -> 84 bytes .../node_modules/bplist-parser/test/int64.xml | 10 + .../bplist-parser/test/parseTest.js | 159 + .../bplist-parser/test/sample1.bplist | Bin 0 -> 605 bytes .../bplist-parser/test/sample2.bplist | Bin 0 -> 384 bytes .../bplist-parser/test/uid.bplist | Bin 0 -> 365 bytes .../bplist-parser/test/utf16.bplist | Bin 0 -> 1273 bytes .../bplist-parser/test/utf16_chinese.plist | Bin 0 -> 2362 bytes .../node_modules/brace-expansion/LICENSE | 21 + .../node_modules/brace-expansion/README.md | 129 + .../node_modules/brace-expansion/index.js | 201 + .../node_modules/brace-expansion/package.json | 76 + .../node_modules/concat-map/.travis.yml | 4 + .../cordova/node_modules/concat-map/LICENSE | 18 + .../node_modules/concat-map/README.markdown | 62 + .../cordova/node_modules/concat-map/index.js | 13 + .../node_modules/concat-map/package.json | 89 + .../node_modules/concat-map/test/map.js | 39 + .../node_modules/cordova-common/.eslintignore | 1 + .../node_modules/cordova-common/.eslintrc.yml | 13 + .../.github/PULL_REQUEST_TEMPLATE.md | 22 + .../node_modules/cordova-common/.npmignore | 2 + .../node_modules/cordova-common/.ratignore | 4 + .../node_modules/cordova-common/.travis.yml | 17 + .../node_modules/cordova-common/README.md | 155 + .../cordova-common/RELEASENOTES.md | 153 + .../node_modules/cordova-common/appveyor.yml | 20 + .../cordova-common/cordova-common.js | 47 + .../node_modules/cordova-common/package.json | 81 + .../cordova-common/src/ActionStack.js | 85 + .../src/ConfigChanges/ConfigChanges.js | 426 + .../src/ConfigChanges/ConfigFile.js | 259 + .../src/ConfigChanges/ConfigKeeper.js | 64 + .../src/ConfigChanges/munge-util.js | 162 + .../src/ConfigParser/ConfigParser.js | 602 ++ .../cordova-common/src/CordovaCheck.js | 76 + .../src/CordovaError/CordovaError.js | 92 + .../CordovaExternalToolErrorContext.js | 48 + .../cordova-common/src/CordovaLogger.js | 220 + .../cordova-common/src/FileUpdater.js | 415 + .../cordova-common/src/PlatformJson.js | 277 + .../src/PluginInfo/PluginInfo.js | 439 + .../src/PluginInfo/PluginInfoProvider.js | 82 + .../cordova-common/src/PluginManager.js | 149 + .../node_modules/cordova-common/src/events.js | 72 + .../cordova-common/src/superspawn.js | 189 + .../cordova-common/src/util/addProperty.js | 32 + .../cordova-common/src/util/plist-helpers.js | 96 + .../cordova-common/src/util/xml-helpers.js | 365 + .../cordova-registry-mapper/.npmignore | 1 + .../cordova-registry-mapper/.travis.yml | 7 + .../cordova-registry-mapper/README.md | 14 + .../cordova-registry-mapper/index.js | 204 + .../cordova-registry-mapper/package.json | 54 + .../cordova-registry-mapper/tests/test.js | 11 + .../node_modules/elementtree/.npmignore | 1 + .../node_modules/elementtree/.travis.yml | 10 + .../node_modules/elementtree/CHANGES.md | 39 + .../node_modules/elementtree/LICENSE.txt | 203 + .../cordova/node_modules/elementtree/Makefile | 21 + .../cordova/node_modules/elementtree/NOTICE | 5 + .../node_modules/elementtree/README.md | 141 + .../node_modules/elementtree/lib/constants.js | 20 + .../elementtree/lib/elementpath.js | 343 + .../elementtree/lib/elementtree.js | 611 ++ .../node_modules/elementtree/lib/errors.js | 31 + .../node_modules/elementtree/lib/parser.js | 33 + .../elementtree/lib/parsers/index.js | 1 + .../elementtree/lib/parsers/sax.js | 56 + .../node_modules/elementtree/lib/sprintf.js | 86 + .../elementtree/lib/treebuilder.js | 60 + .../node_modules/elementtree/lib/utils.js | 72 + .../node_modules/elementtree/package.json | 81 + .../elementtree/tests/data/xml1.xml | 17 + .../elementtree/tests/data/xml2.xml | 14 + .../elementtree/tests/test-simple.js | 339 + .../android/cordova/node_modules/glob/LICENSE | 15 + .../cordova/node_modules/glob/README.md | 377 + .../cordova/node_modules/glob/common.js | 245 + .../android/cordova/node_modules/glob/glob.js | 752 ++ .../cordova/node_modules/glob/package.json | 76 + .../android/cordova/node_modules/glob/sync.js | 460 + .../cordova/node_modules/inflight/LICENSE | 15 + .../cordova/node_modules/inflight/README.md | 37 + .../cordova/node_modules/inflight/inflight.js | 54 + .../node_modules/inflight/package.json | 59 + .../cordova/node_modules/inherits/LICENSE | 16 + .../cordova/node_modules/inherits/README.md | 42 + .../cordova/node_modules/inherits/inherits.js | 7 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 62 + .../cordova/node_modules/minimatch/LICENSE | 15 + .../cordova/node_modules/minimatch/README.md | 209 + .../node_modules/minimatch/minimatch.js | 923 ++ .../node_modules/minimatch/package.json | 65 + .../cordova/node_modules/nopt/.npmignore | 1 + .../android/cordova/node_modules/nopt/LICENSE | 23 + .../cordova/node_modules/nopt/README.md | 209 + .../cordova/node_modules/nopt/bin/nopt.js | 54 + .../node_modules/nopt/examples/my-program.js | 30 + .../cordova/node_modules/nopt/lib/nopt.js | 414 + .../cordova/node_modules/nopt/package.json | 60 + .../cordova/node_modules/nopt/test/basic.js | 251 + .../android/cordova/node_modules/once/LICENSE | 15 + .../cordova/node_modules/once/README.md | 79 + .../android/cordova/node_modules/once/once.js | 42 + .../cordova/node_modules/once/package.json | 68 + .../node_modules/path-is-absolute/index.js | 20 + .../node_modules/path-is-absolute/license | 21 + .../path-is-absolute/package.json | 76 + .../node_modules/path-is-absolute/readme.md | 59 + .../cordova/node_modules/plist/.jshintrc | 4 + .../cordova/node_modules/plist/.travis.yml | 43 + .../cordova/node_modules/plist/History.md | 149 + .../cordova/node_modules/plist/LICENSE | 24 + .../cordova/node_modules/plist/Makefile | 76 + .../cordova/node_modules/plist/README.md | 141 + .../node_modules/plist/dist/plist-build.js | 3982 ++++++++ .../node_modules/plist/dist/plist-parse.js | 4055 +++++++++ .../cordova/node_modules/plist/dist/plist.js | 7987 ++++++++++++++++ .../plist/examples/browser/index.html | 14 + .../cordova/node_modules/plist/index.js | 13 + .../cordova/node_modules/plist/lib/build.js | 137 + .../cordova/node_modules/plist/lib/parse.js | 215 + .../cordova/node_modules/plist/package.json | 86 + .../properties-parser/README.markdown | 48 + .../node_modules/properties-parser/index.js | 354 + .../properties-parser/package.json | 57 + .../properties-parser/play-ground.js | 17 + .../android/cordova/node_modules/q/CHANGES.md | 786 ++ .../android/cordova/node_modules/q/LICENSE | 18 + .../android/cordova/node_modules/q/README.md | 881 ++ .../cordova/node_modules/q/package.json | 120 + .../android/cordova/node_modules/q/q.js | 2048 +++++ .../android/cordova/node_modules/q/queue.js | 35 + .../android/cordova/node_modules/sax/AUTHORS | 9 + .../android/cordova/node_modules/sax/LICENSE | 23 + .../cordova/node_modules/sax/README.md | 213 + .../sax/examples/big-not-pretty.xml | 8002 +++++++++++++++++ .../node_modules/sax/examples/example.js | 41 + .../node_modules/sax/examples/get-products.js | 58 + .../node_modules/sax/examples/hello-world.js | 4 + .../node_modules/sax/examples/not-pretty.xml | 8 + .../node_modules/sax/examples/pretty-print.js | 74 + .../node_modules/sax/examples/shopping.xml | 2 + .../node_modules/sax/examples/strict.dtd | 870 ++ .../node_modules/sax/examples/switch-bench.js | 45 + .../node_modules/sax/examples/test.html | 15 + .../node_modules/sax/examples/test.xml | 1254 +++ .../cordova/node_modules/sax/lib/sax.js | 1006 +++ .../cordova/node_modules/sax/package.json | 89 + .../node_modules/sax/test/buffer-overrun.js | 25 + .../node_modules/sax/test/cdata-chunked.js | 11 + .../node_modules/sax/test/cdata-end-split.js | 15 + .../node_modules/sax/test/cdata-fake-end.js | 28 + .../node_modules/sax/test/cdata-multiple.js | 15 + .../cordova/node_modules/sax/test/cdata.js | 10 + .../cordova/node_modules/sax/test/index.js | 86 + .../cordova/node_modules/sax/test/issue-23.js | 43 + .../cordova/node_modules/sax/test/issue-30.js | 24 + .../cordova/node_modules/sax/test/issue-35.js | 15 + .../cordova/node_modules/sax/test/issue-47.js | 13 + .../cordova/node_modules/sax/test/issue-49.js | 31 + .../node_modules/sax/test/parser-position.js | 28 + .../cordova/node_modules/sax/test/script.js | 12 + .../sax/test/self-closing-child-strict.js | 40 + .../sax/test/self-closing-child.js | 40 + .../node_modules/sax/test/self-closing-tag.js | 25 + .../node_modules/sax/test/stray-ending.js | 17 + .../sax/test/trailing-non-whitespace.js | 17 + .../cordova/node_modules/sax/test/unquoted.js | 17 + .../node_modules/sax/test/xmlns-issue-41.js | 67 + .../node_modules/sax/test/xmlns-rebinding.js | 59 + .../node_modules/sax/test/xmlns-strict.js | 71 + .../node_modules/sax/test/xmlns-unbound.js | 15 + .../xmlns-xml-default-prefix-attribute.js | 35 + .../sax/test/xmlns-xml-default-prefix.js | 20 + .../sax/test/xmlns-xml-default-redefine.js | 40 + .../cordova/node_modules/semver/LICENSE | 15 + .../cordova/node_modules/semver/README.md | 388 + .../cordova/node_modules/semver/bin/semver | 143 + .../cordova/node_modules/semver/package.json | 55 + .../cordova/node_modules/semver/range.bnf | 16 + .../cordova/node_modules/semver/semver.js | 1324 +++ .../node_modules/shelljs/.documentup.json | 6 + .../cordova/node_modules/shelljs/.jshintrc | 7 + .../cordova/node_modules/shelljs/.npmignore | 2 + .../cordova/node_modules/shelljs/.travis.yml | 6 + .../cordova/node_modules/shelljs/LICENSE | 26 + .../cordova/node_modules/shelljs/README.md | 579 ++ .../cordova/node_modules/shelljs/RELEASE.md | 9 + .../cordova/node_modules/shelljs/bin/shjs | 51 + .../cordova/node_modules/shelljs/global.js | 3 + .../cordova/node_modules/shelljs/make.js | 56 + .../cordova/node_modules/shelljs/package.json | 67 + .../shelljs/scripts/generate-docs.js | 21 + .../node_modules/shelljs/scripts/run-tests.js | 50 + .../cordova/node_modules/shelljs/shell.js | 159 + .../cordova/node_modules/shelljs/src/cat.js | 43 + .../cordova/node_modules/shelljs/src/cd.js | 19 + .../cordova/node_modules/shelljs/src/chmod.js | 208 + .../node_modules/shelljs/src/common.js | 203 + .../cordova/node_modules/shelljs/src/cp.js | 204 + .../cordova/node_modules/shelljs/src/dirs.js | 191 + .../cordova/node_modules/shelljs/src/echo.js | 20 + .../cordova/node_modules/shelljs/src/error.js | 10 + .../cordova/node_modules/shelljs/src/exec.js | 216 + .../cordova/node_modules/shelljs/src/find.js | 51 + .../cordova/node_modules/shelljs/src/grep.js | 52 + .../cordova/node_modules/shelljs/src/ln.js | 53 + .../cordova/node_modules/shelljs/src/ls.js | 126 + .../cordova/node_modules/shelljs/src/mkdir.js | 68 + .../cordova/node_modules/shelljs/src/mv.js | 80 + .../cordova/node_modules/shelljs/src/popd.js | 1 + .../cordova/node_modules/shelljs/src/pushd.js | 1 + .../cordova/node_modules/shelljs/src/pwd.js | 11 + .../cordova/node_modules/shelljs/src/rm.js | 163 + .../cordova/node_modules/shelljs/src/sed.js | 43 + .../node_modules/shelljs/src/tempdir.js | 56 + .../cordova/node_modules/shelljs/src/test.js | 85 + .../cordova/node_modules/shelljs/src/to.js | 29 + .../cordova/node_modules/shelljs/src/toEnd.js | 29 + .../cordova/node_modules/shelljs/src/which.js | 83 + .../cordova/node_modules/underscore/LICENSE | 23 + .../cordova/node_modules/underscore/README.md | 28 + .../node_modules/underscore/package.json | 82 + .../node_modules/underscore/underscore-min.js | 5 + .../underscore/underscore-min.js.map | 1 + .../node_modules/underscore/underscore.js | 1692 ++++ .../cordova/node_modules/unorm/LICENSE.md | 42 + .../cordova/node_modules/unorm/README.md | 118 + .../cordova/node_modules/unorm/lib/unorm.js | 442 + .../cordova/node_modules/unorm/package.json | 73 + .../cordova/node_modules/wrappy/LICENSE | 15 + .../cordova/node_modules/wrappy/README.md | 36 + .../cordova/node_modules/wrappy/package.json | 60 + .../cordova/node_modules/wrappy/wrappy.js | 33 + .../node_modules/xmlbuilder/.npmignore | 5 + .../node_modules/xmlbuilder/CHANGELOG.md | 395 + .../cordova/node_modules/xmlbuilder/LICENSE | 21 + .../cordova/node_modules/xmlbuilder/README.md | 85 + .../node_modules/xmlbuilder/lib/Utility.js | 139 + .../xmlbuilder/lib/XMLAttribute.js | 31 + .../node_modules/xmlbuilder/lib/XMLCData.js | 32 + .../node_modules/xmlbuilder/lib/XMLComment.js | 32 + .../xmlbuilder/lib/XMLDTDAttList.js | 50 + .../xmlbuilder/lib/XMLDTDElement.js | 35 + .../xmlbuilder/lib/XMLDTDEntity.js | 56 + .../xmlbuilder/lib/XMLDTDNotation.js | 37 + .../xmlbuilder/lib/XMLDeclaration.js | 40 + .../node_modules/xmlbuilder/lib/XMLDocType.js | 107 + .../xmlbuilder/lib/XMLDocument.js | 48 + .../xmlbuilder/lib/XMLDocumentCB.js | 402 + .../node_modules/xmlbuilder/lib/XMLElement.js | 111 + .../node_modules/xmlbuilder/lib/XMLNode.js | 432 + .../lib/XMLProcessingInstruction.js | 35 + .../node_modules/xmlbuilder/lib/XMLRaw.js | 32 + .../xmlbuilder/lib/XMLStreamWriter.js | 278 + .../xmlbuilder/lib/XMLStringWriter.js | 302 + .../xmlbuilder/lib/XMLStringifier.js | 192 + .../node_modules/xmlbuilder/lib/XMLText.js | 32 + .../xmlbuilder/lib/XMLWriterBase.js | 68 + .../node_modules/xmlbuilder/lib/index.js | 53 + .../node_modules/xmlbuilder/package.json | 66 + .../cordova/node_modules/xmldom/.npmignore | 5 + .../cordova/node_modules/xmldom/.travis.yml | 22 + .../cordova/node_modules/xmldom/LICENSE | 8 + .../node_modules/xmldom/__package__.js | 4 + .../cordova/node_modules/xmldom/changelog | 14 + .../node_modules/xmldom/component.json | 10 + .../cordova/node_modules/xmldom/dom-parser.js | 251 + .../cordova/node_modules/xmldom/dom.js | 1244 +++ .../cordova/node_modules/xmldom/package.json | 96 + .../cordova/node_modules/xmldom/readme.md | 219 + .../cordova/node_modules/xmldom/sax.js | 633 ++ .../platforms/android/cordova/run | 53 + .../platforms/android/cordova/run.bat | 26 + .../platforms/android/cordova/version | 29 + .../platforms/android/cordova/version.bat | 26 + .../android/nativeapiprovider.js | 36 + .../android/promptbasednativeapi.js | 35 + .../platform_www/cordova-js-src/exec.js | 286 + .../platform_www/cordova-js-src/platform.js | 125 + .../cordova-js-src/plugin/android/app.js | 108 + .../platforms/android/platform_www/cordova.js | 2189 +++++ .../android/platform_www/cordova_plugins.js | 9 + .../platforms/android/project.properties | 13 + .../platforms/android/settings.gradle | 4 + .../platforms/android/wrapper.gradle | 1 + asciiblaster-cordoba/plugins/android.json | 15 + .../cordova-plugin-whitelist/CONTRIBUTING.md | 37 + .../plugins/cordova-plugin-whitelist/LICENSE | 202 + .../plugins/cordova-plugin-whitelist/NOTICE | 5 + .../cordova-plugin-whitelist/README.md | 163 + .../cordova-plugin-whitelist/RELEASENOTES.md | 75 + .../cordova-plugin-whitelist/doc/de/README.md | 148 + .../cordova-plugin-whitelist/doc/es/README.md | 148 + .../cordova-plugin-whitelist/doc/fr/README.md | 148 + .../cordova-plugin-whitelist/doc/it/README.md | 148 + .../cordova-plugin-whitelist/doc/ja/README.md | 148 + .../cordova-plugin-whitelist/doc/ko/README.md | 148 + .../cordova-plugin-whitelist/doc/pl/README.md | 148 + .../cordova-plugin-whitelist/doc/zh/README.md | 148 + .../cordova-plugin-whitelist/package.json | 64 + .../cordova-plugin-whitelist/plugin.xml | 48 + .../src/android/WhitelistPlugin.java | 161 + asciiblaster-cordoba/plugins/fetch.json | 10 + asciiblaster-cordoba/releases | 1 + asciiblaster-cordoba/www/assets | 1 + asciiblaster-cordoba/www/index.html | 1 + 534 files changed, 100573 insertions(+) create mode 100644 asciiblaster-cordoba/config.xml create mode 100644 asciiblaster-cordoba/package-lock.json create mode 100644 asciiblaster-cordoba/package.json create mode 100644 asciiblaster-cordoba/platforms/android/.gitignore create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/AndroidManifest.xml create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/build.gradle create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/cordova.gradle create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/project.properties create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/BuildHelper.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackMap.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/Config.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPreferences.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaResourceApi.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebView.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewEngine.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewImpl.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CoreAndroid.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaClientCertRequest.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaCookieManager.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaHttpAuthHandler.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/LOG.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/NativeToJsMessageQueue.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/PermissionHelper.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/PluginEntry.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/PluginManager.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/PluginResult.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ResumeCallback.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/Whitelist.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemCookieManager.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemExposedJsApi.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebChromeClient.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebView.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java create mode 100644 asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewEngine.java create mode 100644 asciiblaster-cordoba/platforms/android/android.json create mode 100644 asciiblaster-cordoba/platforms/android/app/build.gradle create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/AndroidManifest.xml create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/css/ak.css create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/css/nitelite.css create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/css/sally.css create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/index.html create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/irssi.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/nopaint.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/brush.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/canvas.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/util.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shadetut.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/tips.txt create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.eot create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.svg create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.ttf create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.woff create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/bucket.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/dropper.gif create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/gray-dither.gif create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/tile.jpg create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/app.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/clipboard.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/color.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/nopaint.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/oktween.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/unicode.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/util.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/gfx.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/lex.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/matrix.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/brush.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/canvas.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/controls.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/custom.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/keys.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/letters.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/palette.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/selection.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/tool.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/transform.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/LICENCE create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/TODO create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/nativeapiprovider.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/promptbasednativeapi.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/exec.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/platform.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/plugin/android/app.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova_plugins.js create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/index.html create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/java/com/lalbornoz/asciiblaster/MainActivity.java create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/java/org/apache/cordova/whitelist/WhitelistPlugin.java create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-hdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-ldpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-mdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xhdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xxhdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xxxhdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-hdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-ldpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-mdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xhdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xxhdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xxxhdpi/screen.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-hdpi/icon.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-ldpi/icon.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-mdpi/icon.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xhdpi/icon.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xxhdpi/icon.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xxxhdpi/icon.png create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/values/strings.xml create mode 100644 asciiblaster-cordoba/platforms/android/app/src/main/res/xml/config.xml create mode 100644 asciiblaster-cordoba/platforms/android/build.gradle create mode 100644 asciiblaster-cordoba/platforms/android/cordova/Api.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/android_sdk_version create mode 100644 asciiblaster-cordoba/platforms/android/cordova/android_sdk_version.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/build create mode 100644 asciiblaster-cordoba/platforms/android/cordova/build.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/check_reqs create mode 100644 asciiblaster-cordoba/platforms/android/cordova/check_reqs.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/clean create mode 100644 asciiblaster-cordoba/platforms/android/cordova/clean.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/defaults.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/Adb.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/AndroidManifest.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/AndroidProject.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/AndroidStudio.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/android_sdk.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/build.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/builders/GenericBuilder.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/builders/GradleBuilder.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/builders/StudioBuilder.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/builders/builders.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/check_reqs.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/device.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/emulator.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/getASPath.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/install-device create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/install-device.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/list-devices create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/list-devices.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/log.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/plugin-build.gradle create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/pluginHandlers.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/prepare.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/retry.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/run.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator create mode 100644 asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/log create mode 100644 asciiblaster-cordoba/platforms/android/cordova/log.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/loggingHelper.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt.cmd create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver.cmd create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs.cmd create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/abbrev.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintrc create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/tests/index.test.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.jshintrc create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/History.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/beep/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/clear/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/cursorPosition.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/progress/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/lib/ansi.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/lib/newlines.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/LICENSE.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/base64js.min.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/big-data.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/convert.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/url-safe.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.d.ts create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.min.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/bower.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/tsconfig.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/bplistParser.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/airplay.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/iTunes-small.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/parseTest.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/sample1.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/sample2.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/uid.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/utf16.bplist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/utf16_chinese.plist create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/README.markdown create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/test/map.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintrc.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.ratignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/RELEASENOTES.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/appveyor.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/cordova-common.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ActionStack.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/munge-util.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigParser/ConfigParser.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaCheck.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaError.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaLogger.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/FileUpdater.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PlatformJson.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfo.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/events.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/superspawn.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/addProperty.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/plist-helpers.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/xml-helpers.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/tests/test.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/CHANGES.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/LICENSE.txt create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/Makefile create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/NOTICE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/constants.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementpath.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementtree.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/errors.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parser.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/sax.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/sprintf.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/treebuilder.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/utils.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml1.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml2.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/test-simple.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/common.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/glob.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/sync.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/inflight.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits_browser.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/minimatch.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/bin/nopt.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/examples/my-program.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/lib/nopt.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/test/basic.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/once/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/once/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/once/once.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/once/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/license create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/readme.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.jshintrc create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/History.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/Makefile create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/dist/plist-build.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/dist/plist-parse.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/dist/plist.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/examples/browser/index.html create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/lib/build.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/lib/parse.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/README.markdown create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/play-ground.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/q/CHANGES.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/q/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/q/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/q/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/q/q.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/q/queue.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/AUTHORS create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/big-not-pretty.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/example.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/get-products.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/hello-world.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/not-pretty.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/pretty-print.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/shopping.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/strict.dtd create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/switch-bench.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/test.html create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/test.xml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/lib/sax.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/buffer-overrun.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/cdata-chunked.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/cdata-end-split.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/cdata-fake-end.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/cdata-multiple.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/cdata.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/issue-23.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/issue-30.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/issue-35.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/issue-47.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/issue-49.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/parser-position.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/script.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child-strict.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-tag.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/stray-ending.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/trailing-non-whitespace.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/unquoted.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-issue-41.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-rebinding.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-strict.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-unbound.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-redefine.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/bin/semver create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/range.bnf create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/semver.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.documentup.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.jshintrc create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/RELEASE.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/bin/shjs create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/global.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/make.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/shell.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cat.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cd.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/chmod.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/common.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cp.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/dirs.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/echo.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/error.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/exec.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/find.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/grep.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ln.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ls.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mkdir.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mv.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/popd.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pushd.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pwd.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/rm.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/sed.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/tempdir.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/test.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/to.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/toEnd.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/which.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js.map create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/LICENSE.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/lib/unorm.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/wrappy.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/CHANGELOG.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/README.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/Utility.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLAttribute.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLCData.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLComment.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDAttList.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDElement.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDEntity.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDNotation.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDeclaration.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocType.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocument.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocumentCB.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLElement.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLNode.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLRaw.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStreamWriter.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringWriter.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringifier.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLText.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLWriterBase.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/index.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.npmignore create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.travis.yml create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/LICENSE create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/__package__.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/changelog create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/component.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom-parser.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/package.json create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/readme.md create mode 100644 asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/sax.js create mode 100644 asciiblaster-cordoba/platforms/android/cordova/run create mode 100644 asciiblaster-cordoba/platforms/android/cordova/run.bat create mode 100644 asciiblaster-cordoba/platforms/android/cordova/version create mode 100644 asciiblaster-cordoba/platforms/android/cordova/version.bat create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova-js-src/android/nativeapiprovider.js create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova-js-src/android/promptbasednativeapi.js create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova-js-src/exec.js create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova-js-src/platform.js create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova-js-src/plugin/android/app.js create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova.js create mode 100644 asciiblaster-cordoba/platforms/android/platform_www/cordova_plugins.js create mode 100644 asciiblaster-cordoba/platforms/android/project.properties create mode 100644 asciiblaster-cordoba/platforms/android/settings.gradle create mode 100644 asciiblaster-cordoba/platforms/android/wrapper.gradle create mode 100644 asciiblaster-cordoba/plugins/android.json create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/CONTRIBUTING.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/LICENSE create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/NOTICE create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/RELEASENOTES.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/de/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/es/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/fr/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/it/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/ja/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/ko/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/pl/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/doc/zh/README.md create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/package.json create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/plugin.xml create mode 100644 asciiblaster-cordoba/plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java create mode 100644 asciiblaster-cordoba/plugins/fetch.json create mode 120000 asciiblaster-cordoba/releases create mode 120000 asciiblaster-cordoba/www/assets create mode 120000 asciiblaster-cordoba/www/index.html diff --git a/.gitignore b/.gitignore index e8e64d5..86beef4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ *.sw[op] +asciiblaster-cordoba/node_modules +asciiblaster-cordoba/platforms/android/.gradle +asciiblaster-cordoba/platforms/android/app/build +asciiblaster-cordoba/platforms/android/CordovaLib/build asciiblaster-nw/releases/* diff --git a/asciiblaster-cordoba/config.xml b/asciiblaster-cordoba/config.xml new file mode 100644 index 0000000..d80625b --- /dev/null +++ b/asciiblaster-cordoba/config.xml @@ -0,0 +1,27 @@ + + + + Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>, based on work by JOLLO NET NA + + + asciiblaster (standalone Apache Córdoba app) + + asciiblaster-cordoba + + + + + + + + + + + + + + + + + + diff --git a/asciiblaster-cordoba/package-lock.json b/asciiblaster-cordoba/package-lock.json new file mode 100644 index 0000000..121e22a --- /dev/null +++ b/asciiblaster-cordoba/package-lock.json @@ -0,0 +1,218 @@ +{ + "name": "asciiblaster-cordoba", + "version": "1.0.3", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "cordova-android": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-7.1.3.tgz", + "integrity": "sha512-nXGtnMS17EX+AIJllHflj3lwcYKl00KwM9No/6IINhOs0gJ5hAg1I2JlCzDlkUiWwSr2nmIOAYGeQmxnkP2s2Q==", + "requires": { + "abbrev": "*", + "android-versions": "1.3.0", + "ansi": "*", + "balanced-match": "*", + "base64-js": "1.2.0", + "big-integer": "1.6.32", + "bplist-parser": "*", + "brace-expansion": "*", + "concat-map": "*", + "cordova-common": "2.2.5", + "cordova-registry-mapper": "*", + "elementtree": "0.1.6", + "glob": "5.0.15", + "inflight": "*", + "inherits": "*", + "minimatch": "*", + "nopt": "3.0.1", + "once": "*", + "path-is-absolute": "1.0.1", + "plist": "2.1.0", + "properties-parser": "0.2.3", + "q": "1.4.1", + "sax": "0.3.5", + "semver": "5.5.0", + "shelljs": "0.5.3", + "underscore": "*", + "unorm": "*", + "wrappy": "*", + "xmlbuilder": "8.2.2", + "xmldom": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "android-versions": { + "version": "1.3.0", + "bundled": true, + "requires": { + "semver": "^5.4.1" + } + }, + "ansi": { + "version": "0.3.1", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "base64-js": { + "version": "1.2.0", + "bundled": true + }, + "big-integer": { + "version": "1.6.32", + "bundled": true + }, + "bplist-parser": { + "version": "0.1.1", + "bundled": true, + "requires": { + "big-integer": "^1.6.7" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "cordova-common": { + "version": "2.2.5", + "bundled": true, + "requires": { + "ansi": "^0.3.1", + "bplist-parser": "^0.1.0", + "cordova-registry-mapper": "^1.1.8", + "elementtree": "0.1.6", + "glob": "^5.0.13", + "minimatch": "^3.0.0", + "plist": "^2.1.0", + "q": "^1.4.1", + "shelljs": "^0.5.3", + "underscore": "^1.8.3", + "unorm": "^1.3.3" + } + }, + "cordova-registry-mapper": { + "version": "1.1.15", + "bundled": true + }, + "elementtree": { + "version": "0.1.6", + "bundled": true, + "requires": { + "sax": "0.3.5" + } + }, + "glob": { + "version": "5.0.15", + "bundled": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nopt": { + "version": "3.0.1", + "bundled": true, + "requires": { + "abbrev": "1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "plist": { + "version": "2.1.0", + "bundled": true, + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.x" + } + }, + "properties-parser": { + "version": "0.2.3", + "bundled": true + }, + "q": { + "version": "1.4.1", + "bundled": true + }, + "sax": { + "version": "0.3.5", + "bundled": true + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "shelljs": { + "version": "0.5.3", + "bundled": true + }, + "underscore": { + "version": "1.9.1", + "bundled": true + }, + "unorm": { + "version": "1.4.1", + "bundled": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "xmlbuilder": { + "version": "8.2.2", + "bundled": true + }, + "xmldom": { + "version": "0.1.27", + "bundled": true + } + } + } + } +} diff --git a/asciiblaster-cordoba/package.json b/asciiblaster-cordoba/package.json new file mode 100644 index 0000000..4cc9276 --- /dev/null +++ b/asciiblaster-cordoba/package.json @@ -0,0 +1,34 @@ +{ + "author": "Lucio Andrés Illanes Albornoz , based on work by JOLLO NET NA", + "bugs": { + "url": "https://github.com/lalbornoz/asciiblaster/issues" + }, + "cordova": { + "plugins": { + "cordova-plugin-whitelist": {} + }, + "platforms": [ + "android" + ] + }, + "dependencies": { + "cordova-android": "^7.1.3", + "cordova-plugin-whitelist": "^1.3.3" + }, + "description": "asciiblaster (standalone Apache Córdoba app)", + "directories": { + "www": "www" + }, + "homepage": "https://github.com/lalbornoz/asciiblaster#readme", + "license": "Jollo LNT license ", + "main": "www/index.html", + "name": "asciiblaster-cordoba", + "repository": { + "type": "git", + "url": "git+https://github.com/lalbornoz/asciiblaster.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "1.0.3" +} diff --git a/asciiblaster-cordoba/platforms/android/.gitignore b/asciiblaster-cordoba/platforms/android/.gitignore new file mode 100644 index 0000000..6e52445 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/.gitignore @@ -0,0 +1,14 @@ +# Non-project-specific build files: +build.xml +local.properties +/gradlew +/gradlew.bat +/gradle +# Ant builds +ant-build +ant-gen +# Eclipse builds +gen +out +# Gradle builds +/build diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/AndroidManifest.xml b/asciiblaster-cordoba/platforms/android/CordovaLib/AndroidManifest.xml new file mode 100644 index 0000000..1625b89 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/build.gradle b/asciiblaster-cordoba/platforms/android/CordovaLib/build.gradle new file mode 100644 index 0000000..aa5f147 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/build.gradle @@ -0,0 +1,137 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +ext { + apply from: 'cordova.gradle' + cdvCompileSdkVersion = privateHelpers.getProjectTarget() + cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools() +} + +buildscript { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + } +} + +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'com.jfrog.bintray' + +group = 'org.apache.cordova' +version = '7.1.3' + +android { + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + publishNonDefault true + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + } + + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/NOTICE' + } +} + +install { + repositories.mavenInstaller { + pom { + project { + packaging 'aar' + name 'Cordova' + url 'https://cordova.apache.org' + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id 'stevengill' + name 'Steve Gill' + } + } + scm { + connection 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git' + developerConnection 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git' + url 'https://git-wip-us.apache.org/repos/asf?p=cordova-android' + + } + } + } + } +} + +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +artifacts { + archives sourcesJar +} + +bintray { + user = System.getenv('BINTRAY_USER') + key = System.getenv('BINTRAY_KEY') + configurations = ['archives'] + pkg { + repo = 'maven' + name = 'cordova-android' + userOrg = 'cordova' + licenses = ['Apache-2.0'] + vcsUrl = 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git' + websiteUrl = 'https://cordova.apache.org' + issueTrackerUrl = 'https://issues.apache.org/jira/browse/CB' + publicDownloadNumbers = true + licenses = ['Apache-2.0'] + labels = ['android', 'cordova', 'phonegap'] + version { + name = '7.1.3' + released = new Date() + vcsTag = '7.1.3' + } + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/cordova.gradle b/asciiblaster-cordoba/platforms/android/CordovaLib/cordova.gradle new file mode 100644 index 0000000..6c6819a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/cordova.gradle @@ -0,0 +1,205 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +import java.util.regex.Pattern +import groovy.swing.SwingBuilder + +String doEnsureValueExists(filePath, props, key) { + if (props.get(key) == null) { + throw new GradleException(filePath + ': Missing key required "' + key + '"') + } + return props.get(key) +} + +String doGetProjectTarget() { + def props = new Properties() + def propertiesFile = 'project.properties'; + if(!(file(propertiesFile).exists())) { + propertiesFile = '../project.properties'; + } + file(propertiesFile).withReader { reader -> + props.load(reader) + } + return doEnsureValueExists('project.properties', props, 'target') +} + +String[] getAvailableBuildTools() { + def buildToolsDir = new File(getAndroidSdkDir(), "build-tools") + buildToolsDir.list() + .findAll { it ==~ /[0-9.]+/ } + .sort { a, b -> compareVersions(b, a) } +} + +String doFindLatestInstalledBuildTools(String minBuildToolsVersion) { + def availableBuildToolsVersions + try { + availableBuildToolsVersions = getAvailableBuildTools() + } catch (e) { + println "An exception occurred while trying to find the Android build tools." + throw e + } + if (availableBuildToolsVersions.length > 0) { + def highestBuildToolsVersion = availableBuildToolsVersions[0] + if (compareVersions(highestBuildToolsVersion, minBuildToolsVersion) < 0) { + throw new RuntimeException( + "No usable Android build tools found. Highest installed version is " + + highestBuildToolsVersion + "; minimum version required is " + + minBuildToolsVersion + ".") + } + highestBuildToolsVersion + } else { + throw new RuntimeException( + "No installed build tools found. Install the Android build tools version " + + minBuildToolsVersion + " or higher.") + } +} + +// Return the first non-zero result of subtracting version list elements +// pairwise. If they are all identical, return the difference in length of +// the two lists. +int compareVersionList(Collection aParts, Collection bParts) { + def pairs = ([aParts, bParts]).transpose() + pairs.findResult(aParts.size()-bParts.size()) {it[0] - it[1] != 0 ? it[0] - it[1] : null} +} + +// Compare two version strings, such as "19.0.0" and "18.1.1.0". If all matched +// elements are identical, the longer version is the largest by this method. +// Examples: +// "19.0.0" > "19" +// "19.0.1" > "19.0.0" +// "19.1.0" > "19.0.1" +// "19" > "18.999.999" +int compareVersions(String a, String b) { + def aParts = a.tokenize('.').collect {it.toInteger()} + def bParts = b.tokenize('.').collect {it.toInteger()} + compareVersionList(aParts, bParts) +} + +String getAndroidSdkDir() { + def rootDir = project.rootDir + def androidSdkDir = null + String envVar = System.getenv("ANDROID_HOME") + def localProperties = new File(rootDir, 'local.properties') + String systemProperty = System.getProperty("android.home") + if (envVar != null) { + androidSdkDir = envVar + } else if (localProperties.exists()) { + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + def sdkDirProp = properties.getProperty('sdk.dir') + if (sdkDirProp != null) { + androidSdkDir = sdkDirProp + } else { + sdkDirProp = properties.getProperty('android.dir') + if (sdkDirProp != null) { + androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath() + } + } + } + if (androidSdkDir == null && systemProperty != null) { + androidSdkDir = systemProperty + } + if (androidSdkDir == null) { + throw new RuntimeException( + "Unable to determine Android SDK directory.") + } + androidSdkDir +} + +def doExtractIntFromManifest(name) { + def manifestFile = file(android.sourceSets.main.manifest.srcFile) + def pattern = Pattern.compile(name + "=\"(\\d+)\"") + def matcher = pattern.matcher(manifestFile.getText()) + matcher.find() + return new BigInteger(matcher.group(1)) +} + +def doExtractStringFromManifest(name) { + def manifestFile = file(android.sourceSets.main.manifest.srcFile) + def pattern = Pattern.compile(name + "=\"(\\S+)\"") + def matcher = pattern.matcher(manifestFile.getText()) + matcher.find() + return matcher.group(1) +} + +def doPromptForPassword(msg) { + if (System.console() == null) { + def ret = null + new SwingBuilder().edt { + dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) { + vbox { + label(text: msg) + def input = passwordField() + button(defaultButton: true, text: 'OK', actionPerformed: { + ret = input.password; + dispose(); + }) + } + } + } + if (!ret) { + throw new GradleException('User canceled build') + } + return new String(ret) + } else { + return System.console().readPassword('\n' + msg); + } +} + +def doGetConfigXml() { + def xml = file("src/main/res/xml/config.xml").getText() + // Disable namespace awareness since Cordova doesn't use them properly + return new XmlParser(false, false).parseText(xml) +} + +def doGetConfigPreference(name, defaultValue) { + name = name.toLowerCase() + def root = doGetConfigXml() + + def ret = defaultValue + root.preference.each { it -> + def attrName = it.attribute("name") + if (attrName && attrName.toLowerCase() == name) { + ret = it.attribute("value") + } + } + return ret +} + +// Properties exported here are visible to all plugins. +ext { + // These helpers are shared, but are not guaranteed to be stable / unchanged. + privateHelpers = {} + privateHelpers.getProjectTarget = { doGetProjectTarget() } + privateHelpers.findLatestInstalledBuildTools = { doFindLatestInstalledBuildTools('19.1.0') } + privateHelpers.extractIntFromManifest = { name -> doExtractIntFromManifest(name) } + privateHelpers.extractStringFromManifest = { name -> doExtractStringFromManifest(name) } + privateHelpers.promptForPassword = { msg -> doPromptForPassword(msg) } + privateHelpers.ensureValueExists = { filePath, props, key -> doEnsureValueExists(filePath, props, key) } + + // These helpers can be used by plugins / projects and will not change. + cdvHelpers = {} + // Returns a XmlParser for the config.xml. Added in 4.1.0. + cdvHelpers.getConfigXml = { doGetConfigXml() } + // Returns the value for the desired . Added in 4.1.0. + cdvHelpers.getConfigPreference = { name, defaultValue -> doGetConfigPreference(name, defaultValue) } +} + diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/project.properties b/asciiblaster-cordoba/platforms/android/CordovaLib/project.properties new file mode 100644 index 0000000..0a372ee --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/project.properties @@ -0,0 +1,16 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +split.density=false +# Project target. +target=android-27 +apk-configurations= +renderscript.opt.level=O0 +android.library=true diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java new file mode 100644 index 0000000..d3a231a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java @@ -0,0 +1,69 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +/** + * The Class AuthenticationToken defines the userName and password to be used for authenticating a web resource + */ +public class AuthenticationToken { + private String userName; + private String password; + + /** + * Gets the user name. + * + * @return the user name + */ + public String getUserName() { + return userName; + } + + /** + * Sets the user name. + * + * @param userName + * the new user name + */ + public void setUserName(String userName) { + this.userName = userName; + } + + /** + * Gets the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Sets the password. + * + * @param password + * the new password + */ + public void setPassword(String password) { + this.password = password; + } + + + + +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/BuildHelper.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/BuildHelper.java new file mode 100644 index 0000000..6d9daa4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/BuildHelper.java @@ -0,0 +1,70 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +/* + * This is a utility class that allows us to get the BuildConfig variable, which is required + * for the use of different providers. This is not guaranteed to work, and it's better for this + * to be set in the build step in config.xml + * + */ + +import android.app.Activity; +import android.content.Context; + +import java.lang.reflect.Field; + + +public class BuildHelper { + + + private static String TAG="BuildHelper"; + + /* + * This needs to be implemented if you wish to use the Camera Plugin or other plugins + * that read the Build Configuration. + * + * Thanks to Phil@Medtronic and Graham Borland for finding the answer and posting it to + * StackOverflow. This is annoying as hell! However, this method does not work with + * ProGuard, and you should use the config.xml to define the application_id + * + */ + + public static Object getBuildConfigValue(Context ctx, String key) + { + try + { + Class clazz = Class.forName(ctx.getPackageName() + ".BuildConfig"); + Field field = clazz.getField(key); + return field.get(null); + } catch (ClassNotFoundException e) { + LOG.d(TAG, "Unable to get the BuildConfig, is this built with ANT?"); + e.printStackTrace(); + } catch (NoSuchFieldException e) { + LOG.d(TAG, key + " is not a valid field. Check your build.gradle"); + } catch (IllegalAccessException e) { + LOG.d(TAG, "Illegal Access Exception: Let's print a stack trace."); + e.printStackTrace(); + } + + return null; + } + +} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java new file mode 100644 index 0000000..4336386 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java @@ -0,0 +1,142 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import org.json.JSONArray; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginResult; +import org.json.JSONObject; + +public class CallbackContext { + private static final String LOG_TAG = "CordovaPlugin"; + + private String callbackId; + private CordovaWebView webView; + protected boolean finished; + private int changingThreads; + + public CallbackContext(String callbackId, CordovaWebView webView) { + this.callbackId = callbackId; + this.webView = webView; + } + + public boolean isFinished() { + return finished; + } + + public boolean isChangingThreads() { + return changingThreads > 0; + } + + public String getCallbackId() { + return callbackId; + } + + public void sendPluginResult(PluginResult pluginResult) { + synchronized (this) { + if (finished) { + LOG.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage()); + return; + } else { + finished = !pluginResult.getKeepCallback(); + } + } + webView.sendPluginResult(pluginResult, callbackId); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(JSONObject message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(String message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(JSONArray message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(byte[] message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(int message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + */ + public void success() { + sendPluginResult(new PluginResult(PluginResult.Status.OK)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(JSONObject message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(String message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(int message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackMap.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackMap.java new file mode 100644 index 0000000..050daa0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CallbackMap.java @@ -0,0 +1,65 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import android.util.Pair; +import android.util.SparseArray; + +/** + * Provides a collection that maps unique request codes to CordovaPlugins and Integers. + * Used to ensure that when plugins make requests for runtime permissions, those requests do not + * collide with requests from other plugins that use the same request code value. + */ +public class CallbackMap { + private int currentCallbackId = 0; + private SparseArray> callbacks; + + public CallbackMap() { + this.callbacks = new SparseArray>(); + } + + /** + * Stores a CordovaPlugin and request code and returns a new unique request code to use + * in a permission request. + * + * @param receiver The plugin that is making the request + * @param requestCode The original request code used by the plugin + * @return A unique request code that can be used to retrieve this callback + * with getAndRemoveCallback() + */ + public synchronized int registerCallback(CordovaPlugin receiver, int requestCode) { + int mappedId = this.currentCallbackId++; + callbacks.put(mappedId, new Pair(receiver, requestCode)); + return mappedId; + } + + /** + * Retrieves and removes a callback stored in the map using the mapped request code + * obtained from registerCallback() + * + * @param mappedId The request code obtained from registerCallback() + * @return The CordovaPlugin and orignal request code that correspond to the + * given mappedCode + */ + public synchronized Pair getAndRemoveCallback(int mappedId) { + Pair callback = callbacks.get(mappedId); + callbacks.remove(mappedId); + return callback; + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/Config.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/Config.java new file mode 100644 index 0000000..0739795 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/Config.java @@ -0,0 +1,71 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +import java.util.List; + +import android.app.Activity; + +@Deprecated // Use Whitelist, CordovaPrefences, etc. directly. +public class Config { + private static final String TAG = "Config"; + + static ConfigXmlParser parser; + + private Config() { + } + + public static void init(Activity action) { + parser = new ConfigXmlParser(); + parser.parse(action); + //TODO: Add feature to bring this back. Some preferences should be overridden by intents, but not all + parser.getPreferences().setPreferencesBundle(action.getIntent().getExtras()); + } + + // Intended to be used for testing only; creates an empty configuration. + public static void init() { + if (parser == null) { + parser = new ConfigXmlParser(); + } + } + + public static String getStartUrl() { + if (parser == null) { + return "file:///android_asset/www/index.html"; + } + return parser.getLaunchUrl(); + } + + public static String getErrorUrl() { + return parser.getPreferences().getString("errorurl", null); + } + + public static List getPluginEntries() { + return parser.getPluginEntries(); + } + + public static CordovaPreferences getPreferences() { + return parser.getPreferences(); + } + + public static boolean isInitialized() { + return parser != null; + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java new file mode 100644 index 0000000..01a97f2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java @@ -0,0 +1,145 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.content.Context; + +public class ConfigXmlParser { + private static String TAG = "ConfigXmlParser"; + + private String launchUrl = "file:///android_asset/www/index.html"; + private CordovaPreferences prefs = new CordovaPreferences(); + private ArrayList pluginEntries = new ArrayList(20); + + public CordovaPreferences getPreferences() { + return prefs; + } + + public ArrayList getPluginEntries() { + return pluginEntries; + } + + public String getLaunchUrl() { + return launchUrl; + } + + public void parse(Context action) { + // First checking the class namespace for config.xml + int id = action.getResources().getIdentifier("config", "xml", action.getClass().getPackage().getName()); + if (id == 0) { + // If we couldn't find config.xml there, we'll look in the namespace from AndroidManifest.xml + id = action.getResources().getIdentifier("config", "xml", action.getPackageName()); + if (id == 0) { + LOG.e(TAG, "res/xml/config.xml is missing!"); + return; + } + } + parse(action.getResources().getXml(id)); + } + + boolean insideFeature = false; + String service = "", pluginClass = "", paramType = ""; + boolean onload = false; + + public void parse(XmlPullParser xml) { + int eventType = -1; + + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + handleStartTag(xml); + } + else if (eventType == XmlPullParser.END_TAG) + { + handleEndTag(xml); + } + try { + eventType = xml.next(); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public void handleStartTag(XmlPullParser xml) { + String strNode = xml.getName(); + if (strNode.equals("feature")) { + //Check for supported feature sets aka. plugins (Accelerometer, Geolocation, etc) + //Set the bit for reading params + insideFeature = true; + service = xml.getAttributeValue(null, "name"); + } + else if (insideFeature && strNode.equals("param")) { + paramType = xml.getAttributeValue(null, "name"); + if (paramType.equals("service")) // check if it is using the older service param + service = xml.getAttributeValue(null, "value"); + else if (paramType.equals("package") || paramType.equals("android-package")) + pluginClass = xml.getAttributeValue(null,"value"); + else if (paramType.equals("onload")) + onload = "true".equals(xml.getAttributeValue(null, "value")); + } + else if (strNode.equals("preference")) { + String name = xml.getAttributeValue(null, "name").toLowerCase(Locale.ENGLISH); + String value = xml.getAttributeValue(null, "value"); + prefs.set(name, value); + } + else if (strNode.equals("content")) { + String src = xml.getAttributeValue(null, "src"); + if (src != null) { + setStartUrl(src); + } + } + } + + public void handleEndTag(XmlPullParser xml) { + String strNode = xml.getName(); + if (strNode.equals("feature")) { + pluginEntries.add(new PluginEntry(service, pluginClass, onload)); + + service = ""; + pluginClass = ""; + insideFeature = false; + onload = false; + } + } + + private void setStartUrl(String src) { + Pattern schemeRegex = Pattern.compile("^[a-z-]+://"); + Matcher matcher = schemeRegex.matcher(src); + if (matcher.find()) { + launchUrl = src; + } else { + if (src.charAt(0) == '/') { + src = src.substring(1); + } + launchUrl = "file:///android_asset/www/" + src; + } + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java new file mode 100644 index 0000000..dbbb48f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java @@ -0,0 +1,519 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import java.util.ArrayList; +import java.util.Locale; + +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.Activity; +import android.app.AlertDialog; +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Color; +import android.media.AudioManager; +import android.os.Build; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; + +/** + * This class is the main Android activity that represents the Cordova + * application. It should be extended by the user to load the specific + * html file that contains the application. + * + * As an example: + * + *
+ *     package org.apache.cordova.examples;
+ *
+ *     import android.os.Bundle;
+ *     import org.apache.cordova.*;
+ *
+ *     public class Example extends CordovaActivity {
+ *       @Override
+ *       public void onCreate(Bundle savedInstanceState) {
+ *         super.onCreate(savedInstanceState);
+ *         super.init();
+ *         // Load your application
+ *         loadUrl(launchUrl);
+ *       }
+ *     }
+ * 
+ * + * Cordova xml configuration: Cordova uses a configuration file at + * res/xml/config.xml to specify its settings. See "The config.xml File" + * guide in cordova-docs at http://cordova.apache.org/docs for the documentation + * for the configuration. The use of the set*Property() methods is + * deprecated in favor of the config.xml file. + * + */ +public class CordovaActivity extends Activity { + public static String TAG = "CordovaActivity"; + + // The webview for our app + protected CordovaWebView appView; + + private static int ACTIVITY_STARTING = 0; + private static int ACTIVITY_RUNNING = 1; + private static int ACTIVITY_EXITING = 2; + + // Keep app running when pause is received. (default = true) + // If true, then the JavaScript and native code continue to run in the background + // when another application (activity) is started. + protected boolean keepRunning = true; + + // Flag to keep immersive mode if set to fullscreen + protected boolean immersiveMode; + + // Read from config.xml: + protected CordovaPreferences preferences; + protected String launchUrl; + protected ArrayList pluginEntries; + protected CordovaInterfaceImpl cordovaInterface; + + /** + * Called when the activity is first created. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + // need to activate preferences before super.onCreate to avoid "requestFeature() must be called before adding content" exception + loadConfig(); + + String logLevel = preferences.getString("loglevel", "ERROR"); + LOG.setLogLevel(logLevel); + + LOG.i(TAG, "Apache Cordova native platform version " + CordovaWebView.CORDOVA_VERSION + " is starting"); + LOG.d(TAG, "CordovaActivity.onCreate()"); + + if (!preferences.getBoolean("ShowTitle", false)) { + getWindow().requestFeature(Window.FEATURE_NO_TITLE); + } + + if (preferences.getBoolean("SetFullscreen", false)) { + LOG.d(TAG, "The SetFullscreen configuration is deprecated in favor of Fullscreen, and will be removed in a future version."); + preferences.set("Fullscreen", true); + } + if (preferences.getBoolean("Fullscreen", false)) { + // NOTE: use the FullscreenNotImmersive configuration key to set the activity in a REAL full screen + // (as was the case in previous cordova versions) + if (!preferences.getBoolean("FullscreenNotImmersive", false)) { + immersiveMode = true; + } else { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + } else { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + } + + super.onCreate(savedInstanceState); + + cordovaInterface = makeCordovaInterface(); + if (savedInstanceState != null) { + cordovaInterface.restoreInstanceState(savedInstanceState); + } + } + + protected void init() { + appView = makeWebView(); + createViews(); + if (!appView.isInitialized()) { + appView.init(cordovaInterface, pluginEntries, preferences); + } + cordovaInterface.onCordovaInit(appView.getPluginManager()); + + // Wire the hardware volume controls to control media if desired. + String volumePref = preferences.getString("DefaultVolumeStream", ""); + if ("media".equals(volumePref.toLowerCase(Locale.ENGLISH))) { + setVolumeControlStream(AudioManager.STREAM_MUSIC); + } + } + + @SuppressWarnings("deprecation") + protected void loadConfig() { + ConfigXmlParser parser = new ConfigXmlParser(); + parser.parse(this); + preferences = parser.getPreferences(); + preferences.setPreferencesBundle(getIntent().getExtras()); + launchUrl = parser.getLaunchUrl(); + pluginEntries = parser.getPluginEntries(); + Config.parser = parser; + } + + //Suppressing warnings in AndroidStudio + @SuppressWarnings({"deprecation", "ResourceType"}) + protected void createViews() { + //Why are we setting a constant as the ID? This should be investigated + appView.getView().setId(100); + appView.getView().setLayoutParams(new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + + setContentView(appView.getView()); + + if (preferences.contains("BackgroundColor")) { + try { + int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK); + // Background of activity: + appView.getView().setBackgroundColor(backgroundColor); + } + catch (NumberFormatException e){ + e.printStackTrace(); + } + } + + appView.getView().requestFocusFromTouch(); + } + + /** + * Construct the default web view object. + *

+ * Override this to customize the webview that is used. + */ + protected CordovaWebView makeWebView() { + return new CordovaWebViewImpl(makeWebViewEngine()); + } + + protected CordovaWebViewEngine makeWebViewEngine() { + return CordovaWebViewImpl.createEngine(this, preferences); + } + + protected CordovaInterfaceImpl makeCordovaInterface() { + return new CordovaInterfaceImpl(this) { + @Override + public Object onMessage(String id, Object data) { + // Plumb this to CordovaActivity.onMessage for backwards compatibility + return CordovaActivity.this.onMessage(id, data); + } + }; + } + + /** + * Load the url into the webview. + */ + public void loadUrl(String url) { + if (appView == null) { + init(); + } + + // If keepRunning + this.keepRunning = preferences.getBoolean("KeepRunning", true); + + appView.loadUrlIntoView(url, true); + } + + /** + * Called when the system is about to start resuming a previous activity. + */ + @Override + protected void onPause() { + super.onPause(); + LOG.d(TAG, "Paused the activity."); + + if (this.appView != null) { + // CB-9382 If there is an activity that started for result and main activity is waiting for callback + // result, we shoudn't stop WebView Javascript timers, as activity for result might be using them + boolean keepRunning = this.keepRunning || this.cordovaInterface.activityResultCallback != null; + this.appView.handlePause(keepRunning); + } + } + + /** + * Called when the activity receives a new intent + */ + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + //Forward to plugins + if (this.appView != null) + this.appView.onNewIntent(intent); + } + + /** + * Called when the activity will start interacting with the user. + */ + @Override + protected void onResume() { + super.onResume(); + LOG.d(TAG, "Resumed the activity."); + + if (this.appView == null) { + return; + } + // Force window to have focus, so application always + // receive user input. Workaround for some devices (Samsung Galaxy Note 3 at least) + this.getWindow().getDecorView().requestFocus(); + + this.appView.handleResume(this.keepRunning); + } + + /** + * Called when the activity is no longer visible to the user. + */ + @Override + protected void onStop() { + super.onStop(); + LOG.d(TAG, "Stopped the activity."); + + if (this.appView == null) { + return; + } + this.appView.handleStop(); + } + + /** + * Called when the activity is becoming visible to the user. + */ + @Override + protected void onStart() { + super.onStart(); + LOG.d(TAG, "Started the activity."); + + if (this.appView == null) { + return; + } + this.appView.handleStart(); + } + + /** + * The final call you receive before your activity is destroyed. + */ + @Override + public void onDestroy() { + LOG.d(TAG, "CordovaActivity.onDestroy()"); + super.onDestroy(); + + if (this.appView != null) { + appView.handleDestroy(); + } + } + + /** + * Called when view focus is changed + */ + @SuppressLint("InlinedApi") + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus && immersiveMode) { + final int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + + getWindow().getDecorView().setSystemUiVisibility(uiOptions); + } + } + + @SuppressLint("NewApi") + @Override + public void startActivityForResult(Intent intent, int requestCode, Bundle options) { + // Capture requestCode here so that it is captured in the setActivityResultCallback() case. + cordovaInterface.setActivityResultRequestCode(requestCode); + super.startActivityForResult(intent, requestCode, options); + } + + /** + * Called when an activity you launched exits, giving you the requestCode you started it with, + * the resultCode it returned, and any additional data from it. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + LOG.d(TAG, "Incoming Result. Request code = " + requestCode); + super.onActivityResult(requestCode, resultCode, intent); + cordovaInterface.onActivityResult(requestCode, resultCode, intent); + } + + /** + * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable). + * The errorCode parameter corresponds to one of the ERROR_* constants. + * + * @param errorCode The error code corresponding to an ERROR_* value. + * @param description A String describing the error. + * @param failingUrl The url that failed to load. + */ + public void onReceivedError(final int errorCode, final String description, final String failingUrl) { + final CordovaActivity me = this; + + // If errorUrl specified, then load it + final String errorUrl = preferences.getString("errorUrl", null); + if ((errorUrl != null) && (!failingUrl.equals(errorUrl)) && (appView != null)) { + // Load URL on UI thread + me.runOnUiThread(new Runnable() { + public void run() { + me.appView.showWebPage(errorUrl, false, true, null); + } + }); + } + // If not, then display error dialog + else { + final boolean exit = !(errorCode == WebViewClient.ERROR_HOST_LOOKUP); + me.runOnUiThread(new Runnable() { + public void run() { + if (exit) { + me.appView.getView().setVisibility(View.GONE); + me.displayError("Application Error", description + " (" + failingUrl + ")", "OK", exit); + } + } + }); + } + } + + /** + * Display an error dialog and optionally exit application. + */ + public void displayError(final String title, final String message, final String button, final boolean exit) { + final CordovaActivity me = this; + me.runOnUiThread(new Runnable() { + public void run() { + try { + AlertDialog.Builder dlg = new AlertDialog.Builder(me); + dlg.setMessage(message); + dlg.setTitle(title); + dlg.setCancelable(false); + dlg.setPositiveButton(button, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + if (exit) { + finish(); + } + } + }); + dlg.create(); + dlg.show(); + } catch (Exception e) { + finish(); + } + } + }); + } + + /* + * Hook in Cordova for menu plugins + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + if (appView != null) { + appView.getPluginManager().postMessage("onCreateOptionsMenu", menu); + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + if (appView != null) { + appView.getPluginManager().postMessage("onPrepareOptionsMenu", menu); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (appView != null) { + appView.getPluginManager().postMessage("onOptionsItemSelected", item); + } + return true; + } + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object or null + */ + public Object onMessage(String id, Object data) { + if ("onReceivedError".equals(id)) { + JSONObject d = (JSONObject) data; + try { + this.onReceivedError(d.getInt("errorCode"), d.getString("description"), d.getString("url")); + } catch (JSONException e) { + e.printStackTrace(); + } + } else if ("exit".equals(id)) { + finish(); + } + return null; + } + + protected void onSaveInstanceState(Bundle outState) { + cordovaInterface.onSaveInstanceState(outState); + super.onSaveInstanceState(outState); + } + + /** + * Called by the system when the device configuration changes while your activity is running. + * + * @param newConfig The new device configuration + */ + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (this.appView == null) { + return; + } + PluginManager pm = this.appView.getPluginManager(); + if (pm != null) { + pm.onConfigurationChanged(newConfig); + } + } + + /** + * Called by the system when the user grants permissions + * + * @param requestCode + * @param permissions + * @param grantResults + */ + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + try + { + cordovaInterface.onRequestPermissionResult(requestCode, permissions, grantResults); + } + catch (JSONException e) + { + LOG.d(TAG, "JSONException: Parameters fed into the method are not valid"); + e.printStackTrace(); + } + + } + +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java new file mode 100644 index 0000000..d40d26e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java @@ -0,0 +1,113 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.util.Base64; + +public class CordovaArgs { + private JSONArray baseArgs; + + public CordovaArgs(JSONArray args) { + this.baseArgs = args; + } + + + // Pass through the basics to the base args. + public Object get(int index) throws JSONException { + return baseArgs.get(index); + } + + public boolean getBoolean(int index) throws JSONException { + return baseArgs.getBoolean(index); + } + + public double getDouble(int index) throws JSONException { + return baseArgs.getDouble(index); + } + + public int getInt(int index) throws JSONException { + return baseArgs.getInt(index); + } + + public JSONArray getJSONArray(int index) throws JSONException { + return baseArgs.getJSONArray(index); + } + + public JSONObject getJSONObject(int index) throws JSONException { + return baseArgs.getJSONObject(index); + } + + public long getLong(int index) throws JSONException { + return baseArgs.getLong(index); + } + + public String getString(int index) throws JSONException { + return baseArgs.getString(index); + } + + + public Object opt(int index) { + return baseArgs.opt(index); + } + + public boolean optBoolean(int index) { + return baseArgs.optBoolean(index); + } + + public double optDouble(int index) { + return baseArgs.optDouble(index); + } + + public int optInt(int index) { + return baseArgs.optInt(index); + } + + public JSONArray optJSONArray(int index) { + return baseArgs.optJSONArray(index); + } + + public JSONObject optJSONObject(int index) { + return baseArgs.optJSONObject(index); + } + + public long optLong(int index) { + return baseArgs.optLong(index); + } + + public String optString(int index) { + return baseArgs.optString(index); + } + + public boolean isNull(int index) { + return baseArgs.isNull(index); + } + + + // The interesting custom helpers. + public byte[] getArrayBuffer(int index) throws JSONException { + String encoded = baseArgs.getString(index); + return Base64.decode(encoded, Base64.DEFAULT); + } +} + + diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java new file mode 100644 index 0000000..28c407f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java @@ -0,0 +1,187 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import android.annotation.SuppressLint; + +import java.security.SecureRandom; + +import org.json.JSONArray; +import org.json.JSONException; + +/** + * Contains APIs that the JS can call. All functions in here should also have + * an equivalent entry in CordovaChromeClient.java, and be added to + * cordova-js/lib/android/plugin/android/promptbasednativeapi.js + */ +public class CordovaBridge { + private static final String LOG_TAG = "CordovaBridge"; + private PluginManager pluginManager; + private NativeToJsMessageQueue jsMessageQueue; + private volatile int expectedBridgeSecret = -1; // written by UI thread, read by JS thread. + + public CordovaBridge(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) { + this.pluginManager = pluginManager; + this.jsMessageQueue = jsMessageQueue; + } + + public String jsExec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException { + if (!verifySecret("exec()", bridgeSecret)) { + return null; + } + // If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666. + // We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string. + if (arguments == null) { + return "@Null arguments."; + } + + jsMessageQueue.setPaused(true); + try { + // Tell the resourceApi what thread the JS is running on. + CordovaResourceApi.jsThread = Thread.currentThread(); + + pluginManager.exec(service, action, callbackId, arguments); + String ret = null; + if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) { + ret = jsMessageQueue.popAndEncode(false); + } + return ret; + } catch (Throwable e) { + e.printStackTrace(); + return ""; + } finally { + jsMessageQueue.setPaused(false); + } + } + + public void jsSetNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException { + if (!verifySecret("setNativeToJsBridgeMode()", bridgeSecret)) { + return; + } + jsMessageQueue.setBridgeMode(value); + } + + public String jsRetrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException { + if (!verifySecret("retrieveJsMessages()", bridgeSecret)) { + return null; + } + return jsMessageQueue.popAndEncode(fromOnlineEvent); + } + + private boolean verifySecret(String action, int bridgeSecret) throws IllegalAccessException { + if (!jsMessageQueue.isBridgeEnabled()) { + if (bridgeSecret == -1) { + LOG.d(LOG_TAG, action + " call made before bridge was enabled."); + } else { + LOG.d(LOG_TAG, "Ignoring " + action + " from previous page load."); + } + return false; + } + // Bridge secret wrong and bridge not due to it being from the previous page. + if (expectedBridgeSecret < 0 || bridgeSecret != expectedBridgeSecret) { + LOG.e(LOG_TAG, "Bridge access attempt with wrong secret token, possibly from malicious code. Disabling exec() bridge!"); + clearBridgeSecret(); + throw new IllegalAccessException(); + } + return true; + } + + /** Called on page transitions */ + void clearBridgeSecret() { + expectedBridgeSecret = -1; + } + + public boolean isSecretEstablished() { + return expectedBridgeSecret != -1; + } + + /** Called by cordova.js to initialize the bridge. */ + //On old Androids SecureRandom isn't really secure, this is the least of your problems if + //you're running Android 4.3 and below in 2017 + @SuppressLint("TrulyRandom") + int generateBridgeSecret() { + SecureRandom randGen = new SecureRandom(); + expectedBridgeSecret = randGen.nextInt(Integer.MAX_VALUE); + return expectedBridgeSecret; + } + + public void reset() { + jsMessageQueue.reset(); + clearBridgeSecret(); + } + + public String promptOnJsPrompt(String origin, String message, String defaultValue) { + if (defaultValue != null && defaultValue.length() > 3 && defaultValue.startsWith("gap:")) { + JSONArray array; + try { + array = new JSONArray(defaultValue.substring(4)); + int bridgeSecret = array.getInt(0); + String service = array.getString(1); + String action = array.getString(2); + String callbackId = array.getString(3); + String r = jsExec(bridgeSecret, service, action, callbackId, message); + return r == null ? "" : r; + } catch (JSONException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + // Sets the native->JS bridge mode. + else if (defaultValue != null && defaultValue.startsWith("gap_bridge_mode:")) { + try { + int bridgeSecret = Integer.parseInt(defaultValue.substring(16)); + jsSetNativeToJsBridgeMode(bridgeSecret, Integer.parseInt(message)); + } catch (NumberFormatException e){ + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + // Polling for JavaScript messages + else if (defaultValue != null && defaultValue.startsWith("gap_poll:")) { + int bridgeSecret = Integer.parseInt(defaultValue.substring(9)); + try { + String r = jsRetrieveJsMessages(bridgeSecret, "1".equals(message)); + return r == null ? "" : r; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + else if (defaultValue != null && defaultValue.startsWith("gap_init:")) { + // Protect against random iframes being able to talk through the bridge. + // Trust only pages which the app would have been allowed to navigate to anyway. + if (pluginManager.shouldAllowBridgeAccess(origin)) { + // Enable the bridge + int bridgeMode = Integer.parseInt(defaultValue.substring(9)); + jsMessageQueue.setBridgeMode(bridgeMode); + // Tell JS the bridge secret. + int secret = generateBridgeSecret(); + return ""+secret; + } else { + LOG.e(LOG_TAG, "gap_init called from restricted origin: " + origin); + } + return ""; + } + return null; + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java new file mode 100644 index 0000000..ccda027 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java @@ -0,0 +1,105 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import java.security.Principal; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +import android.annotation.SuppressLint; +import android.webkit.ClientCertRequest; + +/** + * Implementation of the ICordovaClientCertRequest for Android WebView. + * + */ +public class CordovaClientCertRequest implements ICordovaClientCertRequest { + + private final ClientCertRequest request; + + public CordovaClientCertRequest(ClientCertRequest request) { + this.request = request; + } + + /** + * Cancel this request + */ + @SuppressLint("NewApi") + public void cancel() + { + request.cancel(); + } + + /* + * Returns the host name of the server requesting the certificate. + */ + @SuppressLint("NewApi") + public String getHost() + { + return request.getHost(); + } + + /* + * Returns the acceptable types of asymmetric keys (can be null). + */ + @SuppressLint("NewApi") + public String[] getKeyTypes() + { + return request.getKeyTypes(); + } + + /* + * Returns the port number of the server requesting the certificate. + */ + @SuppressLint("NewApi") + public int getPort() + { + return request.getPort(); + } + + /* + * Returns the acceptable certificate issuers for the certificate matching the private key (can be null). + */ + @SuppressLint("NewApi") + public Principal[] getPrincipals() + { + return request.getPrincipals(); + } + + /* + * Ignore the request for now. Do not remember user's choice. + */ + @SuppressLint("NewApi") + public void ignore() + { + request.ignore(); + } + + /* + * Proceed with the specified private key and client certificate chain. Remember the user's positive choice and use it for future requests. + * + * @param privateKey The privateKey + * @param chain The certificate chain + */ + @SuppressLint("NewApi") + public void proceed(PrivateKey privateKey, X509Certificate[] chain) + { + request.proceed(privateKey, chain); + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java new file mode 100644 index 0000000..a219c99 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java @@ -0,0 +1,152 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.KeyEvent; +import android.widget.EditText; + +/** + * Helper class for WebViews to implement prompt(), alert(), confirm() dialogs. + */ +public class CordovaDialogsHelper { + private final Context context; + private AlertDialog lastHandledDialog; + + public CordovaDialogsHelper(Context context) { + this.context = context; + } + + public void showAlert(String message, final Result result) { + AlertDialog.Builder dlg = new AlertDialog.Builder(context); + dlg.setMessage(message); + dlg.setTitle("Alert"); + //Don't let alerts break the back button + dlg.setCancelable(true); + dlg.setPositiveButton(android.R.string.ok, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(true, null); + } + }); + dlg.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + result.gotResult(false, null); + } + }); + dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { + //DO NOTHING + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) + { + result.gotResult(true, null); + return false; + } + else + return true; + } + }); + lastHandledDialog = dlg.show(); + } + + public void showConfirm(String message, final Result result) { + AlertDialog.Builder dlg = new AlertDialog.Builder(context); + dlg.setMessage(message); + dlg.setTitle("Confirm"); + dlg.setCancelable(true); + dlg.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(true, null); + } + }); + dlg.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(false, null); + } + }); + dlg.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + result.gotResult(false, null); + } + }); + dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { + //DO NOTHING + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) + { + result.gotResult(false, null); + return false; + } + else + return true; + } + }); + lastHandledDialog = dlg.show(); + } + + /** + * Tell the client to display a prompt dialog to the user. + * If the client returns true, WebView will assume that the client will + * handle the prompt dialog and call the appropriate JsPromptResult method. + * + * Since we are hacking prompts for our own purposes, we should not be using them for + * this purpose, perhaps we should hack console.log to do this instead! + */ + public void showPrompt(String message, String defaultValue, final Result result) { + // Returning false would also show a dialog, but the default one shows the origin (ugly). + AlertDialog.Builder dlg = new AlertDialog.Builder(context); + dlg.setMessage(message); + final EditText input = new EditText(context); + if (defaultValue != null) { + input.setText(defaultValue); + } + dlg.setView(input); + dlg.setCancelable(false); + dlg.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String userText = input.getText().toString(); + result.gotResult(true, userText); + } + }); + dlg.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.gotResult(false, null); + } + }); + lastHandledDialog = dlg.show(); + } + + public void destroyLastDialog(){ + if (lastHandledDialog != null){ + lastHandledDialog.cancel(); + } + } + + public interface Result { + public void gotResult(boolean success, String value); + } +} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java new file mode 100644 index 0000000..724381e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java @@ -0,0 +1,51 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import android.webkit.HttpAuthHandler; + +/** + * Specifies interface for HTTP auth handler object which is used to handle auth requests and + * specifying user credentials. + */ +public class CordovaHttpAuthHandler implements ICordovaHttpAuthHandler { + + private final HttpAuthHandler handler; + + public CordovaHttpAuthHandler(HttpAuthHandler handler) { + this.handler = handler; + } + + /** + * Instructs the WebView to cancel the authentication request. + */ + public void cancel () { + this.handler.cancel(); + } + + /** + * Instructs the WebView to proceed with the authentication with the given credentials. + * + * @param username + * @param password + */ + public void proceed (String username, String password) { + this.handler.proceed(username, password); + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java new file mode 100644 index 0000000..ff90683 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java @@ -0,0 +1,97 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; + +import org.apache.cordova.CordovaPlugin; + +import java.util.concurrent.ExecutorService; + +/** + * The Activity interface that is implemented by CordovaActivity. + * It is used to isolate plugin development, and remove dependency on entire Cordova library. + */ +public interface CordovaInterface { + + /** + * Launch an activity for which you would like a result when it finished. When this activity exits, + * your onActivityResult() method will be called. + * + * @param command The command object + * @param intent The intent to start + * @param requestCode The request code that is passed to callback to identify the activity + */ + abstract public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode); + + /** + * Set the plugin to be called when a sub-activity exits. + * + * @param plugin The plugin on which onActivityResult is to be called + */ + abstract public void setActivityResultCallback(CordovaPlugin plugin); + + /** + * Get the Android activity. + * + * If a custom engine lives outside of the Activity's lifecycle the return value may be null. + * + * @return the Activity + */ + public abstract Activity getActivity(); + + /** + * Get the Android context. + * + * @return the Context + */ + public Context getContext(); + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object or null + */ + public Object onMessage(String id, Object data); + + /** + * Returns a shared thread pool that can be used for background tasks. + */ + public ExecutorService getThreadPool(); + + /** + * Sends a permission request to the activity for one permission. + */ + public void requestPermission(CordovaPlugin plugin, int requestCode, String permission); + + /** + * Sends a permission request to the activity for a group of permissions + */ + public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions); + + /** + * Check for a permission. Returns true if the permission is granted, false otherwise. + */ + public boolean hasPermission(String permission); + +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java new file mode 100644 index 0000000..9a6e924 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java @@ -0,0 +1,249 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.util.Pair; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Default implementation of CordovaInterface. + */ +public class CordovaInterfaceImpl implements CordovaInterface { + private static final String TAG = "CordovaInterfaceImpl"; + protected Activity activity; + protected ExecutorService threadPool; + protected PluginManager pluginManager; + + protected ActivityResultHolder savedResult; + protected CallbackMap permissionResultCallbacks; + protected CordovaPlugin activityResultCallback; + protected String initCallbackService; + protected int activityResultRequestCode; + protected boolean activityWasDestroyed = false; + protected Bundle savedPluginState; + + public CordovaInterfaceImpl(Activity activity) { + this(activity, Executors.newCachedThreadPool()); + } + + public CordovaInterfaceImpl(Activity activity, ExecutorService threadPool) { + this.activity = activity; + this.threadPool = threadPool; + this.permissionResultCallbacks = new CallbackMap(); + } + + @Override + public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { + setActivityResultCallback(command); + try { + activity.startActivityForResult(intent, requestCode); + } catch (RuntimeException e) { // E.g.: ActivityNotFoundException + activityResultCallback = null; + throw e; + } + } + + @Override + public void setActivityResultCallback(CordovaPlugin plugin) { + // Cancel any previously pending activity. + if (activityResultCallback != null) { + activityResultCallback.onActivityResult(activityResultRequestCode, Activity.RESULT_CANCELED, null); + } + activityResultCallback = plugin; + } + + @Override + public Activity getActivity() { + return activity; + } + + @Override + public Context getContext() { + return activity; + } + + @Override + public Object onMessage(String id, Object data) { + if ("exit".equals(id)) { + activity.finish(); + } + return null; + } + + @Override + public ExecutorService getThreadPool() { + return threadPool; + } + + /** + * Dispatches any pending onActivityResult callbacks and sends the resume event if the + * Activity was destroyed by the OS. + */ + public void onCordovaInit(PluginManager pluginManager) { + this.pluginManager = pluginManager; + if (savedResult != null) { + onActivityResult(savedResult.requestCode, savedResult.resultCode, savedResult.intent); + } else if(activityWasDestroyed) { + // If there was no Activity result, we still need to send out the resume event if the + // Activity was destroyed by the OS + activityWasDestroyed = false; + if(pluginManager != null) + { + CoreAndroid appPlugin = (CoreAndroid) pluginManager.getPlugin(CoreAndroid.PLUGIN_NAME); + if(appPlugin != null) { + JSONObject obj = new JSONObject(); + try { + obj.put("action", "resume"); + } catch (JSONException e) { + LOG.e(TAG, "Failed to create event message", e); + } + appPlugin.sendResumeEvent(new PluginResult(PluginResult.Status.OK, obj)); + } + } + + } + } + + /** + * Routes the result to the awaiting plugin. Returns false if no plugin was waiting. + */ + public boolean onActivityResult(int requestCode, int resultCode, Intent intent) { + CordovaPlugin callback = activityResultCallback; + if(callback == null && initCallbackService != null) { + // The application was restarted, but had defined an initial callback + // before being shut down. + savedResult = new ActivityResultHolder(requestCode, resultCode, intent); + if (pluginManager != null) { + callback = pluginManager.getPlugin(initCallbackService); + if(callback != null) { + callback.onRestoreStateForActivityResult(savedPluginState.getBundle(callback.getServiceName()), + new ResumeCallback(callback.getServiceName(), pluginManager)); + } + } + } + activityResultCallback = null; + + if (callback != null) { + LOG.d(TAG, "Sending activity result to plugin"); + initCallbackService = null; + savedResult = null; + callback.onActivityResult(requestCode, resultCode, intent); + return true; + } + LOG.w(TAG, "Got an activity result, but no plugin was registered to receive it" + (savedResult != null ? " yet!" : ".")); + return false; + } + + /** + * Call this from your startActivityForResult() overload. This is required to catch the case + * where plugins use Activity.startActivityForResult() + CordovaInterface.setActivityResultCallback() + * rather than CordovaInterface.startActivityForResult(). + */ + public void setActivityResultRequestCode(int requestCode) { + activityResultRequestCode = requestCode; + } + + /** + * Saves parameters for startActivityForResult(). + */ + public void onSaveInstanceState(Bundle outState) { + if (activityResultCallback != null) { + String serviceName = activityResultCallback.getServiceName(); + outState.putString("callbackService", serviceName); + } + if(pluginManager != null){ + outState.putBundle("plugin", pluginManager.onSaveInstanceState()); + } + + } + + /** + * Call this from onCreate() so that any saved startActivityForResult parameters will be restored. + */ + public void restoreInstanceState(Bundle savedInstanceState) { + initCallbackService = savedInstanceState.getString("callbackService"); + savedPluginState = savedInstanceState.getBundle("plugin"); + activityWasDestroyed = true; + } + + private static class ActivityResultHolder { + private int requestCode; + private int resultCode; + private Intent intent; + + public ActivityResultHolder(int requestCode, int resultCode, Intent intent) { + this.requestCode = requestCode; + this.resultCode = resultCode; + this.intent = intent; + } + } + + /** + * Called by the system when the user grants permissions + * + * @param requestCode + * @param permissions + * @param grantResults + */ + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException { + Pair callback = permissionResultCallbacks.getAndRemoveCallback(requestCode); + if(callback != null) { + callback.first.onRequestPermissionResult(callback.second, permissions, grantResults); + } + } + + public void requestPermission(CordovaPlugin plugin, int requestCode, String permission) { + String[] permissions = new String [1]; + permissions[0] = permission; + requestPermissions(plugin, requestCode, permissions); + } + + @SuppressLint("NewApi") + public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions) { + int mappedRequestCode = permissionResultCallbacks.registerCallback(plugin, requestCode); + getActivity().requestPermissions(permissions, mappedRequestCode); + } + + public boolean hasPermission(String permission) + { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + int result = activity.checkSelfPermission(permission); + return PackageManager.PERMISSION_GRANTED == result; + } + else + { + return true; + } + } +} diff --git a/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java new file mode 100644 index 0000000..41af1db --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java @@ -0,0 +1,422 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import org.apache.cordova.CordovaArgs; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CallbackContext; +import org.json.JSONArray; +import org.json.JSONException; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; + +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * Plugins must extend this class and override one of the execute methods. + */ +public class CordovaPlugin { + public CordovaWebView webView; + public CordovaInterface cordova; + protected CordovaPreferences preferences; + private String serviceName; + + /** + * Call this after constructing to initialize the plugin. + * Final because we want to be able to change args without breaking plugins. + */ + public final void privateInitialize(String serviceName, CordovaInterface cordova, CordovaWebView webView, CordovaPreferences preferences) { + assert this.cordova == null; + this.serviceName = serviceName; + this.cordova = cordova; + this.webView = webView; + this.preferences = preferences; + initialize(cordova, webView); + pluginInitialize(); + } + + /** + * Called after plugin construction and fields have been initialized. + * Prefer to use pluginInitialize instead since there is no value in + * having parameters on the initialize() function. + */ + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + } + + /** + * Called after plugin construction and fields have been initialized. + */ + protected void pluginInitialize() { + } + + /** + * Returns the plugin's service name (what you'd use when calling pluginManger.getPlugin()) + */ + public String getServiceName() { + return serviceName; + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param rawArgs The exec() arguments in JSON form. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException { + JSONArray args = new JSONArray(rawArgs); + return execute(action, args, callbackContext); + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param args The exec() arguments. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + CordovaArgs cordovaArgs = new CordovaArgs(args); + return execute(action, cordovaArgs, callbackContext); + } + + /** + * Executes the request. + * + * This method is called from the WebView thread. To do a non-trivial amount of work, use: + * cordova.getThreadPool().execute(runnable); + * + * To run on the UI thread, use: + * cordova.getActivity().runOnUiThread(runnable); + * + * @param action The action to execute. + * @param args The exec() arguments, wrapped with some Cordova helpers. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException { + return false; + } + + /** + * Called when the system is about to start resuming a previous activity. + * + * @param multitasking Flag indicating if multitasking is turned on for app + */ + public void onPause(boolean multitasking) { + } + + /** + * Called when the activity will start interacting with the user. + * + * @param multitasking Flag indicating if multitasking is turned on for app + */ + public void onResume(boolean multitasking) { + } + + /** + * Called when the activity is becoming visible to the user. + */ + public void onStart() { + } + + /** + * Called when the activity is no longer visible to the user. + */ + public void onStop() { + } + + /** + * Called when the activity receives a new intent. + */ + public void onNewIntent(Intent intent) { + } + + /** + * The final call you receive before your activity is destroyed. + */ + public void onDestroy() { + } + + /** + * Called when the Activity is being destroyed (e.g. if a plugin calls out to an external + * Activity and the OS kills the CordovaActivity in the background). The plugin should save its + * state in this method only if it is awaiting the result of an external Activity and needs + * to preserve some information so as to handle that result; onRestoreStateForActivityResult() + * will only be called if the plugin is the recipient of an Activity result + * + * @return Bundle containing the state of the plugin or null if state does not need to be saved + */ + public Bundle onSaveInstanceState() { + return null; + } + + /** + * Called when a plugin is the recipient of an Activity result after the CordovaActivity has + * been destroyed. The Bundle will be the same as the one the plugin returned in + * onSaveInstanceState() + * + * @param state Bundle containing the state of the plugin + * @param callbackContext Replacement Context to return the plugin result to + */ + public void onRestoreStateForActivityResult(Bundle state, CallbackContext callbackContext) {} + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object to stop propagation or null + */ + public Object onMessage(String id, Object data) { + return null; + } + + /** + * Called when an activity you launched exits, giving you the requestCode you started it with, + * the resultCode it returned, and any additional data from it. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be + * attached to Intent "extras"). + */ + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + } + + /** + * Hook for blocking the loading of external resources. + * + * This will be called when the WebView's shouldInterceptRequest wants to + * know whether to open a connection to an external resource. Return false + * to block the request: if any plugin returns false, Cordova will block + * the request. If all plugins return null, the default policy will be + * enforced. If at least one plugin returns true, and no plugins return + * false, then the request will proceed. + * + * Note that this only affects resource requests which are routed through + * WebViewClient.shouldInterceptRequest, such as XMLHttpRequest requests and + * img tag loads. WebSockets and media requests (such as

+ + +
+

asdf.us/ascii documentation

+ + +These are some handy documents which address some of the more obscure +features of the asdf.us color code tool: + +* tips.txt - Tips on using the keyboard +* irssi.txt - Instructions on using IRSSI to make color codes. +* nopaint.txt - A guide to "No Paint" + +Documents on Shaders + +* shadetut.txt - A brief tutorial on ASCII shaders. +* shaders/brush.txt - Shaders designed to work on the brush +* shaders/canvas.txt - Shaders designed to work on the canvas +* shaders/util.txt - Miscellaneous utilities / snippets + +For more information on IRC, Color Codes, and much more, visit the +documentation sitemap, part of the Jollo IRC Network. + +asdf.us/ascii + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/irssi.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/irssi.txt new file mode 100644 index 0000000..baded1c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/irssi.txt @@ -0,0 +1,153 @@ + __________________________________________________________________________ + ____ ____ _____ ____ ___ ___ ____ + /_____ _____/ / ___ \ / ____/ / ____/ /_____ _____/ + / / / / \ \ / / / / / / + / / / /____/ / \ \__ \ \__ / / + / / / ___ __/ \__ \ \__ \ / / + / / / / \ \ \ \ \ \ / / + _____/ /_____ / / \ \ ____/ / ____/ /____/ /_____ + ___/ /__/ /_______\ \__/ /___/ // /____ + __________________________________________________________________________ + + +OPTIMIZE YOUR TERMINAL FOR COLOR CODES ON OSX +============================================= + +You can use terminal, some nerds seem to prefer iterm2, but it's up to you +... http://iterm2.com/ + +To see color codes correctly, make sure your term type is xterm-256color -- + +If you use iterm: https://s3.amazonaws.com/luckyplop/a1b0f0e3d6eae746c82194876f2ccd8b200bc3bb.png +If you use terminal: https://s3.amazonaws.com/luckyplop/6a2270b58ea1cfac587607215e1b829f41d47355.png + +Restart iterm after changing this setting. + +The default iterm colors are kind of ugly for color codes, so you may want to change them +to something like this.. + +https://s3.amazonaws.com/luckyplop/c5f3a1f2b8e2f8a745fa2638c21af7d26117b91b.png + +You can download this iTerm color preset here: + +http://asdf.us/ascii/doc/bamboo.itermcolors + + +INSTALLING IRSSI ON OSX +======================= + +For me the easiest thing is to install homebrew >> http://brew.sh/ + +Follow les instructions and then.. + +brew install irssi + +Then you run irssi from a terminal by typing the magic word.. + +irssi + + +SETTING UP IRSSI FOR COLOR CODES +================================ + +Use these commands for proper unicode support -- + +/set term_charset utf-8 +/set recode_autodetect_utf8 ON +/set recode_fallback ISO-8859-15 +/set recode ON + +Use these commands to dump color codes quickly and efficiently -- + +/set cmd_queue_speed 0msec +/set cmds_max_at_once 1 +/set flood_max_msgs 0 +/set flood_timecheck 0 + +To make your log go back very far -- + +/set scrollback_lines 20000 +/set scrollback_time 10day + +Remember to type /save after doing a /set to save your changes! + +/save + +Your irssi configuration will be stored in your home directory in.. + +.irssi/config + + +NORMAL IRSSI OPERATION +====================== + +If you do not want to do the autojoin thing these are the commands you'd normally use to connect: + +/server -ssl irc.asdf.us 7777 +/join #ascii + + +SETTING UP IRSSI TO AUTOJOIN #ASCII +=================================== + +First run irssi, then paste in these commands. +Please change YOUR_NICK_HERE to your preferred username! + +/network add -nick YOUR_NICK_HERE -user YOUR_NICK_HERE -realname "YOUR NAME HERE" asdf +/server add -network asdf -auto -ssl irc.asdf.us 7777 +/channel add -auto #ascii asdf +/save +/quit + +Now run irssi again.. it should autoconnect to the channels and stuff. +If you want it to move you into #ascii by default, you can do ctrl-N and then + +/layout save +/save + + +IRC TIPS +======== + +/join #ascii -- join a channel :) +/part #ascii -- leave a channel ;( +/quit blabla -- quit irc (with the quit message 'blabla') +/list -- list channels +/nick booboo -- change your nick to booboo +/who #ascii -- show complete list of people on #ascii +/names -- show quick list of names +/msg nick blabla -- send someone a private message ;) + + +IRSSI TIPS +========== + +Ctrl-N -- move to next window +Ctrl-P -- move to previous window +/window close -- close a window +Fn-up arrow -- page up (if you don't have a pageup key) +Fn-down arrow -- page down (if you don't have a pagedown key) + + +IRSSI SCRIPTING +=============== + +This is its own can of worms. May we suggest: + +http://scripts.irssi.org/scripts/noticelogic.pl +http://scripts.irssi.org/scripts/nickcolor.pl + +To make it run on startup, copy it into ~/.irssi/scripts/autorun/ (and restart irssi) + +Another fun IRC thing is running an XDCC server for sharing files.. +-- for more info see http://asdf.us/xdcc/ + + +AND REMEMBER... +=============== + +Have fun and be safe online! + + + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/nopaint.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/nopaint.txt new file mode 100644 index 0000000..5428cab --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/nopaint.txt @@ -0,0 +1,58 @@ + + "" 88 + 9,88m, ,8888, 9,88m, ,888, mm 9,88m, 8888 + 88 88 86 98 88 88 ,mm88 88 88 88 88 + 88 88 '8888' 88888' "nn89 88 88 88 "8m + 88 a brief tutorial :) + +Last month or so I encountered Jeffrey Scudder's tool 'No Paint' - + +https://www.nopaint.org/ + +- an automatic drawing tool with a minimal interface: you control it using +just two buttons. The No Paint tool provided much entertainment on #sally, +so during some downtime I added similar functionality to the asdf.us/ascii +tool. Under the brush, you should see two buttons - to kick it off, click +'paint' and it will begin drawing. + +If you don't like what it's doing, click 'no' - +- this will remove the current line and start drawing a new line. + +If you like what it's doing, click 'paint' - +- the line will be applied to the canvas, and it will start drawing anew. + +While it's going, you can also click 'pause' and it will stop, so you can +save it or draw on it yourself. + + +Keyboard shortcuts - + +left arrow - 'no' +right arrow - 'paint' +down arrow - 'pause' + + +Right-click toggles - + +If you RIGHT-CLICK on "Paint" it will switch tools automatically. + +If you RIGHT-CLICK on "No" it will engage TURBO MODE. + + +Some tools currently implemented - + +- solid brush +- erase brush +- color-changing brush +- hue brush +- letter brush +- clone tool +- smear tool +- fill tool +- stars brush +- canvas slide +- canvas scale +- canvas rotate +- canvas colorcycle + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/brush.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/brush.txt new file mode 100644 index 0000000..8a5f672 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/brush.txt @@ -0,0 +1,126 @@ +BRUSH SHADERS +============= + +Unless noted, these shaders were written to work on the brush itself. +Make sure "brush" is selected and "animate" is checked. + + +>> distressed texture brush + +Sample use of the "choice" function to get a random color. + +var char = choice(" abcdef ") +lex.bg = +choice("0124") +lex.fg = +choice("01234") +lex.char = char +lex.opacity = char == " " ? 0 : 1 + + + +>> foggy terrain brush + +var char = choice(" abcdef ") +lex.bg = choice([14,15]) +lex.fg = choice("367") +lex.char = char +lex.opacity = char == " " ? 0 : 1 + + + +>> mirror brush (left-right) + +NOTE: Animate this on the canvas, then draw: + +if (x > w/2) { + lex.assign( canvas.aa[y][w-x] ) +} + + + +>> mirror brush (up-down) + +NOTE: Animate this on the canvas, then draw: + +if (x > h/2) { + lex.assign( canvas.aa[h-y][x] ) +} + + + +>> rainbow stardust brush + +Uncheck BG and animate this to brush: + +lex.fg = hue(t) +lex.char = choice(" ,'.,.','****** ") + + + +>> noise brushes, works on a black background: + +lex.bg = max(5, yellow(randint(t))) +lex.opacity = lex.bg == colors.black ? 0 : 1 + + + +>> simple rainbow: + +if (lex.bg != 1) lex.bg = randint(t) +lex.opacity = lex.bg == colors.black ? 0 : 1 + + + +>> self-erasing: + +if (lex.bg != 1) lex.bg = yellow(randint(t)) +lex.opacity = lex.bg == colors.black ? 0 : 1 + + + +>> cycling rainbow brush + +if (lex.bg != 1) lex.bg = hue( all_color_hue_order.indexOf( color_names[ lex.bg ] ) + 1 ) +lex.opacity = lex.bg == colors.black ? 0 : 1 + + + +>> "stars" brush.. set your brush to paint just the character "#" + +if (lex.char == "#") { + lex.fg = hue(randint(15)) + lex.char = random() > 0.1 ? " " : "+@*.,\"+'*-"[randint(10)] +} + + + +>> use fg char to mask mask what you're drawing on the bg + +if (lex.char != "/") { lex.bg = 1 } + + + +>> sharded glitch brush + +Example: http://asdf.us/z/kksnvs.png + +Use on a brush: + +lex.bg = t/y/x +lex.opacity = lex.bg % 1 ? 0 : 1 + + + +>> incremental brush + +Set your brush to be the ^ character, square, about 10x10 +Draw "char" only +Then animate this shader on the canvas: + +if (lex.char=="^") { + lex.bg += 1 + lex.char = " " +} +lex.bg += 1 + + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/canvas.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/canvas.txt new file mode 100644 index 0000000..3e036bd --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/canvas.txt @@ -0,0 +1,237 @@ +CANVAS SHADERS +============== + +These shaders were written to work on areas of canvas. +Make sure "canvas" is selected and "animate" is checked. + + +>> original shader.. + +lex.bg = hue((x+y*y+t/10)/20) +lex.fg = (x+y)%16 +lex.char = (y%2) ? ":" : "%" + + + +>> energy ball ascii shader + +d = dist(x/2+w/4, y, w/2, h/2) +an = angle(x/2+w/4, y, w/2,h/2)+t/4200 +r=10.2 + +if (d < r) lex.bg = randint(r) + +ll=abs(an|0)+"" +lex.char=ll[ll.length-1] + +if (d > r) { + lex.bg = randint(d) + lex.fg = randint(d) + lex.char = ll[ll.length-2] +} + + + +>> drifting fire + +t += sin(x/1000)*100000 +pos = y/h*6 + sin(x*3) - cos(y*t/10000-10) +pos = clamp(pos, 0, 6) +lex.bg = hue(pos) + + + +>> the "bJoel56" shader + +yy=y +x-=w/2 +y-=h/2 + +lex.bg = blue(yy/h+random()) +lex.fg = green(yy/h*4 + sin(x/100+random()/2)) // hue(t/1000)|0; + +var abcd=".'~:;!>+=icjtJYSGSXDQKHNWM"; +function chara (aa,n) { return aa[clamp(n*aa.length, 0, aa.length)|0] } +lex.char = chara(abcd, y/h*(5/3 + tan(x/100)+random()/1)) + + + +>> frog shader v2 + +t/=-100 +d = sinp( (dist(x/2+w/4, y, w/2, h/2) + t)/2 ) * 10 + +lex.char=',./>"ASE$#'[(floor(d))] +lex.fg = [1,3,9][floor(d*3)%3] +lex.bg=1 + + + +>> frog shader v3 + +// set period to like 0.2 for a normal circle +period = y/10 + +t/=-100 +d = sinp( (dist(x/2+w/4, y, w/2, h/2) + t) * period ) +dd = d * 10.5 +d3 = dd < 8 ? 0 : 1 + +lex.char=' .,"+/>OXEN'[(floor(dd))] +lex.fg = [3,9][floor(d3)] +lex.bg=1 + + + +>> spaceships + +many cool shaders are possible with this technique.. changing the char +gradient (lex.char=...) etc. i love how the dots move on v4. + +this is a variation that looks like a bunch of ships flying across the screen. +has a really cool 3d look to it cuz the rows move at different speeds. + +period = sin(y) + +t/=-100 +d = sinp( (dist(x/2+w/4, y, w/2, h/2) + t) * period ) +dd = d * 10.5 +d3 = dd < 8 ? 0 : 1 + +lex.char=' .,"+/>\^+'[(floor(dd))] +lex.fg = [3,9][floor(d3)] +lex.bg=1 + + + +>> concentric circles with a wavy "sunburst" pattern going around them + +x -= w/2 +y -= h/2 + +x /= h +y /= h/2 + 2 + +r = dist(x,y,0,0) +ang = angle(x,y,0,0) + +if (r < 0.6) { + if (abs(mod(sin((r*t)/100000000000) + ang*18,TWO_PI)) < 2) + lex.bg = 12 + else + lex.bg = 5 +} +else if (r < 0.65) + lex.bg = 4 +else if (abs(mod(sin((r*t)/100000000000) + ang*18,TWO_PI)) < 2) + lex.bg = 7 +else + lex.bg = 8 + + + +>> slash-based interference patterns + +if (x > h*2) x=h-x +y-=h/2 +t/=2000 + +if (sin(x-y*t) > 0) { + lex.bg=1 + lex.fg=4 + lex.char= Math.floor(x-y*10001+t)%2 ? '\/' : '\\' +} +else { + lex.bg=1 + lex.fg=9 + lex.char= Math.floor(3*x+y+t)%2 ? '\\' : ' ' +} + + + +>> sparkling stars + +if (lex.char != " ") { + lex.fg =floor( Math.random()*10 ) + var az="Xx+*" + lex.char=az[floor(az.indexOf(lex.char)+ t/10000000 +Math.random())%az.length] +} + + + +>> coogi x/y doodle + +xx=x +t/=1000 +x/=w/2 +y/=h/2 +y-=1 +x-=1 +x*=x-sin(y/t) +y*=1 + +lex.bg = 1 // gray( sin(x/(y/3-1)+t) + sin(y/4+t) ) +lex.fg = hue( sin((y/5)+t) - cos(x*t) *5 ) +lex.char = " _.,:;\"~| "[Math.round(xx*(y+1+(x+t/102)/4)*13)%13] + + + +>> glitch shader - produces odd combinations of fg/bg + +lex.char=String.fromCharCode(lex.char.charCodeAt(0)+1) +lex.bg+=7 +lex.fg+=5 + + + +>> dots / lines shader + +xx = ((t/10*x)*y/10)%8 +lex.bg = colors.black +lex.fg = green(x*3+y*5) +lex.char = ((xx%1) !== 0) ? " " : " .,;=+!@"[xx] + + + +>> munching squares horizon + +t/=100 +y+=10 +x-=w/2 +x/=y/10 +lex.bg=hue((x^y)+t) + + + +>> grayscale vertical interlacing + +First, make a canvas that's totally white. + +Run this shader: + +if (lex.bg == 0) { + lex.bg = ((x)%2) ? 15 : 14 +} + +Then set your brush to a white square. + +Run this shader w/ animate: + +if (lex.bg == 0) { + lex.bg = ((x)%2) ? 0 : 1 +} + + + +>> nice purple/orange texture + +lex.bg=colors.purple +lex.fg=colors.orange +x/=3 +x=floor(x+y/2.1) // <- this is cool number to change +if (x+10*sin(x)+10*cos(y/(t%100)) < y/3) { + lex.char="abcdefghijklmnopqrstuvwxyz"[x%26] +} else { + lex.char="abcdefghijklmnopqrstuvwxyz".toUpperCase()[x%26] +} + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/util.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/util.txt new file mode 100644 index 0000000..a455eb3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shaders/util.txt @@ -0,0 +1,38 @@ +SHADER UTILITIES +================ + +These are little snippets which may be useful in writing your own shaders. + + + +>> basic way to slow the frame rate of a shader. + +window.zz=window.zz||0 +if(!(x+y)) zz++ +if (lex.bg != 1 && !(zz % 4)) { + ... +} + + +>> handy for brushes - use color to mask brush shape + +lex.opacity = lex.bg == colors.black ? 0 : 1 + + +Tip: Set to "animate brush", then use option+shift (alt+shift) to +copy color from the canvas. Brush will have the "shape" of the +copied color only. Can be a cool effect when used with fg/bg only. + + + +>> copy color from canvas at x/y + +lex.assign( canvas.get(x,y) ) + + + +>> animate canvas up and to the left.. + +lex.assign( canvas.get(x+1,y+1) ) + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shadetut.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shadetut.txt new file mode 100644 index 0000000..681b421 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/shadetut.txt @@ -0,0 +1,156 @@ +ASCII SHADER TUTORIAL +===================== + +In the asdf.us/ascii shaders, you write a little math function that executes on every +pixel on the selected area. The shaders can affect either the brush, the selected region, +or the whole canvas. + +Shaders can also be animated, so they update live. With a shader applied to the brush, +the brush changes continuously as you draw. + + +THE LEX OBJECT +============== + +Essentially you are writing a Javascript function that modifies this "lex" object, which +has four properties + +1) lex.bg = this is the background color +2) lex.fg = this is the foreground color (text color) +3) lex.char = this is the letter that you see in the space +4) lex.opacity = this is whether the pixel actually draws or not + - so like a circular brush is opacity 1 in the middle and opacity 0 on the corners + + +THE COLOR CODE NUMBERS +====================== + +With lex.bg and lex.fg, the goal is to have a number between 0 and 15, corresponding to +the color code values from mIRC. + +If you shift-click on the color palette, you can cycle it around to the one which shows +the actual order of the mIRC colors. + +The mIRC colors are the ones that go white, black, dark blue, green, red, dark red ... +and these correspond to the numbers 0, 1, 2, 3, 4 ... + + +COLOR CYCLING +============= + +Additionally there are some color functions that might help - +These functions make it easier to cycle through colors in a way that makes sense logically +(since the mIRC colors are in a weird order) + +- hue(...) = this creates a cycle of colors in terms of their hue or color name, + so you get a rainbow that goes from dark red through yellow, green, blue, + purple, and back +- gray(...) = cycles through grayscale +- red(...) yellow(...) green(...) blue(...) purple(...) = use smaller palettes +- inv_hue(...) fire(...) dark_gray(...) = these are oddities i made for fun + + +VARIABLES +========= + +Variables you have at your disposal are similar to the asdf.us/shader tool - + +- x, y = the coordinates of the pixel +- mouse.x, mouse.y = the coordinate of the mouse as it hovers over the canvas +- t = the current time, in milliseconds + +TIP: The time will increase very quickly - it's good to add t /= 1000 at the top of +your shader so it goes slowly (and won't cause a seizure). + + +FUNCTIONS +========= + +Remember, this is Javascript. You have the basic operators: + ++ - / * + +And the bitwise operators: + +& | ^ ~ + +You can do if statements with the standard comparison operators: + +< > == <= >= + +You also have access to all the functions on the Math object: + +floor, ceil, round +abs, sign, mod(n,m), xor +pow, exp, sqrt +cos, sin, tan +acos, asin, atan, atan2 +random() rand(n) randint(n) randrange(a,b) +E, PI, PHI + +And some utility functions which might help: + +clamp(n,min,max) +mix(n,a,b) (lerp) +step(a,b) +smoothstep(min,max,n) +avg(m,n,a) +cosp, sinp (mapped to [0,1]) +pixel(x,y) == 4*(y*w+h) +dist(x,y,a,b) +angle(x,y,a,b) +choice(array) +deg(radians), rad(degrees) + + +BEYOND BASIC COLORS +=================== + +Other weird effects are possible if you combine these color functions. + +For instance, if you do hue(x+y) you'll get a rainbow. But remember, this is just +outputting a number between 0 and 15. So you can do hue(x+y) + 1 and get a different +cycle which does not really have anything to do with the rainbow, but looks cool. + + +HOW DRAWING WORKS IN THE ASCII TOOL +=================================== + +When you click and drag to draw a line, your mouse produces a series of points which +describe the line you tried to draw. But these points do not necessarily make a +continuous line - more like a series of dots, which it then draw lines between to make +a "line" or "brush stroke". + +A line between two points is made by stamping the brush at regular intervals between the +points which, with these brushes, ends up filling the space in between so it looks like +you drew a continuous line. + +This is why when you draw a line with a big brush, it smears the outer edges.. The stamps +happen right next to each other, so you wind up seeing mostly brush edges. + +You can visualize this effect with the following shader: + +lex.bg = mouse.x + mouse.y + +Drawing strokes quickly, or slowly. +Make sure to make it animate to brush. +Results could look like this: + +http://i.asdf.us/im/f9/1458658781640-ascii-bamboo.png + + +SAMPLE SHADERS +============== + +You can see a list of example shaders here: + +http://asdf.us/ascii/doc/shaderz.txt + +If you make a cool shader and want to see it on the list, please get in touch! +You can find me on irc.jollo.org:9999 (ssl) in #sally, making color codes with my friends. + +Thanks and have fun! + +~ Bamboo, 22 Marzo 2016 + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/tips.txt b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/tips.txt new file mode 100644 index 0000000..d014197 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/doc/tips.txt @@ -0,0 +1,16 @@ +asdf.us/ascii tips +================== + +These keyboard commands work in brush mode (square, circle, cross): + +[ brush smaller +] brush bigger +ctrl~click on brush erase cell +ctrl~click on canvas draw with bg color +shift~click on canvas draw line from last position +alt~click on canvas fill brush with sampled color +alt~shift~click on canvas copy canvas to brush +rightclick on palette set bg color (when drawing with a letter) + +h/t timb for guide + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.eot b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e2e493b44411b43ff839dd664df67e284486df0e GIT binary patch literal 136761 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�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 K`Zk9DuKxhP|M3n0 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.svg b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.svg new file mode 100644 index 0000000..a99c895 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.svg @@ -0,0 +1,6006 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.ttf b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/fonts/fsex300-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d53e501b69201eceabd0faec2c924282dd21b597 GIT binary patch literal 659104 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%0DvC#3L9!S{-{V%kXUFe2wp+Fmvo7yBbV<^D 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

lQWgAM8MviEo>H8p?bLEvGMEq`ND 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

s1#{nX;87 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/bucket.png b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..cfaab3062822770f63fb59b31fc446e17e0cfd16 GIT binary patch literal 1219 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVi##Kg(a)!E3^$G&eP`1g19yq1PCvUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnqfVG!Lpb z1-Dxaaq86vIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@iev;(k@c`tha-@0Z&8_P?3D=e2m=oasyNsR|aX66jdO(f_#O z%qr)GMH)V0yKj}oO0wlUEMxkYdz)=ZXW_Ndv$GnmN!6WHkdh3%Y|@%JYYxMHqx0&! zX8xPFY2lXC*?;nHi|t-l{O;7IBZV>_y_6Vh1dkg|67y&5+qiy}mP{L?z5w$Qr7V6= zdG!Y;{Z4GJ+HGq0y>|cBAE!Ur9Iu>rF-N@HHFRdC=Xu46&hy#!FAR=-to|u?)}{%H z-jj~JxwiG8(l&F`3EP}=ZwYT+{_KFwgu)xl8`QWJC&(xKt~`AgTe~DWM4fKZ2`M literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/dropper.gif b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/dropper.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d9eee1ea00a97bf5d17cd7618b27f3092907113 GIT binary patch literal 1170 zcmZ?wbhEHb6krfwSj5iI-rj!y{{2_4UP(wu*xA|b-@o6$z~KM?|BC;)BYXoCToOwX zfwYZ%ML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb*d<&dYGcrA@ic*8C{6dnevXd=S zlxV%Qmue&kg&dz0$52&wylyQNJ0T*r*nQ$ zs)DJWfo`&anSp|tp`M|!iMhGCj)IYap@F`Ek-njkuA#Y=v5}R5fdUjL0c|TvNwW%a zaf8|g1^l#~=$>Fbx5m+O@q>*W`v>l<2HT7t|lGSUUA&@HaaD@m--%_~-hnc$LI zoLrPyP?DLSrvNfBF)6>a#8wIDQivCF3*g4)73+b$qnDhYt6z~=pl_&W0P+${p|3A~ zrMbCq)x{-2sR;LCHMlsWvLIDID784hv?w_hs9YIjRe_arQEFmIeo;t%ehw@Y12XbU z@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN;*!L?eiaKZd}bLY&SHFL)FX;Y_6o-}bne_wA;cUNaeds}Nub5mnOeO+x$bya0W zd0A;maZzDGeqL@)c2;IadRl5qa#CVKd|YfybW~(Scvxsia8O`?zn`yFMfdYiVkztEs9eD=8|-%gM?}OG!$Ii;0Q|3keGF z^YQXTBeuybUQr^A0EP^uS wvQ2?P%L7E_N}0X;XtyThHnZv5)_bfPe?&zN3M;R)G4em|7-$))#=u|=02XJVQ2+n{ literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/gray-dither.gif b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/gray-dither.gif new file mode 100644 index 0000000000000000000000000000000000000000..8809b7a28d27c358b42254abaf3ff47b3f1754b3 GIT binary patch literal 1102 zcmZ?wbhEHbh+i z#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPs zx)kDt+yc0N~y(w7S0@Vxh2X?*sK*#8VA{Hs4VM4&v17gCHEsz6G_^Elo)LsNk){OuE z{r&U%*Uul{zkU7k`P0V_@87+B^ZM1x7tfzPee(Fx!w2{8-Mw@B*3BE&uU)-z`O?J; z=g*xzbNbZD6UUDoJ#zTa!2|pE?cK9`*UlZ=w{6|BdDF%X>({MavwGFa70Z_`U9x!5 z!Ugl^&7CuQ*322xr%jzQdD6rQ{e8VX-Cdm>?QN|s%}tFB^>wv1)m4=h1nAc$w`R`@o}*+(NU2R;bEa6!9jrm{(inb-d>&_?ryFw&Q6XF_I9>5 z)>f7l=4PfQ#zw#_rKhW-t);1EF>tv&&SKd&Be*V o&c@2Z%*4pRp!kyoNHQ|$FaQCl)L>xZbm?1}d73Ythn2w^052+muK)l5 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/tile.jpg b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/images/tile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..143334bb10edab3eb6cf44d723cbde1e7f0c09ff GIT binary patch literal 2526 zcmbtUd010d7QZifS)fLeu!X2I2uT1bs3{<()__9Diy|793d*Pukwt-sAc7!*xPVd& z0S$-RZ-%r__BJMW$IJNMq-JxkCY zbP!NQ0z?2H90Y{e51?bvX-7$z-{uXg1H*QNMFfV0bFFQ8YDoRqFGF1MPqA+Rq5)px zQzHP^hcibXphLKKI04>;V2=MC;QoU4;LHJp*%Iu503NSi37P3&-)iqi*+>RPP`cWr ze)N4Fp>}IHjA;U>8eZyM)GV;K279f+NE(ePjc;6I3Bmk;04#1Rrip*zA3UcO*&jVz z41s_Trl(_UH6E)^9?hPUm<>QUmb5Pl{)rm?B82`w82TK{)RYKF60idxv>)sP1T3jA z9)@88i9jHbv`8cpQHw&+CTq{2P^mhY&}e#kbUIy^s%LF$Cr-Q%rMr#0#4AMb59x?$q8ic1oXg!pN@gqPQ z!KkVQkM$Z%Ad<*h+FxM>`y7M-4nGZ20R%&M9E`(wkx6*UCJdzE;kopM1jjX-bWNmt zxkSCAr!OxvW$BCkzOkv@p17REmXX~%UiwGa8a&ARtu%?_l;I(9zL~$n&XCdRIkfrJ zm3?);Mm~HkFq0P~mu1#>J$iGd{8snyxK}{b{;acCZz~_aUF7opmYoNVovUcLJ2GKz zFI*cKeen4C%Eq22lUha=ixKajU56AGs+xMAzSCyT9&STFq^Y)_Oech~oiuwfGoe#Qd0UYGs5B(oiMlLNL>%`mia2aT-|v zz=&r3*uC^fvU2IAH_vl(PPwhj=cq>G1rEFXnIpjMatV(T?beXyZN_kUd=$iawfWKH z!)4C7R?UbZcmJBq$gj&Qu2vYNTIT);Ua@fda?Fos=vLaKJAxxA7;SpNly6zJ4UCKD zKj*BAKDCy&jqee2%w>=8c7>%SCslEB#CufSS63S%7`rsq_q2CK3QdtNuMcLaW|rBl zGja9^TRnv3l->NHj4b(256dbp8=pm3@&YVJe6(}2$(}_O?BgJ8i|KMlZSr|GYkQrd zw9v?#Fs8$e5=|7Ejey_xtsf4`uug`{`a}$d76Sd`s=42kh#<~o=rV56&SF>HEIF(<{*Z*_YLD27b34WKe_n(Xl_XFA@|@S-KnBL@O6RAh1D`*ac39Z zlW{PCScCCgDat%iqUe&E*ZpkC?3>qGbT4g+;nQEJ6YuORAAMMgyYh`vrrF|Kl!S3i0{#{;dc{zsh#ABc(b!JF$bY#FKCKJE0?FBtH zXr#!qPE|E|ytlGvVrli25dHPHD-+%xC?BNV_ev~84nEWUfs9Kl3$3%BorgEivcHpJ zWBsPz6KfnL`@=Y$bDdv4e3-s`{lAwmJKY9pKn4cRXB(_#$%L9=Q_qKb`p%)IQehcW-8tRa!~&oeR5ytYTLP+b0O_2&1t+Q46+``x`qY7*9wh zZalY+O+B%T)ilq7l{ln0mUA-}`rX+RLtvf!m^ZlakqLx+V$z5Aj_F>g3 zX>$LQ@ao%j70Qk}m#K6i=lss~CPK3-tpze+@g7u(5tH9{E!q|uJ6qXvuZ86hE@MR> zf_ERy3v-p%vSf}Tuj z{lcF;V%ms{gzxJPC<_~FZry0RJ@aiQuj!Br! z3A!1xm<)}JzXKqMs@-NPksOXZK3{L#s=?jV|$Xp)7L?c;)sFAmvr-Cow+O& U@KRQssf*9KIO|<73ees^0KAg*0{{R3 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/app.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/app.js new file mode 100644 index 0000000..3cf6db3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/app.js @@ -0,0 +1,99 @@ + +var dragging = false +var drawing = false +var erasing = false +var selecting = false +var filling = false +var changed = false +var transforming = false +var mirror_x = false +var mirror_y = false +var focused + +var canvas, tools, palette, controls, brush, mode +var current_tool, current_filetool, current_canvas +var mouse = { x: 0, y: 0 } + +function init () { + build() + bind() +} +function build () { + shader.init() +// shader.run(canvas) + shader.animate() + + canvas.append(canvas_rapper) + brush.append(brush_rapper) + palette.append(palette_rapper) + letters.append(letters_rapper) + letters.repaint("Basic Latin") + + controls.circle.focus() +// controls.shader.focus() + + brush.bg = colors.red + brush.generate() + brush.build() + + // controls.grid.use() + canvas.resize_rapper() +} +function bind () { + canvas.bind() + palette.bind() + letters.bind() + brush.bind() + controls.bind() + keys.bind() + clipboard.bind() + + window.addEventListener('mouseup', function(e){ + dragging = erasing = false + // if (current_filetool.name != 'shader' && current_filetool.name != 'load' && current_filetool.name != 'save' && is_desktop) { + // cursor_input.focus() + // } + + var ae = document.activeElement + + if (ae !== shader_textarea && ae !== import_textarea) { + if (is_desktop) cursor_input.focus() + } + + if (selecting) { + selection.up(e) + } + else if (transforming) { + transform.up(e) + } + }) + window.addEventListener("touchend", function(){ + if (current_tool.name === "text") { + if (is_desktop) cursor_input.focus() + } + dragging = false + }) + + window.addEventListener('mousedown', function(e){ + // if (current_filetool.name != 'shader' && is_desktop) { cursor_input.focus() } + }) + + document.addEventListener('DOMContentLoaded', function(){ + if (is_desktop) { cursor_input.focus() } + document.body.classList.remove('loading') + }) + + window.onbeforeunload = function() { + // if (changed && !in_iframe()) return "You have edited this drawing." + } + + function in_iframe () { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + } +} + +init() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/clipboard.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/clipboard.js new file mode 100644 index 0000000..98a2f34 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/clipboard.js @@ -0,0 +1,212 @@ +var clipboard = (function () { + + var exports = { + format: "irssi", + importing: false, + visible: false, + canvas: document.createElement("canvas"), + canvas_r: document.createElement("canvas"), + + bind: function () { + import_button.addEventListener("click", exports.import_colorcode) + import_textarea.addEventListener("focus", exports.focus) + import_textarea.addEventListener("blur", exports.blur) + import_textarea.addEventListener('paste', exports.paste) + }, + setFormat: function (name) { + return function () { + clipboard.format = name + if (! clipboard.importing) { clipboard.export_data() } + } + }, + show: function () { import_rapper.style.display = "block"; clipboard.visible = true; changed = false }, + hide: function () { import_rapper.style.display = "none"; clipboard.visible = false }, + focus: function () { + if (! clipboard.importing) { + import_textarea.focus() + import_textarea.select() + } + }, + blur: function () { + }, + + import_mode: function () { + focus() + clipboard.importing = true + format_el.style.display = 'none' + cutoff_warning_el.style.display = 'none' + import_buttons.style.display = "inline" + import_textarea.value = "" + }, + + export_mode: function () { + focus() + clipboard.importing = false + import_buttons.style.display = "none" + format_el.style.display = 'inline' + cutoff_warning_el.style.display = 'none' + clipboard.export_data() + }, + + paste: function (e) { + e.preventDefault() + // images will come through as files + var types = toArray(e.clipboardData.types) + import_textarea.value = "" + types.forEach(function(type, i){ + console.log(type) + // this can be text/plain or text/html.. + if (type.match('text/plain')) { + import_textarea.value = e.clipboardData.getData(type) + } + else { + console.error("unknown type!", item.type) + } + }) + }, + + import_colorcode: function (data, no_undo) { + if (data && data.preventDefault) { + data = import_textarea.value + } + else { + data = data || import_textarea.value + } + + var irssi_style_regex = /^\s*\/exec -out printf ("%b" )?"/; + + // turn irssi style into mirc style + if (data.match(irssi_style_regex)){ + data = data.replace(/\\x03/gm, '\x03') + .replace(/(\\x..)+/gm, unicode.unescapeFromEscapedBytes) + .replace(/\\x5C/g, '\\') + .replace(/\\n/gm, '\n') + .replace(/\\`/gm, '`') + .replace(/\\"/gm, '"') + .replace(/\\\$/gm, '$') + .replace(irssi_style_regex, '') + .replace(/"\s*$/, '') + } + + var to_json = function(string, opts){ + var lines_in = string.split(/\r?\n/) + var lines_out = [] + var w = 0, h = 0 + for (var y = 0; y < lines_in.length; y++) { + var bg = 1, fg = 15 + var cells = [], line = lines_in[y] + if (line.length === 0) { + continue + } else { + for (var x = 0; x < line.length; x++) { + switch (line[x]) { + case "\x02": // ^B (unimplemented) + break + case "\x03": // ^C + var parseColour = function(line, x) { + if (/1[0-5]/.test(line.substr(x, 2))) { + colour = parseInt(line.substr(x, 2)) + return [colour, x + 2] + } else if (/0[0-9]/.test(line.substr(x, 2))) { + colour = parseInt(line.substr(x, 2)) + return [colour, x + 2] + } else if (/[0-9]/.test(line.substr(x, 1))) { + colour = parseInt(line.substr(x, 1)) + return [colour, x + 1] + } else { + return [undefined, x] + } + } + var bg_ = undefined, fg_ = undefined, x_ = x + 1; + [fg_, x_] = parseColour(line, x_) + if (line[x_] === ",") { + [bg_, x_] = parseColour(line, x_ + 1) + } + if ((bg_ == undefined) && (fg_ == undefined)) { + [bg, fg] = [1, 15] + } else { + bg = (bg_ != undefined) ? bg_ : bg; + fg = (fg_ != undefined) ? fg_ : fg; + }; + if (x_ != x) {x = x_ - 1}; break; + case "\x06": // ^F (unimplemented) + break + case "\x0f": // ^O + [bg, fg] = [1, 15]; break; + case "\x16": // ^V + [bg, fg] = [fg, bg]; break; + case "\x1f": // ^_ (unimplemented) + break + default: + cells.push({bg: bg, fg: fg, value: line[x]}) + } + } + if (cells.length > 0) { + if (w < cells.length) { + w = cells.length + } + lines_out.push(cells); h++; + } + } + } + return {h: h, lines: lines_out, w: w} + } + var json = to_json(data, {fg:0, bg:1}) + + if (!no_undo) undo.new() + if (!no_undo) undo.save_rect(0,0, canvas.w, canvas.h) + if (json.w !== canvas.w || json.h !== canvas.h){ + if (!no_undo) undo.save_size(canvas.w, canvas.h) + canvas.resize(json.w, json.h, true) + } + canvas.clear() + + for (var y = 0, line; line = json.lines[y]; y++){ + var row = canvas.aa[y] + for (var x = 0, char; char = line[x]; x++){ + var lex = row[x] + lex.char = char.value + lex.fg = char.fg + lex.bg = char.bg + lex.opacity = 1 + lex.build() + } + } + + current_filetool && current_filetool.blur() + }, + + export_data: function () { + var output + // switch (clipboard.format) { + switch (controls.save_format.value) { + case 'ascii': + output = canvas.ascii() + break + case 'mirc': + output = canvas.mirc({cutoff: 425}) + break + case 'irssi': + output = canvas.irssi({cutoff: 425}) + break + case 'ansi': + output = canvas.ansi() + break + } + if (output.cutoff){ + cutoff_warning_el.style.display = 'block' + } else { + cutoff_warning_el.style.display = 'none' + } + import_textarea.value = output + clipboard.focus() + return output + }, + + } + + return exports + +})() + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/color.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/color.js new file mode 100644 index 0000000..c518327 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/color.js @@ -0,0 +1,106 @@ + +var fillColor = 1 // black + +var color_names = ("white black dark-blue green red dark-red purple orange " + + "yellow lime teal cyan blue magenta dark-gray light-gray").split(" "); + +var all_color_hue_order = "dark-red red orange yellow lime green teal cyan blue dark-blue purple magenta black dark-gray light-gray white".split(" "); +var all_color_inv_order = "cyan teal blue dark-blue purple magenta dark-red red orange yellow lime green white light-gray dark-gray black".split(" "); +var color_hue_order = "dark-red red orange yellow lime cyan teal blue dark-blue purple magenta".split(" "); +var color_inv_order = "cyan teal blue dark-blue purple magenta dark-red red orange yellow lime green".split(" "); +var gray_names = ("black dark-gray light-gray white").split(" ") + +var fire_names = ("black dark-red red orange yellow white cyan").split(" ") +var red_names = ("black dark-red red").split(" ") +var yellow_names = ("black orange yellow white").split(" ") +var green_names = ("teal green lime").split(" ") +var blue_names = ("black dark-blue blue").split(" ") +var purple_names = ("dark-blue purple magenta red").split(" ") +var dark_gray_names = ("black dark-blue teal dark-gray light-gray white").split(" ") +var color_alphabet = "abcdefghijklmnop"; +var colors = {} +color_names.forEach(function(name, i){ + colors[name.replace("-", "")] = i + colors[name] = i +}) +colors.brown = 5 + +function get_inverse (n) { return colors[all_color_inv_order.indexOf(color_names[n])] } + +function mirc_color (n) { return mod(n, 16)|0 } +function mirc_color_reverse (n) { return mod(-(n+1), 16)|0 } +function all_hue (n) { return colors[all_color_hue_order[mod(n, 16)|0]] } +function all_inv_hue (n) { return colors[all_color_inv_order[mod(n, 16)|0]] } +function hue (n) { return colors[color_hue_order[mod(n, 11)|0]] } +function rand_hue () { return colors[color_hue_order[randint(11)]] } +function rand_gray () { return colors[gray_names[randint(4)]] } +function inv_hue (n) { return colors[color_inv_order[mod(n, 11)|0]] } +function gray (n) { return colors[gray_names[mod(n, 4)|0]] } +function fire (n) { return colors[fire_names[mod(n, 7)|0]] } +function red (n) { return colors[red_names[mod(n, 3)|0]] } +function yellow (n) { return colors[yellow_names[mod(n, 4)|0]] } +function green (n) { return colors[green_names[mod(n, 3)|0]] } +function blue (n) { return colors[blue_names[mod(n, 3)|0]] } +function purple (n) { return colors[purple_names[mod(n, 4)|0]] } +function dark_gray (n) { return colors[dark_gray_names[mod(n, 4)|0]] } + +var css_lookup = { + 'rgb(255, 255, 255)': 'A', + 'rgb(0, 0, 0)': 'B', + 'rgb(0, 0, 127)': 'C', + 'rgb(0, 147, 0)': 'D', + 'red': 'E', + 'rgb(127, 0, 0)': 'F', + 'rgb(156, 0, 156)': 'G', + 'rgb(252, 127, 0)': 'H', + 'rgb(255, 255, 0)': 'I', + 'rgb(0, 252, 0)': 'J', + 'rgb(0, 147, 147)': 'K', + 'rgb(0, 255, 255)': 'L', + 'rgb(0, 0, 252)': 'M', + 'rgb(255, 0, 255)': 'N', + 'rgb(127, 127, 127)': 'O', + 'rgb(210, 210, 210)': 'P', +}; +var css_reverse_lookup = {} +Object.keys(css_lookup).forEach(function(color){ + css_reverse_lookup[ css_lookup[color].charCodeAt(0) - 65 ] = color +}) + +var ansi_fg = [ + 97, // white + 30, // black + 34, // dark blue + 32, // green + 91, // light red + 31, // dark red + 35, // purple + 33, // "dark yellow" (orange?) + 93, // "light yellow" + 92, // light green + 36, // cyan (teal?) + 96, // light cyan + 94, // light blue + 95, // light magenta + 90, // dark gray + 37, // light gray +] + +var ansi_bg = [ + 107, // white + 40, // black + 44, // dark blue + 42, // green + 101, // light red + 41, // dark red + 45, // purple + 43, // yellow (orange) + 103, // light yellow + 102, // light green + 46, // cyan (teal?) + 106, // light cyan + 104, // light blue + 105, // light magenta + 100, // dark gray + 47, // light gray +] diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/nopaint.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/nopaint.js new file mode 100644 index 0000000..9011953 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/nopaint.js @@ -0,0 +1,896 @@ +var nopaint = (function(){ + + controls.no = new Tool (nopaint_no_el) + controls.no.use = function(state){ + undo.undo() + controls.paint.focus() + } + controls.no.context = function(e){ + e.preventDefault() + nopaint.turbo() + } + + controls.paint = new Tool (nopaint_paint_el) + controls.paint.use = function(state){ + nopaint.paint() + nopaint_pause_el.classList.toggle("hidden", false) + focused = controls.paint.lex + } + controls.paint.context = function(e){ + e.preventDefault() + nopaint.autoplay() + } + + controls.nopaint_pause = new Tool (nopaint_pause_el) + controls.nopaint_pause.use = function(state){ + // nopaint.pause() + nopaint.autoplay(false) + nopaint_pause_el.classList.toggle("hidden", true) + focused = canvas.aa[0][0] + } + + // use own stepwise clock to drive tweens + oktween.raf = function(){} + + var nopaint = {} + nopaint.debug = true + nopaint.delay = nopaint.normal_delay = 100 + nopaint.turbo_delay = 0 + nopaint.tool = null + nopaint.tools = {} + nopaint.keys = [] + nopaint.weights = [] + nopaint.step = 0 + nopaint.time = 0 + nopaint.timeout = false + nopaint.toggle = function(state){ + var state = typeof state == "boolean" ? state : nopaint_rapper.classList.contains("hidden") + nopaint_rapper.classList.toggle("hidden", ! state) + nopaint_pause_el.classList.toggle("hidden", true) + document.body.classList.toggle("nopaint", state) + return state + } + nopaint.no = function(){ + undo.undo() + nopaint.paint() + } + nopaint.raw_key = controls.paint.lex.raw_key = keys.left_right_key(function(n){ + if (! nopaint.timeout) return + if (n < 0) nopaint.no() + else if (n > 0) nopaint.paint() + else nopaint.pause() + }) + nopaint.pause = nopaint.blur = function(){ + clearTimeout(nopaint.timeout) + nopaint.timeout = 0 + nopaint.step = 0 + } + nopaint.paint = function(){ + var state = undo.new() + delete state.focus + nopaint.pause() + nopaint.switch_tool() + nopaint.go() + } + nopaint.go = function(){ + nopaint.timeout = setTimeout(nopaint.go, nopaint.delay) + oktween.update(nopaint.time) + nopaint.tool.paint( nopaint.step ) + nopaint.time += 1 + nopaint.step += 1 + } + nopaint.switch_tool = function(){ + last_tool = nopaint.tool + last_tool && last_tool.finish() + nopaint.tool = nopaint.get_random_tool( last_tool ) + nopaint.tool.start( last_tool ) + nopaint.debug && console.log("> %s", nopaint.tool.type) + } + nopaint.add_tool = function(fn){ + nopaint.tools[fn.type] = fn + } + nopaint.disable_all_tools = function(){ + Object.keys(nopaint.tools).forEach(function(key){ + nopaint.tools[key].disabled = true + }) + } + nopaint.enable_tools = function(keys){ + keys.forEach(function(key){ + if (nopaint.tools[key]) nopaint.tools[key].disabled = false + }) + } + nopaint.get_random_tool = function( last_tool ){ + var n = rand( nopaint.sum ) + for (var i = 0, _len = nopaint.weights.length; i < _len; i++) { + if (n < nopaint.weights[i] && (! last_tool || nopaint.keys[i] !== last_tool.key)) { + return nopaint.tools[ nopaint.keys[i] ] + } + } + return nopaint.tools[ choice(nopaint.keys) ] + } + nopaint.regenerate_weights = function(){ + nopaint.sum = 0 + nopaint.weights = [] + nopaint.keys = Object.keys( nopaint.tools ).sort(function(a,b){ + return nopaint.tools[b].opt.weight-nopaint.tools[a].opt.weight + }).filter(function(key){ + return ! nopaint.tools[key].disabled + }) + nopaint.keys.forEach(function(key){ + nopaint.sum += nopaint.tools[key].opt.weight + nopaint.weights.push( nopaint.sum ) + }) + } + + nopaint.is_turbo = false + nopaint.turbo = function(state){ + nopaint.is_turbo = typeof state == "boolean" ? state : ! nopaint.is_turbo + nopaint.delay = nopaint.is_turbo ? nopaint.turbo_delay : nopaint.normal_delay + if (nopaint.is_turbo) { + nopaint_no_el.classList.add("locked") + } + else { + nopaint_no_el.classList.remove("locked") + } + } + + nopaint.is_autoplay = false + nopaint.autoplay = function(state){ + nopaint.is_autoplay = typeof state == "boolean" ? state : ! nopaint.is_autoplay + if (nopaint.is_autoplay) { + nopaint_paint_el.classList.add("locked") + if (! nopaint.player) { + nopaint.player = new RandomPlayer () + } + if (! nopaint.timeout) nopaint.paint() + nopaint.player.play() + } + else { + nopaint_paint_el.classList.remove("locked") + nopaint.pause() + nopaint.player && nopaint.player.pause() + } + } + + var NopaintPlayer = Model({ + type: "player", + upload_png: false, + upload_interval: 100, + step: 0, + timeout: null, + delay: function(){ + return nopaint.is_turbo ? randrange(150, 300) : randrange(400, 800) + }, + reset: function(){ + this.no_count = 0 + this.paint_count = 0 + }, + pause: function(){ + clearTimeout(this.timeout) + this.timeout = 0 + }, + play: function(){ + clearTimeout(this.timeout) + var delay = this.delay() + this.timeout = setTimeout(this.play.bind(this), delay) + this.check_fitness() + this.step += 1 + }, + check_fitness: function(){ + switch (this.fitness()) { + case "no": + nopaint.no_count += 1 + nopaint.since_last_no = 0 + nopaint.since_last_paint += 1 + nopaint.no() + break + case "paint": + nopaint.paint_count += 1 + nopaint.since_last_no += 1 + nopaint.since_last_paint = 0 + nopaint.paint() + break + case "screenshot": + if (this.save_as_png) break + console.log("uploading...") + setTimeout(clipboard.upload_png, 0) + // fall thru + default: + nopaint.since_last_no += 1 + nopaint.since_last_paint += 1 + break + } + }, + fitness: function(){}, + }) + + var RandomPlayer = NopaintPlayer.extend({ + type: "random_player", + upload_png: false, + fitness: function(){ + var no_prob = random() + var paint_prob = 1 - no_prob + if (paint_prob < 0.3) { + return "paint" + } + else if (no_prob < 0.5) { + return "no" + } + else if ( this.paint_count > 100 && (this.step % 100) == 99 ) { + return "screenshot" + } + } + }) + + var StylePlayer = NopaintPlayer.extend({ + type: "style_player", + upload_png: false, + fitness: function(){ + var no_prob = random() + var paint_prob = 1 - no_prob + var np, pp + var steps = this.since_last_paint + + if (nopaint.tool.is_brush) { + if (nopaint.tool.is_clone) { + if (steps < randrange(3,8)) return + np = 0.3 + pp = 0.4 + } + else if (nopaint.tool.is_erase) { + if (steps < randrange(2,6)) return + np = 0.3 + pp = 0.4 + } + else { + if (steps < randrange(2,4)) return + np = 0.1 + pp = 0.3 + } + } + if (nopaint.tool.is_shader) { + switch (nopaint.tool.name) { + case "rotate": + case "scale": + if (steps < randrange(2,4)) return + np = 0.1 + pp = 0.2 + break + default: + np = 0.2 + pp = 0.2 + } + } + if (nopaint.tool.is_fill) { + np = 0.4 + pp = 0.1 + } + + if (steps > 10) { + np *= 0.7 + pp *= 1.5 + + if (nopaint.is_turbo) { + np *= 1.2 + pp *= 1.2 + } + } + + if (paint_prob < np) { + return "paint" + } + else if (no_prob < np) { + return "no" + } + else if ( this.paint_count > 100 && (this.step % 100) == 99 ) { + return "screenshot" + } + } + }) + + /* Base models for brushes */ + + var NopaintTool = Model({ + type: "none", + init: function(opt){ + this.opt = opt || {} + }, + start: function(){}, + paint: function(t){}, + update: function(t){}, + finish: function(){}, + }) + + var NopaintBrush = NopaintTool.extend({ + type: "brush", + is_brush: true, + init: function(opt){ + this.opt = opt || {} + this.opt.max_radius = this.opt.max_radius || 10 + this.p = {x: randint(canvas.w), y: randint(canvas.h)} + this.fg = 0 + this.bg = 1 + this.char = " " + this.tweens = [] + }, + + start: function(last_brush){ + this.set_brush_mask() + this.toggle_channels() + this.reset( last_brush ) + this.regenerate() + draw.down({}, null, [this.p.x, this.p.y]) + }, + + paint: function(t){ + this.update(t) + draw.move_toroidal({}, null, [this.p.x, this.p.y]) + }, + + finish: function(){ + this.tweens.forEach(function(t){ t.cancel() }) + this.tweens = [] + }, + + reorient: function(last_brush){ + var a = {}, b + + if (last_brush) { + this.p.x = a.x = randint(canvas.w) + this.p.y = a.y = randint(canvas.h) + } + else { + a.x = this.p.x + a.y = this.p.y + } + + b = this.get_next_point() + + var tween = oktween.add({ + obj: this.p, + from: a, + to: b, + duration: b.duration, + easing: b.easing, + update: b.update, + finished: function(){ + this.iterate() + this.regenerate() + }.bind(this) + }) + this.tweens.push(tween) + }, + + get_next_point: function(){ + var radius = randrange(2, this.opt.max_radius) + var b = {} + b.duration = randrange(1, 7) + b.easing = choice(easings) + b.x = this.p.x + randrange(-radius, radius) + b.y = this.p.y + randrange(-radius, radius) + return b + }, + + set_brush_mask: function(){ + var r = Math.random() + if (r < 0.2) { + brush.mask = blit.square + } + else if (r < 0.6) { + brush.mask = blit.circle + } + else if (r < 0.9) { + brush.mask = blit.cross + } + else{ + brush.mask = blit.inverted_cross + } + }, + + toggle_channels: function(){ + if (Math.random() < 0.001) { controls.bg.use(false) } + else if (! brush.draw_bg && Math.random() < 0.25) { controls.bg.use(true) } + + if (Math.random() < 0.1) { controls.fg.use(false) } + else if (! brush.draw_fg && Math.random() < 0.5) { controls.fg.use(true) } + + if (Math.random() < 0.02) { controls.char.use(false) } + else if (! brush.draw_char && Math.random() < 0.2) { controls.char.use(true) } + }, + + iterate: function( last_brush ){ + this.reorient( last_brush ) + }, + + regenerate: function(){ + brush.load( this ) + brush.generate() + } + }) + + var easings = "linear circ_out circ_in circ_in_out quad_in quad_out quad_in_out".split(" ") + + /* Standard brushes */ + + var SolidBrush = NopaintBrush.extend({ + type: "solid", + + recolor: function(){ + this.fg = this.bg = randint(16) + this.char = " " + }, + + resize: function(m,n){ + m = m || 3 + n = n || 0 + var bw = xrandrange(5, 0, m) + n + brush.resize( round(bw * randrange(0.9, 1.8)) || 1, round(bw) || 1 ) + }, + + reset: function( last_brush ){ + this.opt.max_radius = randrange(5,20) + this.resize() + this.reorient( last_brush ) + this.recolor( last_brush ) + this.regenerate() + }, + + iterate: function( last_brush ){ + this.resize() + this.reorient( last_brush ) + }, + }) + + var EraseBrush = SolidBrush.extend({ + type: "erase", + reset: function( last_brush ){ + this.opt.max_radius = randrange(8, 20) + this.reorient( last_brush ) + this.bg = random() < 0.2 ? colors.white : colors.black + this.char = " " + brush.load( this ) + this.resize(3,2) + }, + }) + + var ShadowBrush = NopaintBrush.extend({ + type: "shadow", + pairs: [ + [ colors.yellow, colors.orange ], + [ colors.orange, colors.darkred ], + [ colors.red, colors.darkred ], + [ colors.lime, colors.green ], + [ colors.cyan, colors.teal ], + [ colors.cyan, colors.blue ], + [ colors.blue, colors.darkblue ], + [ colors.magenta, colors.purple ], + [ colors.lightgray, colors.darkgray ], + [ colors.darkgray, colors.black ], + [ colors.white, colors.lightgray ], + [ colors.white, colors.black ], + ], + shapes: [ + [[0],[1]], + [[0,0],[1,1]], + [[1,0,0],[1,1,1]], + [[0,0,1],[1,1,1]], + [[0,0,0],[1,1,1]], + [[0,0,0,0],[1,1,1,1]], + [[1,0,0,0],[null,1,1,1]], + [[0,0,0,1],[1,1,1,null]], + [[0,0],[1,0],[1,1]], + [[0,0],[0,1],[1,1]], + ], + reset: function( last_brush ){ + var pair = choice(this.pairs) + var shape = choice(this.shapes) + this.reorient( last_brush ) + brush.char = " " + brush.resize(shape[0].length, shape.length) + brush.generate() + brush.rebuild() + brush.forEach(function(lex,x,y){ + if (shape[y][x] == null) { + lex.opacity = 0 + } + else { + lex.fg = lex.bg = pair[ shape[y][x] ] + lex.opacity = 1 + } + lex.build() + }) + }, + regenerate: function(){}, + }) + + var RandomBrush = SolidBrush.extend({ + type: "random", + iterate: function( last_brush ){ + this.reorient( last_brush ) + this.recolor( last_brush ) + }, + }) + + var HueBrush = SolidBrush.extend({ + type: "hue", + recolor: function(){ + this.fg = this.bg = rand_hue() + this.char = " " + }, + }) + + var GrayBrush = SolidBrush.extend({ + type: "gray", + recolor: function(){ + this.fg = this.bg = rand_gray() + this.char = " " + }, + }) + + var LetterBrush = SolidBrush.extend({ + type: "letter", + recolor: function(){ + this.fg = rand_hue() + this.bg = rand_hue() + this.char = choice( unicode.block(letters.charset, 32) ) + }, + }) + + var RandomLetterBrush = LetterBrush.extend({ + type: "random-letter", + iterate: function(){ + if (Math.random() < 0.01) { + this.fg += 1 + } + if (Math.random() < 0.05) { + var n = this.fg + this.fg = this.bg + this.bg = n + } + if (Math.random() < 0.7) { + this.char = choice( unicode.block(letters.charset, 32) ) + } + this.regenerate() + this.__iterate() + }, + update: function(){ + if (Math.random() < 0.3) { + this.char = choice( unicode.block(letters.charset, 32) ) + } + this.regenerate() + }, + }) + + var CloneBrush = SolidBrush.extend({ + type: "clone", + + is_clone: true, + + reset: function( last_brush ){ + this.opt.max_radius = randrange(5, 20) + this.reorient( last_brush ) + this.resize(4,2) + this.clone_random_region() + }, + + clone_random_region: function(x, y){ + var x = randrange(0, canvas.w - brush.w) + var y = randrange(0, canvas.h - brush.h) + this.clone_region(x, y) + }, + + clone_region: function(x, y){ + blit.copy_toroidal_from(canvas, brush, round(x-brush.w/2), round(y-brush.h/2)) + brush.mask(brush) + }, + + iterate: function( last_brush ){ + this.reorient( last_brush ) + }, + + regenerate: function(){}, + }) + + var SmearBrush = CloneBrush.extend({ + type: "smear", + + update: function(){ + var r = random() + var jitter_x = randnullsign() * xrand(2, 2) + var jitter_y = randnullsign() * xrand(2, 2) + this.clone_region( this.p.x + jitter_x, this.p.y + jitter_y ) + }, + + iterate: function( last_brush ){ + this.resize(4, 2) + this.update() + this.reorient( last_brush ) + } + }) + + var StarsTool = NopaintBrush.extend({ + type: "stars", + chars: "....,,'''*", + + start: function(last_brush){ + this.reorient( last_brush ) + }, + + paint: function(t){ + if (Math.random() < 0.5) { + var lex = canvas.get(this.p.x, this.p.y) + undo.save_lex(lex.x, lex.y, lex) + lex.fg = rand_hue() + // lex.bg = colors.black + lex.char = choice(this.chars) + lex.build() + } + }, + }) + + /* Fill tool */ + + var FillTool = NopaintTool.extend({ + type: "fill", + rate: 25, + is_fill: true, + start: function(){ + this.fill() + }, + paint: function(t){ + if ((t % this.rate) == this.rate-1) { + this.fill() + } + }, + recolor: function(){ + this.fg = this.bg = randint(16) + this.char = " " + this.opacity = 1 + }, + fill: function(){ + var x = randint(canvas.w) + var y = randint(canvas.h) + this.recolor() + draw.fill(this, x, y) + } + }) + + var FillLetterTool = FillTool.extend({ + type: "fill-letter", + rate: 25, + recolor: function(){ + this.fg = randint(16) + this.bg = randint(16) + this.char = choice( unicode.block(letters.charset, 32) ) + this.opacity = 1 + }, + }) + + /* Shader Tools */ + + var ShaderTool = NopaintTool.extend({ + type: "shader", + speed: 3, + is_shader: true, + is_recursive: false, + start: function(){ + undo.save_rect(0, 0, canvas.w, canvas.h) + this.canvas = canvas.clone() + }, + paint: function(t){ + if ((t % this.speed) == 0) { + var w = canvas.w + var h = canvas.h + var lex + if (this.is_recursive) { + this.canvas.assign(canvas) + } + this.before_shade() + for (var x = 0; x < w; x++) { + for (var y = 0; y < h; y++) { + lex = canvas.get(x, y) + if (! this.shade( this.canvas, canvas, lex, x, y, w, h )) { + lex.build() + } + } + } + } + }, + before_shade: function(){}, + shade: function(src, dest, lex, x, y, w, h){}, + finish: function(){ + this.canvas.demolish() + } + }) + + var ColorizeTool = ShaderTool.extend({ + type: "colorize", + fns: [mirc_color_reverse,hue,inv_hue,gray,fire,red,yellow,green,blue,purple,dark_gray], + speed: 5, + start: function(){ + this.__start() + this.i = randint(this.fns.length) + }, + before_shade: function(){ + this.i = (this.i + 1) % this.fns.length + this.fn = this.fns[this.i] + }, + shade: function(src, dest, lex, x, y, w, h){ + lex.bg = this.fn( lex.bg ) + return false + }, + }) + + var TranslateTool = ShaderTool.extend({ + type: "translate", + dx: 0, + dy: 0, + speed: 3, + start: function(){ + this.__start() + this.dx = randint(3)-1 + this.dy = randint(3)-1 + this.x = this.y = 0 + if (! this.dx && ! this.dy) { + this.dx = 1 + this.dy = 0 + } + }, + before_shade: function(){ + this.x += this.dx + this.y += this.dy + }, + shade: function(src, dest, lex, x, y, w, h){ + var copy = src.get(x+this.x, y+this.y) + lex.assign(copy) + return true + }, + }) + + var SliceTool = ShaderTool.extend({ + type: "slice", + dx: 0, + dy: 0, + speed: 1, + is_recursive: true, + start: function(){ + this.__start() + this.is_y = Math.random() > 0.3 + this.limit = this.is_y ? canvas.h : canvas.w + this.position = randint(this.limit) + this.direction = 1 + }, + before_shade: function(){ + if (Math.random() < 0.6) { + this.position = mod(this.position + 1, this.limit) + } + if (Math.random() > 0.8) { + this.direction = randsign() + } + }, + shade: function(src, dest, lex, x, y, w, h){ + if (this.is_y) { + if (y >= this.position) { + var copy = src.get(x + this.direction, y) + lex.assign(copy) + } + } + else if (x >= this.position) { + var copy = src.get(x, y + this.direction) + lex.assign(copy) + } + return true + }, + }) + + var ScaleTool = ShaderTool.extend({ + type: "scale", + scale: 1, + dscale: 0, + speed: 3, + start: function(){ + this.__start() + var sign = randsign() + this.x_scale = 1 + this.y_scale = 1 + this.dx_scale = randsign() * randrange(0.0005, 0.01) + var r = Math.random() + if (r < 0.333) { + this.dy_scale = this.dx_scale * randrange(0.85, 1.25) + } + else if (r < 0.666) { + this.dy_scale = this.dx_scale + } + else { + this.dy_scale = randsign() * randrange(0.0005, 0.01) + } + }, + before_shade: function(){ + this.x_scale += this.dx_scale + this.y_scale += this.dy_scale + }, + shade: function(src, dest, lex, x, y, w, h){ + x = (x/w) * 2 - 1 + y = (y/h) * 2 - 1 + x *= this.x_scale + y *= this.y_scale + x = (x + 1) / 2 * w + y = (y + 1) / 2 * h + var copy = src.get(x, y) + lex.assign(copy) + return true + }, + }) + + var RotateTool = ShaderTool.extend({ + type: "rotate", + theta: 0, + d_theta: 0, + + start: function(){ + this.__start() + var sign = randsign() + this.theta = 0 + this.d_theta = randsign() * randrange(0.001, 0.05) + }, + before_shade: function(){ + this.theta += this.d_theta + }, + shade: function(src, dest, lex, x, y, w, h){ + x = (x/w) * 2 - 1 + y = (y/h) * 2 - 1 + var ca = cos(this.theta) + var sa = sin(this.theta) + var a = x * ca - y * sa + var b = x * sa + y * ca + x = (a + 1) / 2 * w + y = (b + 1) / 2 * h + var copy = src.get(x, y) + lex.assign(copy) + return true + }, + }) + + var CycleTool = ShaderTool.extend({ + type: "cycle", + n: 0, + speed: 5, + is_recursive: true, + start: function(){ + this.__start() + this.n = randsign() + if (random() < 0.2) this.n *= randint(15) + }, + shade: function(src, dest, lex, x, y){ + lex.bg += this.n + return false + }, + }) + + nopaint.add_tool( new SolidBrush({ weight: 5 }) ) + nopaint.add_tool( new ShadowBrush({ weight: 10 }) ) + nopaint.add_tool( new EraseBrush({ weight: 5 }) ) + nopaint.add_tool( new RandomBrush({ weight: 4 }) ) + nopaint.add_tool( new HueBrush({ weight: 5 }) ) + nopaint.add_tool( new GrayBrush({ weight: 5 }) ) + nopaint.add_tool( new LetterBrush({ weight: 2 }) ) + nopaint.add_tool( new RandomLetterBrush({ weight: 12 }) ) + nopaint.add_tool( new CloneBrush({ weight: 8 }) ) + nopaint.add_tool( new SmearBrush({ weight: 10 }) ) + nopaint.add_tool( new FillTool({ weight: 3 }) ) + nopaint.add_tool( new FillLetterTool({ weight: 6 }) ) + nopaint.add_tool( new StarsTool({ weight: 2 }) ) + nopaint.add_tool( new TranslateTool({ weight: 4 }) ) + nopaint.add_tool( new CycleTool({ weight: 1 }) ) + nopaint.add_tool( new ScaleTool({ weight: 3 }) ) + nopaint.add_tool( new RotateTool({ weight: 3 }) ) + nopaint.add_tool( new SliceTool({ weight: 4 }) ) + nopaint.add_tool( new ColorizeTool({ weight: 1 }) ) + nopaint.regenerate_weights() + + nopaint.toggle(true) + + nopaint.player = new StylePlayer () + + return nopaint +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/oktween.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/oktween.js new file mode 100644 index 0000000..41edbb0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/oktween.js @@ -0,0 +1,167 @@ +/* + oktween.add({ + obj: el.style, + units: "px", + from: { left: 0 }, + to: { left: 100 }, + duration: 1000, + easing: oktween.easing.circ_out, + update: function(obj){ + console.log(obj.left) + } + finished: function(){ + console.log("done") + } + }) +*/ + +var oktween = (function(){ + var oktween = {} + var tweens = oktween.tweens = [] + var last_t = 0 + var id = 0 + oktween.speed = 1 + oktween.raf = requestAnimationFrame + oktween.add = function(tween){ + tween.id = id++ + tween.obj = tween.obj || {} + if (tween.easing) { + if (typeof tween.easing == "string") { + tween.easing = oktween.easing[tween.easing] + } + } + else { + tween.easing = oktween.easing.linear + } + if (! ('from' in tween) && ! ('to' in tween)) { + tween.keys = [] + } + else if (! ('from' in tween) ) { + tween.from = {} + tween.keys = Object.keys(tween.to) + tween.keys.forEach(function(prop){ + tween.from[prop] = parseFloat(tween.obj[prop]) + }) + } + else { + tween.keys = Object.keys(tween.from) + } + tween.delay = tween.delay || 0 + tween.start = last_t + tween.delay + tween.done = false + tween.after = tween.after || [] + tween.then = function(fn){ tween.after.push(fn); return tween } + tween.cancel = function(){ + var index = tweens.indexOf(tween) + if (index != -1) tweens.splice(index, 1) + tween.obj = null + tween.after = null + tween.done = null + } + tween.tick = 0 + tween.skip = tween.skip || 1 + tween.dt = 0 + tweens.push(tween) + return tween + } + oktween.update = function(t) { + oktween.raf(oktween.update) + last_t = t * oktween.speed + if (tweens.length == 0) return + var done = false + tweens.forEach(function(tween, i){ + var dt = Math.min(1.0, (t - tween.start) / tween.duration) + tween.tick++ + if (dt < 0 || (dt < 1 && (tween.tick % tween.skip != 0))) return + var ddt = tween.dt = tween.easing(dt) + tween.keys.forEach(function(prop){ + val = lerp( ddt, tween.from[prop], tween.to[prop] ) + if (tween.round) val = Math.round(val) + if (tween.units) val = (Math.round(val)) + tween.units + tween.obj[prop] = val + }) + tween.update && tween.update(tween.obj, dt) + if (dt == 1) { + tween.finished && tween.finished(tween) + if (tween.after.length) { + var twn = tween.after.shift() + twn.obj = twn.obj || tween.obj + twn.after = tween.after + oktween.add(twn) + } + if (tween.loop) { + tween.start = t + tween.delay + } + else { + done = tween.done = true + } + } + }) + if (done) { + tweens = tweens.filter(function(tween){ return ! tween.done }) + } + } + function lerp(n,a,b){ return (b-a)*n+a } + + // requestAnimationFrame(oktween.update) + + oktween.easing = { + linear: function(t){ + return t + }, + circ_out: function(t) { + return Math.sqrt(1 - (t = t - 1) * t) + }, + circ_in: function(t){ + return -(Math.sqrt(1 - (t * t)) - 1) + }, + circ_in_out: function(t) { + return ((t*=2) < 1) ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1) + }, + quad_in: function(n){ + return Math.pow(n, 2) + }, + quad_out: function(n){ + return n * (n - 2) * -1 + }, + quad_in_out: function(n){ + n = n * 2 + if(n < 1){ return Math.pow(n, 2) / 2 } + return -1 * ((--n) * (n - 2) - 1) / 2 + }, + cubic_bezier: function (mX1, mY1, mX2, mY2) { + function A(aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } + function B(aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; } + function C(aA1) { return 3.0 * aA1; } + + // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. + function CalcBezier(aT, aA1, aA2) { + return ((A(aA1, aA2)*aT + B(aA1, aA2))*aT + C(aA1))*aT; + } + + // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + function GetSlope(aT, aA1, aA2) { + return 3.0 * A(aA1, aA2)*aT*aT + 2.0 * B(aA1, aA2) * aT + C(aA1); + } + + function GetTForX(aX) { + // Newton raphson iteration + var aGuessT = aX; + for (var i = 0; i < 10; ++i) { + var currentSlope = GetSlope(aGuessT, mX1, mX2); + if (currentSlope == 0.0) return aGuessT; + var currentX = CalcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + + return function(aX) { + if (mX1 == mY1 && mX2 == mY2) return aX; // linear + return CalcBezier(aX, mY1, mY2); + } + } + } + + return oktween +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/unicode.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/unicode.js new file mode 100644 index 0000000..0d4af8c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/unicode.js @@ -0,0 +1,203 @@ +var unicode = (function(){ + var UNICODE_BLOCK_LIST = [ + 0x0020, 0x007F, "Basic Latin", + 0x0080, 0x00FF, "Latin-1 Supplement", + 0x2500, 0x257F, "Box Drawing", + 0x2580, 0x259F, "Block Elements", + ] + var UNICODE_BLOCK_COUNT = UNICODE_BLOCK_LIST.length / 3 + var UNICODE_LOOKUP = {} + for (var i = 0, len = UNICODE_BLOCK_LIST.length; i < len; i += 3) { + UNICODE_LOOKUP[ UNICODE_BLOCK_LIST[i+2] ] = [ UNICODE_BLOCK_LIST[i], UNICODE_BLOCK_LIST[i+1] ] + } + + function block (name, n){ + var b = UNICODE_LOOKUP[name] + if (! b) return "" + return range.apply(null, b).map(function(n){ return String.fromCharCode(n) }) + } + function entities (a) { + return a.map(function(k){ return "&#" + k.join(";&#") + ";" }).join("
") + } + function index (j) { + return [ UNICODE_BLOCK_LIST[j*3], UNICODE_BLOCK_LIST[j*3+1], UNICODE_BLOCK_LIST[j*3+2], [] ] + } + function range(m,n){ + if (m > n) return [] + var a = new Array (n-m) + for (var i = 0, j = m; j <= n; i++, j++) { + a[i] = j + } + return a + } + + // [ 0xE3, 0x81, 0x82, 0xE3, 0x81, 0x84 ] => '\xE3\x81\x82\xE3\x81\x84' + // [ 0343, 0201, 0202, 0343, 0201, 0204 ] => '\343\201\202\343\201\204' + function convertBytesToEscapedString(data_bytes, base) { + var escaped = ''; + for (var i = 0; i < data_bytes.length; ++i) { + var prefix = (base == 16 ? "\\x" : "\\"); + var num_digits = base == 16 ? 2 : 3; + var escaped_byte = prefix + formatNumber(data_bytes[i], base, num_digits) + escaped += escaped_byte; + } + return escaped; + } + // r'\xE3\x81\x82\xE3\x81\x84' => [ 0xE3, 0x81, 0x82, 0xE3, 0x81, 0x84 ] + // r'\343\201\202\343\201\204' => [ 0343, 0201, 0202, 0343, 0201, 0204 ] + function convertEscapedBytesToBytes(str) { + var parts = str.split("\\x"); + parts.shift(); // Trim the first element. + var codes = []; + var max = Math.pow(2, 8); + for (var i = 0; i < parts.length; ++i) { + var code = parseInt(parts[i], 16); + if (code >= 0 && code < max) { + codes.push(code); + } else { + // Malformed code ignored. + } + } + return codes; + } + // [ 0x3042, 0x3044 ] => "あい" + function convertUnicodeCodePointsToString(unicode_codes) { + var utf16_codes = convertUnicodeCodePointsToUtf16Codes(unicode_codes); + return convertUtf16CodesToString(utf16_codes); + } + // 0x3042 => [ 0xE3, 0x81, 0x82 ] + function convertUnicodeCodePointToUtf8Bytes(unicode_code) { + var utf8_bytes = []; + if (unicode_code < 0x80) { // 1-byte + utf8_bytes.push(unicode_code); + } else if (unicode_code < (1 << 11)) { // 2-byte + utf8_bytes.push((unicode_code >>> 6) | 0xC0); + utf8_bytes.push((unicode_code & 0x3F) | 0x80); + } else if (unicode_code < (1 << 16)) { // 3-byte + utf8_bytes.push((unicode_code >>> 12) | 0xE0); + utf8_bytes.push(((unicode_code >> 6) & 0x3f) | 0x80); + utf8_bytes.push((unicode_code & 0x3F) | 0x80); + } else if (unicode_code < (1 << 21)) { // 4-byte + utf8_bytes.push((unicode_code >>> 18) | 0xF0); + utf8_bytes.push(((unicode_code >> 12) & 0x3F) | 0x80); + utf8_bytes.push(((unicode_code >> 6) & 0x3F) | 0x80); + utf8_bytes.push((unicode_code & 0x3F) | 0x80); + } + return utf8_bytes; + } + // [ 0x3042, 0x3044 ] => [ 0x3042, 0x3044 ] + // [ 0xD840, 0xDC0B ] => [ 0x2000B ] // A surrogate pair. + function convertUnicodeCodePointsToUtf16Codes(unicode_codes) { + var utf16_codes = []; + for (var i = 0; i < unicode_codes.length; ++i) { + var unicode_code = unicode_codes[i]; + if (unicode_code < (1 << 16)) { + utf16_codes.push(unicode_code); + } else { + var first = ((unicode_code - (1 << 16)) / (1 << 10)) + 0xD800; + var second = (unicode_code % (1 << 10)) + 0xDC00; + utf16_codes.push(first) + utf16_codes.push(second) + } + } + return utf16_codes; + } + // [ 0xE3, 0x81, 0x82, 0xE3, 0x81, 0x84 ] => [ 0x3042, 0x3044 ] + function convertUtf8BytesToUnicodeCodePoints(utf8_bytes) { + var unicode_codes = []; + var unicode_code = 0; + var num_followed = 0; + for (var i = 0; i < utf8_bytes.length; ++i) { + var utf8_byte = utf8_bytes[i]; + if (utf8_byte >= 0x100) { + // Malformed utf8 byte ignored. + } else if ((utf8_byte & 0xC0) == 0x80) { + if (num_followed > 0) { + unicode_code = (unicode_code << 6) | (utf8_byte & 0x3f); + num_followed -= 1; + } else { + // Malformed UTF-8 sequence ignored. + } + } else { + if (num_followed == 0) { + unicode_codes.push(unicode_code); + } else { + // Malformed UTF-8 sequence ignored. + } + if (utf8_byte < 0x80){ // 1-byte + unicode_code = utf8_byte; + num_followed = 0; + } else if ((utf8_byte & 0xE0) == 0xC0) { // 2-byte + unicode_code = utf8_byte & 0x1f; + num_followed = 1; + } else if ((utf8_byte & 0xF0) == 0xE0) { // 3-byte + unicode_code = utf8_byte & 0x0f; + num_followed = 2; + } else if ((utf8_byte & 0xF8) == 0xF0) { // 4-byte + unicode_code = utf8_byte & 0x07; + num_followed = 3; + } else { + // Malformed UTF-8 sequence ignored. + } + } + } + if (num_followed == 0) { + unicode_codes.push(unicode_code); + } else { + // Malformed UTF-8 sequence ignored. + } + unicode_codes.shift(); // Trim the first element. + return unicode_codes; + } + // [ 0x3042, 0x3044 ] => "あい" + function convertUtf16CodesToString(utf16_codes) { + var unescaped = ''; + for (var i = 0; i < utf16_codes.length; ++i) { + unescaped += String.fromCharCode(utf16_codes[i]); + } + return unescaped; + } + // 0xff => "ff" + // 0xff => "377" + function formatNumber(number, base, num_digits) { + var str = number.toString(base).toUpperCase(); + for (var i = str.length; i < num_digits; ++i) { + str = "0" + str; + } + return str; + } + + // encodes unicode characters as escaped bytes - \xFF + // encodes ONLY non-ascii characters + function escapeToEscapedBytes (txt) { + var escaped_txt = "", kode, utf8_bytes + for (var i = 0; i < txt.length; i++) { + kode = txt.charCodeAt(i) + if (kode > 0x7f) { + utf8_bytes = convertUnicodeCodePointToUtf8Bytes(kode) + escaped_txt += convertBytesToEscapedString(utf8_bytes, 16) + } + else { + escaped_txt += txt[i] + } + } + return escaped_txt + } + + // convert \xFF\xFF\xFF to unicode + function unescapeFromEscapedBytes (str) { + var data_bytes = convertEscapedBytesToBytes(str); + var unicode_codes = convertUtf8BytesToUnicodeCodePoints(data_bytes); + return convertUnicodeCodePointsToString(unicode_codes); + } + + return { + raw: UNICODE_BLOCK_LIST, + lookup: UNICODE_LOOKUP, + index: index, + range: range, + block: block, + escapeToEscapedBytes: escapeToEscapedBytes, + unescapeFromEscapedBytes: unescapeFromEscapedBytes, + } +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/util.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/util.js new file mode 100644 index 0000000..ca97630 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ext/util.js @@ -0,0 +1,199 @@ +if (window.$) { + $.fn.int = function(){ return parseInt($(this).val(),10) } + $.fn.float = function(){ return parseFloat($(this).val()) } + $.fn.string = function(){ return trim($(this).val()) } + $.fn.enable = function() { return $(this).attr("disabled",null) } + $.fn.disable = function() { return $(this).attr("disabled","disabled") } +} + +function noop(){} +function trim(s){ return s.replace(/^\s+/,"").replace(/\s+$/,"") } + +var E = Math.E +var PI = Math.PI +var PHI = (1+Math.sqrt(5))/2 +var TWO_PI = PI*2 +var LN10 = Math.LN10 +function clamp(n,a,b){ return n= 0.5 ? -1 : 1 } +function randnullsign(){ var r = random(); return r < 0.333 ? -1 : r < 0.666 ? 0 : 1 } + +function xrandom(exp){ return Math.pow(Math.random(), exp) } +function xrand(exp,n){ return (xrandom(exp)*n) } +function xrandint(exp,n){ return rand(exp,n)|0 } +function xrandrange(exp,a,b){ return a + xrand(exp,b-a) } + +function choice(a){ return a[randint(a.length)] } +function deg(n){ return n*180/PI } +function rad(n){ return n*PI/180 } +function xor(a,b){ a=!!a; b=!!b; return (a||b) && !(a&&b) } +function mod(n,m){ n = n % m; return n < 0 ? (m + n) : n } +function modi(n,m){ return floor(mod(n,m)) } +function dist(x0,y0,x1,y1){ return sqrt(pow(x1-x0,2)+pow(y1-y0,2)) } +function angle(x0,y0,x1,y1){ return atan2(y1-y0,x1-x0) } +function avg(m,n,a){ return (m*(a-1)+n)/a } +function quantize(a,b){ return floor(a/b)*b } +function quantile(a,b){ return floor(a/b) } + +function pixel(x,y){ return 4*(mod(y,actual_h)*actual_w+mod(x,actual_w)) } +function rgbpixel(d,x,y){ + var p = pixel(~~x,~~y) + r = d[p] + g = d[p+1] + b = d[p+2] + a = d[p+3] +} +function fit(d,x,y){ rgbpixel(d,x*actual_w/w,y*actual_h/h) } + +function step(a, b){ + return (b >= a) + 0 + // ^^ bool -> int +} + +function julestep (a,b,n) { + return clamp(norm(n,a,b), 0.0, 1.0); +} + +// hermite curve apparently +function smoothstep(min,max,n){ + var t = clamp((n - min) / (max - min), 0.0, 1.0); + return t * t * (3.0 - 2.0 * t) +} + +function toArray(a){ return Array.prototype.slice.call(a) } +function shuffle(a){ + for (var i = a.length; i > 0; i--){ + var r = randint(i) + var swap = a[i-1] + a[i-1] = a[r] + a[r] = swap + } + return a +} +function reverse(a){ + var reversed = [] + for (var i = 0, _len = a.length-1; i <= _len; i++){ + reversed[i] = a[_len-i] + } + return reversed +} +function deinterlace(a){ + var odd = [], even = [] + for (var i = 0, _len = a.length; i < _len; i++) { + if (i % 2) even.push(a[i]) + else odd.push(a[i]) + } + return [even, odd] +} +function weave(a){ + var aa = deinterlace(a) + var b = [] + aa[0].forEach(function(el){ b.push(el) }) + reverse(aa[1]).forEach(function(el){ b.push(el) }) + return b +} +function cssRule (selector, declaration) { + var x = document.styleSheets, y = x.length-1; + x[y].insertRule(selector+"{"+declaration+"}", x[y].cssRules.length); +} + +// easing functions +function circular (t) { return Math.sqrt( 1 - ( --t * t ) ) } +function quadratic (t) { return t * ( 2 - t ) } +function back (t) { + var b = 4; + return ( t = t - 1 ) * t * ( ( b + 1 ) * t + b ) + 1; +} +function bounce (t) { + if (t >= 1) return 1; + if ( ( t /= 1 ) < ( 1 / 2.75 ) ) { + return 7.5625 * t * t; + } else if ( t < ( 2 / 2.75 ) ) { + return 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + 0.75; + } else if ( t < ( 2.5 / 2.75 ) ) { + return 7.5625 * ( t -= ( 2.25 / 2.75 ) ) * t + 0.9375; + } else { + return 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + 0.984375; + } +} +function elastic (t) { + var f = 0.22, + e = 0.4; + + if ( t === 0 ) { return 0; } + if ( t == 1 ) { return 1; } + + return ( e * Math.pow( 2, - 10 * t ) * Math.sin( ( t - f / 4 ) * ( 2 * Math.PI ) / f ) + 1 ); +} + +Model=function a(b,c,d,e){function f(){var a=this,f={};a.on=function(a,b){(f[a]|| +(f[a]=[])).push(b)},a.trigger=function(a,b){for(var c=f[a],d=0;c&&d-1;)d.splice(c +,1);f[a]=b?d:[]};for(c in b)d=b[c],a[c]=typeof d=="function"?function(){return( +d=this.apply(a,arguments))===e?a:d}.bind(d):d;a.init&&a.init.apply(a,arguments) +}return f.extend=function(f){d={};for(c in b)d[c]=b[c];for(c in f)d[c]=f[c],b[c +]!==e&&(d["__"+c]=b[c]);return a(d)},f},typeof module=="object"&&(module.exports +=Model); // c-{{{-< + +function defaults (dest, src) { + dest = dest || {} + for (var i in src) { + dest[i] = typeof dest[i] == 'undefined' ? src[i] : dest[i] + } + return dest +} + +function setSelectionRange(input, selectionStart, selectionEnd) { + if (input.setSelectionRange) { + input.focus(); + input.setSelectionRange(selectionStart, selectionEnd); + } + else if (input.createTextRange) { + var range = input.createTextRange(); + range.collapse(true); + range.moveEnd('character', selectionEnd); + range.moveStart('character', selectionStart); + range.select(); + } +} +function setCaretToPos(input, pos) { + setSelectionRange(input, pos, pos); +} + +// Naive useragent detection pattern +var is_iphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) +var is_ipad = (navigator.userAgent.match(/iPad/i)) +var is_android = (navigator.userAgent.match(/Android/i)) +var is_mobile = is_iphone || is_ipad || is_android +var is_desktop = ! is_mobile; diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/gfx.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/gfx.js new file mode 100644 index 0000000..1bf9034 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/gfx.js @@ -0,0 +1,387 @@ + +var blit = (function(){ + var blit = {} + blit.and = blit.atop = function(A, B, x, y){ + x = x || 0 ; y = y || 0 + B.forEach(function(lex, u, v){ + var cell = A.getCell(u+x, v+y) + if (cell && lex.opacity > 0) { + cell.assign(lex) + } + }) + } + blit.or = blit.under = function(A, B, x, y){ + x = x || 0 ; y = y || 0 + B.forEach(function(lex, u, v){ + var cell = A.getCell(u+x, v+y) + if (cell && cell.opacity == 0) { + cell.assign(lex) + } + }) + } + // copy the region of A beginning at x,y into B + blit.copy_from = function(A, B, x, y){ + x = x || 0 ; y = y || 0 + B.forEach(function(lex, u, v){ + var cell = A.getCell(u+x, v+y) + if (cell) { + lex.assign(cell) + } + }) + } + blit.copy_toroidal_from = function(A, B, x, y){ + x = x || 0 ; y = y || 0 + B.forEach(function(lex, u, v){ + var cell = A.get(u+x, v+y) + if (cell) { + lex.assign(cell) + } + }) + } + blit.copy_to = function(A, B, x, y){ + x = x || 0 ; y = y || 0 + B.forEach(function(lex, u, v){ + var cell = A.getCell(u+x, v+y) + if (cell) { + cell.assign(lex) + } + }) + } + blit.invert = function(A, B, x, y){ + x = x || 0 ; y = y || 0 + B.forEach(function(lex, u, v){ + var cell = A.getCell(u+x, v+y) + if (cell && lex.opacity > 0) { + cell.fg = get_inverse(cell.fg) + cell.bg = get_inverse(cell.bg) + } + }) + } + var distance_rect = function(x, y, ratio){ + return Math.sqrt((Math.pow(y * ratio, 2)) + Math.pow(x, 2)) + } + var distance_square = function(x, y, ratio){ + return Math.sqrt((Math.pow(y * ratio, 2)) + Math.pow(x * ratio, 2)) + } + blit.circle = function(A, lex){ + var hw = brush.w/2, hh = brush.h/2 + var ratio, distance + + if (brush.w === brush.h){ + distance = distance_square + ratio = hw / hh * (brush.w === 3 || brush.w === 5 ? 1.2 : 1.05) + } else { + distance = distance_rect + ratio = hw / hh + } + + A.forEach(function(lex,x,y) { + if (distance(x - hw + 0.5, y - hh + 0.5, ratio) > hw){ + lex.clear() + } + }) + } + blit.cross = function(A, lex){ + A.forEach(function(lex,x,y) { + if ((x+y)%2) { + lex.clear() + } + }) + } + blit.inverted_cross = function(A, lex){ + // 1x1 brush should still draw something + if (A.w == 1 && A.h == 1) { + return + } + A.forEach(function(lex,x,y) { + if (!((x+y)%2)) { + lex.clear() + } + }) + } + blit.square = function(A, lex){ + // i.e. no transparency + } + return blit +})() + +var draw = (function(){ + + var last_point = [0,0] + + function down (e, lex, point) { + var w = canvas.w, h = canvas.h + erasing = (e.which == "3" || e.ctrlKey) + changed = true + if (e.shiftKey) { + line (lex, last_point, point, erasing) + if (mirror_x) { + line(lex, [w-last_point[0], last_point[1]], [w-point[0], point[1]], erasing) + } + if (mirror_y) { + line(lex, [last_point[0], h-last_point[1]], [point[0], h-point[1]], erasing) + } + if (mirror_x && mirror_y) { + line(lex, [w-last_point[0], h-last_point[1]], [w-point[0], h-point[1]], erasing) + } + } + else { + stamp (canvas, brush, point[0], point[1], erasing) + if (mirror_x) { + stamp (canvas, brush, w-point[0], point[1], erasing) + } + if (mirror_y) { + stamp (canvas, brush, point[0], h-point[1], erasing) + } + if (mirror_x && mirror_y) { + stamp (canvas, brush, w-point[0], h-point[1], erasing) + } + } + last_point[0] = point[0] + last_point[1] = point[1] + } + + function set_last_point (e, point) { + last_point[0] = point[0] + last_point[1] = point[1] + } + + function move (e, lex, point) { + var w = canvas.w, h = canvas.h + line(lex, last_point, point, erasing) + if (mirror_x) { + line(lex, [w-last_point[0], last_point[1]], [w-point[0], point[1]], erasing) + } + if (mirror_y) { + line(lex, [last_point[0], h-last_point[1]], [point[0], h-point[1]], erasing) + } + if (mirror_x && mirror_y) { + line(lex, [w-last_point[0], h-last_point[1]], [w-point[0], h-point[1]], erasing) + } + + last_point[0] = point[0] + last_point[1] = point[1] + } + + function move_toroidal (e, lex, point) { + var w = canvas.w, h = canvas.h + var src_x_quantile = quantile( last_point[0], w ) + var src_y_quantile = quantile( last_point[1], h ) + var dst_x_quantile = quantile( point[0], w ) + var dst_y_quantile = quantile( point[1], h ) + var src_x_mod = mod( last_point[0], w ) + var src_y_mod = mod( last_point[1], h ) + var dst_x_mod = mod( point[0], w ) + var dst_y_mod = mod( point[1], h ) + // if we've moved across the edge of the board, draw two lines + if (src_x_quantile != dst_x_quantile || src_y_quantile != dst_y_quantile) { + var xa, ya + if (src_x_quantile < dst_x_quantile) { + xa = [ + [src_x_mod, dst_x_mod + w], + [src_x_mod-w, dst_x_mod], + ] + } + else if (src_x_quantile == dst_x_quantile) { + xa = [ + [src_x_mod, dst_x_mod], + [src_x_mod, dst_x_mod], + ] + } + else { + xa = [ + [src_x_mod, dst_x_mod-w], + [src_x_mod+w, dst_x_mod], + ] + } + + if (src_y_quantile < dst_y_quantile) { + ya = [ + [src_y_mod, dst_y_mod + h], + [src_y_mod-h, dst_y_mod], + ] + } + else if (src_y_quantile == dst_y_quantile) { + ya = [ + [src_y_mod, dst_y_mod], + [src_y_mod, dst_y_mod], + ] + } + else { + ya = [ + [src_y_mod, dst_y_mod-h], + [src_y_mod+h, dst_y_mod], + ] + } + line(lex, [ xa[0][0], ya[0][0] ], [ xa[0][1], ya[0][1] ], erasing) + line(lex, [ xa[1][0], ya[1][0] ], [ xa[1][1], ya[1][1] ], erasing) + } + else { + var x_a = mod( last_point[0], w ) + var y_a = mod( last_point[1], h ) + var x_b = mod( point[0], w ) + var y_b = mod( point[1], h ) + var last_point_mod = [x_b, y_b], point_mod = [x_a, y_a] + line(lex, last_point_mod, point_mod, erasing) + // if (mirror_x) { + // line(lex, [w-last_point_mod[0], last_point_mod[1]], [w-point_mod[0], point_mod[1]], erasing) + // } + // if (mirror_y) { + // line(lex, [last_point_mod[0], h-last_point_mod[1]], [point_mod[0], h-point_mod[1]], erasing) + // } + } + last_point[0] = point[0] + last_point[1] = point[1] + // y = point.y + } + + function point (lex, x, y, erasing) { + stamp (canvas, brush, x, y, erasing) + } + + function line (lex, a, b, erasing) { + var len = dist(a[0], a[1], b[0], b[1]) + var bw = 1 + var x, y, i; + for (var i = 0; i <= len; i += bw) { + x = lerp(i / len, a[0], b[0]) + y = lerp(i / len, a[1], b[1]) + stamp (canvas, brush, x, y, erasing) + } + } + + function stamp (canvas, brush, x, y, erasing) { + var hh = brush.w/2|0 + brush.forEach(function(lex, s, t){ + s = round( s + x-hh ) + t = round( t + y-hh ) + if (s >= 0 && s < canvas.w && t >= 0 && t < canvas.h) { + if (lex.opacity === 0 && lex.char === ' ') return; + var aa = canvas.aa[t][s] + undo.save_lex(s, t, aa) + if (erasing) { + aa.erase(lex) + } + else { + aa.stamp(lex, brush) + } + } + }) + } + + function fill (lex, x, y) { + var q = [ [x,y] ] + var aa = canvas.aa + var target = aa[y][x].clone() + var n, w = 0, e = 0, j = 0 + var kk = 0 + // gets into a weird infinite loop if we don't break here.. :\ + if (target.eq(lex)) { return } + LOOP: while (q.length) { + n = q.shift() + if (aa[n[1]][n[0]].ne(target)) { + continue LOOP + } + w = e = n[0] + j = n[1] + WEST: while (w > 0) { + if (aa[j][w-1].eq(target)) { + w = w-1 + } + else { + break WEST + } + } + EAST: while (e < canvas.w-1) { + if (aa[j][e+1].eq(target)) { + e = e+1 + } + else { + break EAST + } + } + for (var i = w; i <= e; i++) { + undo.save_lex(i, j, aa[j][i]) + aa[j][i].assign(lex) + if (j > 0 && aa[j-1][i].eq(target)) { + q.push([ i, j-1 ]) + } + if (j < canvas.h-1 && aa[j+1][i].eq(target)) { + q.push([ i, j+1 ]) + } + } + } + } + + var draw = {} + draw.down = down + draw.set_last_point = set_last_point + draw.move = move + draw.move_toroidal = move_toroidal + draw.stamp = stamp + draw.line = line + draw.point = point + draw.fill = fill + return draw + +})() + +var shader = (function(){ + var fn_str, fn, lex + var exports = {} + var animating = false + + exports.init = function(){ + lex = new Lex (0, 0) + exports.build(demo_shader.innerHTML) + } + exports.build = function (fn_str){ + try { + new_fn = new Function('lex', 'x', 'y', 'w', 'h', 't', fn_str) + new_fn(lex, 0, 0, 1, 1, 0) + } + catch (e) { + throw 'Shader execution error' + } + exports.fn = fn = new_fn + return fn + } + exports.run = function(canvas){ + var t = +new Date + shader.canvas = shader.canvas || canvas + var w = shader.canvas.w, h = shader.canvas.h + shader.canvas.forEach(function(lex, x, y){ + fn(lex, x, y, w, h, t) + lex.build() + }) + } + exports.toggle = function(state){ + animating = typeof state == "boolean" ? state : ! animating + shader_fps_el.classList.toggle('hidden') + return animating + } + exports.pause = function(){ + animating = false + shader_fps_el.classList.add('hidden') + shader.fps_time = 0 + } + exports.play = function(){ + animating = true + shader_fps_el.classList.remove('hidden') + } + exports.animate = function (t){ + requestAnimationFrame(exports.animate) + if (! animating) { return } + if (shader.fps_time){ + var ms = Date.now() - shader.fps_time + fps = 1000 / ms + shader_fps_el.innerHTML = (fps | 0) + ' fps' + } + shader.fps_time = Date.now() + exports.run(canvas) + } + + return exports + +})() + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/lex.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/lex.js new file mode 100644 index 0000000..9bfd128 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/lex.js @@ -0,0 +1,142 @@ +function Lex (x,y) { + if (typeof x == "number") { + this.y = y + this.x = x + this.span = document.createElement("span") + } + else { + this.span = x + } + this.fg = colors.white + this.bg = colors.black + this.char = " " + this.opacity = 1 + this.focused = false +} +Lex.prototype.build = function(){ + if (isNaN(this.bg) || this.bg == Infinity || this.bg == -Infinity) this.bg = colors.black + if (isNaN(this.fg) || this.fg == Infinity || this.fg == -Infinity) this.fg = colors.black + this.span.className = this.css() + this.span.innerHTML = this.html() +} +Lex.prototype.css = function(){ + return ( + this.focused ? + "focused " : "" + ) + ( + this.opacity === 0 ? + "transparent f" + color_alphabet[modi(this.fg,16)] : + "f" + color_alphabet[modi(this.fg,16)] + " b" + color_alphabet[modi(this.bg,16)] + ) +} +Lex.prototype.html = function(){ + return this.char == " " ? " " : this.char || " " +} +Lex.prototype.read = function(){ + this.char = this.span.innerHTML + return this.char +} +Lex.prototype.ascii = function(){ + return this.char || " " +} +Lex.prototype.sanitize = function(){ + switch (this.char) { +// case "%": return "%" + case undefined: + case "": return " " + default: return this.char + } +} +Lex.prototype.mirc = function(bg_, fg_){ + var char = this.char || " " + var charIsNaN = isNaN(parseInt(char)) + if ((bg_ == this.fg) && (fg_ == this.bg)) { + bg_ = this.bg; fg_ = this.fg + return [bg_, fg_, "\x16" + char] + } else if ((bg_ != this.bg) && (fg_ == this.fg)) { + bg_ = this.bg + return [bg_, fg_, "\x03," + ((this.bg&15) < 10 && !charIsNaN ? "0" : "") + (this.bg&15) + char] + } else if ((bg_ == this.bg) && (fg_ != this.fg)) { + fg_ = this.fg + return [bg_, fg_, "\x03" + ((this.fg&15) < 10 && !charIsNaN ? "0" : "") + (this.fg&15) + char] + } else { + bg_ = this.bg; fg_ = this.fg + return [bg_, fg_, "\x03" + (this.fg&15) + "," + ((this.bg&15) < 10 && !charIsNaN ? "0" : "") + (this.bg&15) + char] + } +} +Lex.prototype.ansi = function(){ + var fg = ansi_fg[ this.fg&15 ] + var bg = ansi_bg[ this.bg&15 ] + var c = this.sanitize() + if (c == "\\") c = "\\\\" + if (c == '"') c = '\\"' + return "\\e[" + fg + ";" + bg + "m" + c +} +Lex.prototype.assign = function (lex){ + this.fg = lex.fg + this.bg = lex.bg + this.char = lex.char + this.opacity = lex.opacity + this.build() +} +Lex.prototype.stamp = function (lex, brush){ + if (brush.draw_fg) this.fg = lex.fg + if (brush.draw_bg && lex.opacity > 0) this.bg = lex.bg + if (brush.draw_char) this.char = lex.char + this.opacity = 1 + this.build() +} +Lex.prototype.clone = function () { + var lex = new Lex (0,0) + lex.assign(this) + return lex +} +Lex.prototype.erase = function (){ + this.fg = fillColor + this.bg = fillColor + this.char = " " + this.opacity = 1 + this.build() +} +Lex.prototype.eq = function(lex){ + return lex && this.fg == lex.fg && this.bg == lex.bg && this.char == lex.char +} +Lex.prototype.eqColor = function(lex){ + return lex && this.fg == lex.fg && this.bg == lex.bg +} +Lex.prototype.ne = function(lex){ + return ! this.eq(lex) +} +Lex.prototype.clear = function(){ + this.bg = colors.black + this.fg = 0 + this.char = " " + this.opacity = 0 + this.build() +} +Lex.prototype.isClear = function(){ + return this.bg == 1 && this.fg == 0 && this.char == " " +} +Lex.prototype.focus = function(){ + if (focused) focused.blur() + this.span.classList.add('focused') + this.focused = true + focused = this +} +Lex.prototype.blur = function(){ + focused = null + this.span && this.span.classList.remove('focused') + this.focused = false + this.onBlur && this.onBlur() +} +Lex.prototype.demolish = function(){ + if (this.span.parentNode) { this.span.parentNode.removeChild(this.span) } + this.span = null +} +Lex.prototype.key = function(char, keyCode) { + if (! char) { return } + this.char = char + this.fg = brush.fg + this.build() + return true +} diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/matrix.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/matrix.js new file mode 100644 index 0000000..0ec4ec5 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/matrix.js @@ -0,0 +1,549 @@ +function Matrix (w,h,f){ + this.x = 0 + this.y = 0 + this.w = w + this.h = h + this.f = f + this.focus_x = 0 + this.focus_y = 0 + this.initialize() +} +Matrix.prototype.initialize = function(f){ + var w = this.w || 1, h = this.h || 1, f = f || this.f + var aa = new Array (h) + for (var y = 0; y < h; y++) { + aa[y] = new Array (w) + for (var x = 0; x < w; x++) { + aa[y][x] = f(x,y) + } + } + this.aa = aa +} +Matrix.prototype.rebuild = function (){ + this.demolish() + this.initialize() + this.append() + this.bind() + this.generate && this.generate() + this.focus_clamp() + check_if_lost_focus() +} +Matrix.prototype.clone = function () { + var base = this + var clone = new Matrix(this.w, this.h, function(x,y){ + return base.getCell(x,y).clone() + }) + clone.f = this.f + return clone +} +Matrix.prototype.assign = function (mat) { + var base = this + this.demolish() + this.w = mat.w + this.h = mat.h +// this.f = function(){} + this.initialize(function(x,y){ + var el = mat.getCell(x,y).clone() + el.build() + return el + }) + this.append() + this.bind() + check_if_lost_focus() + return this +} + +Matrix.prototype.bind = function () {} +Matrix.prototype.demolish = function (){ + this.forEach(function(lex){ + lex.demolish() + }) + while (this.rapper && this.rapper.firstChild) { + this.rapper.removeChild(this.rapper.firstChild); + } + this.aa.forEach(function(row){ + row.length = 0 + }) + this.aa.length = 0 +} +Matrix.prototype.forEach = function(f){ + this.aa.forEach(function(row, y){ + row.forEach(function(lex, x){ + f(lex, x, y) + }) + }) +} +Matrix.prototype.focus_clamp = function(){ + this.focus_x = clamp(this.focus_x, 0, this.w - 1) + this.focus_y = clamp(this.focus_y, 0, this.h - 1) +} +Matrix.prototype.focus_add = function(x, y){ + this.focus(this.focus_x + x, this.focus_y + y) +} +Matrix.prototype.focus = function(x, y){ + if (x === undefined) x = this.focus_x + if (y === undefined) y = this.focus_y + x = mod(x, this.w) + y = mod(y, this.h) + this.focus_x = x + this.focus_y = y + + //focused_input = this + this.aa[y][x].focus() +} +Matrix.prototype.focusLex = function(y,x){ + if (x < 0) { + y -= 1 + } + if (x > this.aa[0].length) { + y += 1 + } + this.aa[mod(y,this.h)][mod(x,this.w)].focus() +} +Matrix.prototype.clear = function(){ + this.forEach(function(lex,x,y){ lex.clear() }) +} +Matrix.prototype.erase = function(){ + this.forEach(function(lex,x,y){ lex.erase() }) +} +Matrix.prototype.fill = function(lex){ + this.fg = lex.fg + this.bg = lex.bg + this.char = lex.char + this.opacity = lex.opacity + this.forEach(function(el,x,y){ + el.assign(lex) + el.build() + }) +} + +Matrix.prototype.build = function(){ + this.forEach(function(lex,x,y){ + lex.build() + }) +} +Matrix.prototype.append = function(rapper){ + rapper = this.rapper = rapper || this.rapper + if (! this.rapper) return + this.aa.forEach(function(row, y){ + var div = document.createElement("div") + row.forEach(function(lex, x) { + div.appendChild(lex.span) + }) + rapper.appendChild( div ) + }) +} +Matrix.prototype.region = function(w,h,x,y) { + w = w || 1 + h = h || 1 + x = x || 0 + y = y || 0 + var parent = this + var mat = new Matrix(w, h, function(x,y){ + return parent.aa[y][x] + }) + mat.f = this.f + return mat +} +Matrix.prototype.setCell = function(lex,x,y){ + this.aa[y] && this.aa[y][x] && this.aa[y][x].assign(lex) +} +Matrix.prototype.getCell = function(x,y){ + if (this.aa[y] && this.aa[y][x]) return this.aa[y][x] + else return null +} +Matrix.prototype.get = function(x,y){ + y = floor(mod(y || 0, this.h)) + x = floor(mod(x || 0, this.w)) + if (this.aa[y] && this.aa[y][x]) return this.aa[y][x] + else return null +} + +Matrix.prototype.resize = function(w,h){ + w = w || canvas.w + h = h || canvas.h + var div, row, lex + var f = this.f, old_h = this.aa.length, old_w = this.aa[0].length + var rapper = this.rapper + w = max(w, 1) + h = max(h, 1) + if (h < old_h) { + for (var y = old_h; y > h; y--) { + row = this.aa.pop() + div = row[0].span.parentNode + row.forEach(function(lex, x){ + lex.demolish() + }) + div.parentNode.removeChild(div) + } + } + else if (h > old_h) { + for (var y = old_h; y < h; y++) { + div = document.createElement("div") + rapper.appendChild( div ) + this.aa[y] = new Array (w) + for (var x = 0; x < w; x++) { + lex = this.aa[y][x] = f(x,y) + div.appendChild(lex.span) + } + } + } + + if (w < old_w) { + this.aa.forEach(function(row, y){ + while (row.length > w) { + lex = row.pop() + lex.demolish() + } + }) + } + else if (w > old_w) { + this.aa.forEach(function(row, y){ + div = row[0].span.parentNode + for (var x = row.length; x < w; x++) { + lex = row[x] = f(x,y) + div.appendChild(lex.span) + } + }) + } + + this.w = w + this.h = h + this.bind && this.bind() + this.focus_clamp() + if (this.rapper && this.rapper.parentNode != document.body) { + this.resize_rapper() + } +} +Matrix.prototype.resize_rapper = function(){ + var cell = canvas.aa[0][0].span + var cw = cell.offsetWidth + var ch = cell.offsetHeight +// if (canvas.grid) { ch++ } + var width = cw * this.aa[0].length + var height = ch * this.aa.length + if (canvas.grid) { width++; height++ } + if (this.rotated) { + this.rapper.parentNode.classList.add("rotated") + this.rapper.parentNode.style.height = (width) + "px" + this.rapper.parentNode.style.width = (height) + "px" + this.rapper.style.top = (width/2) + "px" + // this.rapper.style.left = ((canvas_rapper.offsetHeight+20)/2) + "px" + } + else { + this.rapper.parentNode.classList.remove("rotated") + this.rapper.parentNode.style.height = "" + this.rapper.style.width = + this.rapper.parentNode.style.width = (width) + "px" + this.rapper.style.top = "" + // canvas_rapper.style.left = "auto" + } +} +Matrix.prototype.ascii = function () { + var lines = this.aa.map(function(row, y){ + var last, line = "" + row.forEach(function(lex, x) { + line += lex.ascii() + }) + return line // .replace(/\s+$/,"") + }) + var txt = lines.join("\n") + return txt +} +Matrix.prototype.ansi = function (opts) { + var lines = this.aa.map(function(row, y){ + var last, line = "" + row.forEach(function(lex, x) { + if (lex.eqColor(last)) { + line += lex.sanitize() + } + else { + line += lex.ansi() + last = lex + } + }) + return line + }) + var txt = lines.filter(function(line){ return line.length > 0 }).join('\\e[0m\\n') + "\\e[0m" + return 'echo -e "' + txt + '"' +} +Matrix.prototype.mirc = function (opts) { + var cutoff = false + var lines = this.aa.map(function(row, y){ + var last, line = "" + row.forEach(function(lex, x) { + var bg_ = -1, fg_ = 15 + if (lex.eqColor(last)) { + line += lex.sanitize() + } + else { + [bg_, fg_, line_] = lex.mirc(bg_, fg_) + line += line_; last = lex; + } + }) + if (opts && opts.cutoff && line.length > opts.cutoff) { + cutoff = true + } + return line + }) + + var txt = lines.filter(function(line){ return line.length > 0 }).join('\n') + + if (cutoff) { + txt = new String(txt) + txt.cutoff = true + } + return txt +} +Matrix.prototype.irssi = function(opts){ + var mirc = this.mirc(opts) + var txt = mirc + // .replace(/\%/g, '%%') + .replace(/\\/g, '\\x5C') + .replace(/\"/g, '\\\"') + // .replace(/\'/g, '\\\'') + .replace(/\`/g, '\\\`') + .replace(/\$/g, '\\$') + // .replace(/\n\s+/g, '\n') + // .replace(/\s+$/g, '\n') + // .replace(/^\n+/, '') + .replace(/\n/g, '\\n') + .replace(/\x02/g, '\\x02') + .replace(/\x03/g, '\\x03') + + txt = unicode.escapeToEscapedBytes(txt) + txt = '/exec -out printf "%b" "' + txt + '"\n' + if (mirc.cutoff){ + txt = new String(txt) + txt.cutoff = true + } + return txt +} + +var undo = (function(){ + +var max_states = 200; + +// undotimetotal = 0; + +var stack = {undo: [], redo: []}; +var current_undo = null; +var dom = {undo: undo_el, redo: redo_el}; +dom.undo.is_visible = dom.redo.is_visible = false + +var LexState = function(lex){ + this.fg = lex.fg; + this.bg = lex.bg; + this.char = lex.char; + this.opacity = lex.opacity; +}; + +var update_dom_visibility = function(type){ + var el = dom[type] + if (el.is_visible){ + if (stack[type].length === 0) { + el.classList.add('hidden') + el.is_visible = false + } + } else if (stack[type].length > 0){ + el.classList.remove('hidden') + el.is_visible = true + } +} +var update_dom = function(){ + update_dom_visibility('undo') + update_dom_visibility('redo') +} + +// state is an undo or redo state that might contain these props +// { lexs: {'0,0': LexState, ...}, // for sparse lex changes (eg brush, fill) +// focus: {x:, y: }, +// size: {w:, h: }, +// rects: [{x:, y:, w:, h:, lexs: [LexState, ...]}, ...] +// } +var new_state = function(){ + var state = {lexs:{}}; + save_focus(canvas.focus_x, canvas.focus_y, state) + return state +} +var new_redo = function(){ + return new_state() +} +var new_undo = function(){ + current_undo = new_state() + stack.redo = [] + stack.undo.push(current_undo) + if (stack.undo.length > max_states) stack.undo.shift(); + update_dom() + return current_undo +} + +var save_focus = function(x, y, state){ + state = state || current_undo + state.focus = {x:x, y:y} +} +var save_size = function(w, h, state){ + state = state || current_undo + state.size = {w:w, h:h}; +} +// the reason for stringifying the x y coords is so that each +// coordinate is saved only once in an undo state. +// otherwise there would be problems with, eg, a brush stroke +// that passed over the same grid cell twice. +var save_lex = function(x, y, lex, state){ + // var start = Date.now() + state = state || current_undo + var lexs = state.lexs; + var xy = x + "," + y; + if (xy in lexs) return; + lexs[xy] = new LexState(lex) + // undotimetotal += Date.now() - start +} +var save_focused_lex = function(state){ + state = state || current_undo + var x = canvas.focus_x + var y = canvas.focus_y + save_lex(x, y, canvas.aa[y][x], state) +} +var save_rect = function(xpos, ypos, w, h, state){ + if (w === 0 || h === 0) return; + state = state || current_undo; + state.rects = state.rects || [] + var aa = canvas.aa; + var rect = {x: xpos, y: ypos, w: w, h: h, lexs: []} + var lexs = rect.lexs + var xlen = xpos + w + var ylen = ypos + h + for (var y = ypos; y < ylen; y++){ + var aay = aa[y] + for (var x = xpos; x < xlen; x++){ + lexs.push(new LexState(aay[x])) + } + } + state.rects.push(rect) +} +var save_resize = function(w, h, old_w, old_h, state){ + state = state || current_undo + save_size(old_w, old_h, state) + if (old_w > w){ + // .---XX + // | XX + // |___XX + save_rect(w, 0, old_w - w, old_h, state) + if (old_h > h){ + // .----. + // | | + // XXXX_| + save_rect(0, h, w, old_h - h, state) + } + } else if (old_h > h){ + // .----. + // | | + // XXXXXX + save_rect(0, h, old_w, old_h - h, state) + } +} + +var restore_state = function(state){ + // all redo states will have a cached undo state on them + // an undo state might have a cached redo state + // if it doesn't have one, generate one + var make_redo = ! ('redo' in state || 'undo' in state); + var aa = canvas.aa + var lex, lexs; + + if (make_redo){ + state.redo = new_redo() + + // copy saved rects that intersect with current canvas size + // important to do this before resizing canvas + if ('rects' in state){ + for (var ri=0, rect; rect=state.rects[ri]; ri++){ + if (rect.x >= canvas.w || + rect.y >= canvas.h) continue; + var w = Math.min(rect.w, canvas.w - rect.x) + var h = Math.min(rect.h, canvas.h - rect.y) + save_rect(rect.x, rect.y, w, h, state.redo) + } + } + if ('size' in state){ + save_resize(state.size.w, state.size.h, canvas.w, canvas.h, state.redo) + } + } + + if ('size' in state){ + canvas.resize(state.size.w, state.size.h, true); + } + + if ('rects' in state){ + for (var ri=0, rect; rect=state.rects[ri]; ri++){ + lexs = rect.lexs + for (var li=0; lex=lexs[li]; li++){ + var x = (li % rect.w) + rect.x + var y = ((li / rect.w)|0) + rect.y + aa[y][x].assign(lex) + } + } + } + + lexs = state.lexs + for (var key in lexs){ + var xy = key.split(','); + lex = aa[xy[1]][xy[0]] + if (make_redo) + save_lex(xy[0], xy[1], lex, state.redo) + lex.assign(lexs[key]) + } + + if ('focus' in state){ + canvas.focus_x = state.focus.x + canvas.focus_y = state.focus.y + if (current_canvas === canvas){ + canvas.focus() + } + } +} + +var undo = function(){ + var state = stack.undo.pop(); + if (!state) return; + + restore_state(state) + + // now take the applied undo state and store it on the redo state + // and push the redo state to the redo stack + state.redo.undo = state + stack.redo.push(state.redo) + delete state.redo + + update_dom() +} + +var redo = function(){ + var state = stack.redo.pop(); + if (!state) return; + + restore_state(state) + + state.undo.redo = state + stack.undo.push(state.undo) + delete state.undo + + update_dom() +} + +return { + stack: stack, + new: new_undo, +// new_redo: new_redo, + save_focus: save_focus, + save_size: save_size, + save_lex: save_lex, + save_focused_lex: save_focused_lex, + save_rect: save_rect, + save_resize: save_resize, + undo: undo, + redo: redo +} + +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/brush.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/brush.js new file mode 100644 index 0000000..668538f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/brush.js @@ -0,0 +1,108 @@ +var brush = (function(){ + + var brush = new Matrix (5, 5, function(x,y){ + var lex = new Lex (x,y) + lex.build() + return lex + }) + + brush.modified = false + + brush.mask = blit.circle + + brush.generate = function(){ + brush.fill(brush) + brush.mask(brush) + } + + brush.bind = function(){ + + var last_point = [0,0] + var dragging = false + var erasing = false + + brush.forEach(function(lex, x, y){ + + if (lex.bound) return + lex.bound = true + + var point = [x,y] + lex.span.addEventListener('contextmenu', function(e){ + e.preventDefault() + }) + lex.span.addEventListener('mousedown', function(e){ + e.preventDefault() + current_canvas = brush + brush.modified = true + dragging = true + erasing = (e.which == "3" || e.ctrlKey) + if (erasing) { + lex.clear() + } + else { + fillColor = brush.bg + lex.assign(brush) + } + brush.focus(x, y) + }) + lex.span.addEventListener('mousemove', function(e){ + e.preventDefault() + if (! dragging) { + return + } + erasing = (e.which == "3" || e.ctrlKey) + if (erasing) { + lex.clear() + } + else { + lex.assign(brush) + } + brush.focus(x, y) + }) + }) + window.addEventListener('mouseup', function(e){ + dragging = erasing = false + }) + } + + brush.resize = function(w, h){ + w = this.w = clamp(w, this.min, this.max) + h = this.h = clamp(h, this.min, this.max) + brush.rebuild() + controls.brush_w.char = "" + w + controls.brush_w.build() + controls.brush_h.char = "" + h + controls.brush_h.build() + } + brush.size_add = function(w, h){ + brush.resize(brush.w + w, brush.h + h) + } + brush.expand = function(i){ + brush.size_add(i, i) + } + brush.contract = function(i){ + brush.size_add(-i, -i) + } + + brush.load = function(lex){ + brush.char = lex.char + brush.fg = lex.fg + brush.bg = lex.bg + brush.opacity = 1 + } + + brush.min = 1 + brush.max = 100 + + brush.char = " " + brush.fg = 0 + brush.bg = 1 + brush.opacity = 1 + + brush.draw_fg = true + brush.draw_bg = true + brush.draw_char = true + + return brush + +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/canvas.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/canvas.js new file mode 100644 index 0000000..ca14323 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/canvas.js @@ -0,0 +1,144 @@ +var canvas = current_canvas = (function(){ + + var cols = 100 + var rows = 30 + + var canvas = new Matrix (cols, rows, function(x,y){ + var lex = new Lex (x,y) + lex.build() + return lex + }) + + canvas.bind = function(){ + + canvas.forEach(function(lex, x, y){ + + if (lex.bound) return + lex.bound = true + var point = [x,y] + lex.span.addEventListener('contextmenu', function(e){ + e.preventDefault() + }) + lex.span.addEventListener('mousedown', function(e){ + if (is_mobile) return + e.preventDefault() + dragging = true + current_canvas = canvas + if (e.altKey) { + if (e.shiftKey) { + blit.copy_from(canvas, brush, floor(x-brush.w/2), floor(y-brush.h/2)) + brush.mask(brush) + draw.set_last_point(e, point) + } + else { + brush.load(lex) + brush.generate() + dragging = false + } + return + } + else if (drawing) { + undo.new() + draw.down(e, lex, point) + } + else if (selecting) { + selection.down(e, lex, point) + } + else if (transforming) { + transform.down(e, lex, point) + } + else if (filling) { + undo.new() + draw.fill(brush, x, y) + } + canvas.focus(x, y) + }) + + lex.span.addEventListener("mousemove", function(e){ + mouse.x = x + mouse.y = y + if (is_mobile) return + if (! dragging) return + if (drawing) { + draw.move(e, lex, point) + } + else if (selecting) { + selection.move(e, lex, point) + } + else if (transforming) { + transform.move(e, lex, point) + } + canvas.focus(x, y) + }) + + }) + + if (is_mobile) { + canvas.rapper.addEventListener('touchstart', function(e){ + e.preventDefault() + var x, y, point, lex + x = (e.touches[0].pageX - canvas.rapper.offsetTop) / canvas.aa[0][0].span.offsetWidth + y = (e.touches[0].pageY - canvas.rapper.offsetTop) / canvas.aa[0][0].span.offsetHeight + x = ~~clamp(x, 0, canvas.aa[0].length-1) + y = ~~clamp(y, 0, canvas.aa.length-1) + point = [x,y] + lex = canvas.aa[y][x] + dragging = true + if (drawing) { + undo.new() + draw.down(e, lex, point) + } + else if (filling) { + undo.new() + draw.fill(brush, x, y) + } + canvas.focus(x, y) + }) + canvas.rapper.addEventListener("touchmove", function(e){ + e.preventDefault() + var x, y, point, lex + x = (e.touches[0].pageX - canvas.rapper.offsetTop) / canvas.aa[0][0].span.offsetWidth + y = (e.touches[0].pageY - canvas.rapper.offsetTop) / canvas.aa[0][0].span.offsetHeight + x = ~~clamp(x, 0, canvas.aa[0].length-1) + y = ~~clamp(y, 0, canvas.aa.length-1) + point = [x,y] + lex = canvas.aa[y][x] + if (! dragging) return + shader_el.innerHTML = point.join(",") + if (drawing) { + draw.move(e, lex, point) + } + canvas.focus(x, y) + }) + } + + } + + canvas.min = 1 + canvas.max = 999 + + // canvas.resize(1, 1, true) // wont create undo state + canvas.resize = function(w, h, no_undo){ + var old_w = this.w, old_h = this.h + w = this.w = clamp(w, this.min, this.max) + h = this.h = clamp(h, this.min, this.max) + if (old_w === w && old_h === h) return; + + if (!no_undo){ + undo.new() + undo.save_resize(w, h, old_w, old_h) + } + + canvas.__proto__.resize.call(canvas, w, h) + controls.canvas_w.char = "" + w + controls.canvas_w.build() + controls.canvas_h.char = "" + h + controls.canvas_h.build() + } + canvas.size_add = function(w, h){ + canvas.resize(canvas.w + w, canvas.h + h) + } + + return canvas + +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/controls.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/controls.js new file mode 100644 index 0000000..f240937 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/controls.js @@ -0,0 +1,342 @@ +var controls = (function(){ + + var controls = {} + + controls.cross = new Tool (cross_el) + controls.cross.use = function(){ + if (brush.mask == blit.cross) { + controls.cross.el.innerHTML = "ssoɹɔ" + brush.mask = blit.inverted_cross + } + else { + controls.cross.el.innerHTML = "cross" + brush.mask = blit.cross + } + brush.generate() + drawing = true + brush.modified = false + } + controls.cross.done = function(){ + controls.cross.el.innerHTML = "cross" + drawing = false + } + + controls.circle = new Tool (circle_el) + controls.circle.use = function(){ + brush.mask = blit.circle + brush.generate() + drawing = true + brush.modified = false + } + controls.circle.done = function(){ + drawing = false + } + + controls.square = new Tool (square_el) + controls.square.use = function(){ + brush.mask = blit.square + brush.generate() + brush.modified = false + drawing = true + } + controls.square.done = function(){ + drawing = false + } + + controls.text = new Tool (text_el) + controls.text.use = function(){ + current_filetool && current_filetool.blur() + } + + controls.select = new Tool (select_el) + controls.select.use = function(){ + selection.show() + } + controls.select.done = function(){ + selection.hide() + } + + controls.rotate = new Tool (rotate_el) + controls.rotate.use = function(){ + transform.set_mode('rotate') + } + controls.rotate.done = function(){ + transform.done() + } + + controls.scale = new Tool (scale_el) + controls.scale.use = function(){ + transform.set_mode('scale') + } + controls.scale.done = function(){ + transform.done() + } + + controls.slice = new Tool (slice_el) + controls.slice.use = function(){ + transform.set_mode('slice') + } + controls.slice.done = function(){ + transform.done() + } + + controls.translate = new Tool (translate_el) + controls.translate.use = function(){ + transform.set_mode('translate') + } + controls.translate.done = function(){ + transform.done() + } + + controls.fill = new Tool (fill_el) + controls.fill.use = function(){ + filling = true + document.body.classList.add("bucket") + } + controls.fill.done = function(){ + filling = false + document.body.classList.remove("bucket") + } + + controls.undo = new BlurredTool (undo_el) + controls.undo.use = function(){ + undo.undo() + } + + controls.redo = new BlurredTool (redo_el) + controls.redo.use = function(){ + undo.redo() + } + + controls.clear = new BlurredTool (clear_el) + controls.clear.use = function(){ + undo.new() + undo.save_rect(0, 0, canvas.w, canvas.h) + canvas.erase() + current_filetool && current_filetool.blur() + } + + controls.grid = new BlurredCheckbox (grid_el) + controls.grid.memorable = true + controls.grid.use = function(state){ + state = typeof state == "boolean" ? state : ! document.body.classList.contains("grid") + document.body.classList[ state ? "add" : "remove" ]('grid') + letters.grid = palette.grid = canvas.grid = state + canvas.resize_rapper() + palette.resize_rapper() + letters.resize_rapper() + if (! selection.hidden) selection.reposition() + this.update( state ) + } + ClipboardTool = FileTool.extend({ + blur: function(){ + this.__blur() + clipboard.hide() + } + }) + controls.save = new ClipboardTool (save_el) + controls.save.use = function(){ + clipboard.show() + clipboard.export_mode() + } + controls.load = new ClipboardTool (load_el) + controls.load.use = function(){ + // console.log("use") + clipboard.show() + clipboard.import_mode() + } + + controls.save_format = new RadioGroup(format_el) + controls.save_format.name = 'save_format' + controls.save_format.memorable = true + var cs = controls.save_format.controls + cs.mirc.use = cs.irssi.use = cs.ascii.use = function(){ + clipboard.export_data() + } + // + + var ShaderTool = FileTool.extend({ + active: false, + use: function(state){ + this.active = typeof state == "boolean" ? state : ! this.active + if (this.active) { + shader_rapper.style.display = "block" + shader_textarea.focus() + } else { + shader_rapper.style.display = "none" + } + }, + done: function(){ + this.use(false) + } + }) + controls.shader = new ShaderTool (shader_el) + shader_textarea.value = shader_textarea.value || demo_shader.innerHTML + shader_textarea.addEventListener("input", function(){ + var fn = shader.build(shader_textarea.value) + fn && shader.run(canvas) + }) + controls.animate = new BlurredCheckbox (animate_checkbox) + controls.animate.use = function(state){ + var state = shader.toggle() + this.update(state) + // controls.shader.focus() + controls.shader.use(true) + } + + controls.shader_target = new RadioGroup(shader_target_el) + var cs = controls.shader_target.controls + cs.canvas.use = function(){ shader.canvas = canvas } + cs.brush.use = function(){ shader.canvas = brush } + cs.selection.use = function(){ shader.canvas = selection.canvas } + + controls.experimental_palette = new HiddenCheckbox (experimental_palette_toggle) + controls.experimental_palette.memorable = true + controls.experimental_palette.use = function(state){ + var state = palette.experimental(state) + this.update(state) + } + + controls.advanced = new BlurredCheckbox (advanced_checkbox) + controls.advanced.memorable = true + controls.advanced.use = function(state){ + console.log(state) + state = typeof state == "boolean" ? state : ! document.body.classList.contains('panke') + if (state) + document.body.classList.add('panke') + else + document.body.classList.remove('panke') + this.update(state) + } + +/* + controls.nopaint = new HiddenCheckbox (nopaint_toggle) + controls.nopaint.memorable = true + controls.nopaint.on = "N" + controls.nopaint.use = function(state){ + var state = nopaint.toggle(state) + this.update(state) + } +*/ + + // + + controls.fg = new BlurredCheckbox (fg_checkbox) + controls.fg.use = function(state){ + brush.draw_fg = state || ! brush.draw_fg + this.update(brush.draw_fg) + } + + controls.bg = new BlurredCheckbox (bg_checkbox) + controls.bg.use = function(state){ + brush.draw_bg = state || ! brush.draw_bg + this.update(brush.draw_bg) + } + + controls.char = new BlurredCheckbox (char_checkbox) + controls.char.use = function(state){ + brush.draw_char = state || ! brush.draw_char + this.update(brush.draw_char) + } + + // + +// controls.turn = new BlurredCheckbox (turn_checkbox) +// controls.turn.memorable = true +// controls.turn.use = function(state){ +// canvas.rotated = typeof state == "boolean" ? state : ! canvas.rotated +// canvas.resize_rapper() +// this.update(canvas.rotated) +// } + + // controls.pixels = new BlurredCheckbox (pixels_checkbox) + // controls.pixels.memorable = true + // controls.pixels.use = function(state){ + // canvas.pixels = typeof state == "boolean" ? state : ! canvas.pixels + // document.body.classList.toggle("pixels", canvas.pixels) + // this.update(canvas.pixels) + // } + + controls.mirror_x = new BlurredCheckbox (mirror_x_checkbox) + controls.mirror_x.use = function(state){ + window.mirror_x = typeof state == "boolean" ? state : ! window.mirror_x + this.update(window.mirror_x) + } + controls.mirror_y = new BlurredCheckbox (mirror_y_checkbox) + controls.mirror_y.use = function(state){ + window.mirror_y = typeof state == "boolean" ? state : ! window.mirror_y + this.update(window.mirror_y) + } + + // + + controls.vertical = new BlurredCheckbox (vertical_checkbox) + controls.vertical.memorable = true + controls.vertical.use = function(state){ + canvas.vertical = typeof state == "boolean" ? state : ! canvas.vertical + controls.vertical.refresh() + } + controls.vertical.refresh = function(){ + if (canvas.vertical) { + document.body.classList.add("vertical") + } + else { + document.body.classList.remove("vertical") + } + palette.repaint() + letters.repaint() + this.update(canvas.vertical) + } + + // + + controls.brush_w = new Lex (brush_w_el) + controls.brush_h = new Lex (brush_h_el) + controls.canvas_w = new Lex (canvas_w_el) + controls.canvas_h = new Lex (canvas_h_el) + + // bind + + controls.bind = function(){ + + for (var n in controls){ + var control = controls[n] + if (typeof control === 'object' && 'bind' in control){ + control.bind() + } + } + + [ + controls.brush_w, + controls.brush_h, + controls.canvas_w, + controls.canvas_h + ].forEach(function(lex){ + lex.span.addEventListener('mousedown', function(e){ + lex.focus() + if (is_mobile) cursor_input.focus() + }) + }); + + controls.brush_w.key = keys.single_numeral_key(controls.brush_w, function(w){ brush.resize(w, brush.h) }) + controls.brush_w.raw_key = keys.arrow_key(function(w){ brush.size_add(w, 0) }) + + controls.brush_h.key = keys.single_numeral_key(controls.brush_h, function(h){ brush.resize(brush.w, h) }) + controls.brush_h.raw_key = keys.arrow_key(function(h){ brush.size_add(0, h) }) + + controls.canvas_w.key = keys.multi_numeral_key(controls.canvas_w, 3) + controls.canvas_w.onBlur = keys.multi_numeral_blur(controls.canvas_w, function(w){ canvas.resize(w, canvas.h) }) + controls.canvas_w.raw_key = keys.arrow_key(function(w){ canvas.size_add(w, 0) }) + + controls.canvas_h.key = keys.multi_numeral_key(controls.canvas_h, 3) + controls.canvas_h.onBlur = keys.multi_numeral_blur(controls.canvas_h, function(h){ canvas.resize(canvas.w, h) }) + controls.canvas_h.raw_key = keys.arrow_key(function(h){ canvas.size_add(0, h) }) + + add_custom_el.addEventListener("click", function(){ + custom.clone() + }) + + } + + return controls +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/custom.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/custom.js new file mode 100644 index 0000000..c021679 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/custom.js @@ -0,0 +1,29 @@ +var custom = (function(){ + + var exports = {} + + exports.clone = function (){ + var new_brush = brush.clone() + var rapper = document.createElement("div") + rapper.className = "custom" + new_brush.append(rapper) + custom_rapper.appendChild(rapper) + // store in localstorage? + rapper.addEventListener("click", function(e){ + if (e.shiftKey) { + rapper.parentNode.removeChild(rapper) + delete new_brush + } else { + // load this brush + exports.load(new_brush) + } + }) + } + + exports.load = function(new_brush){ + brush.assign( new_brush ) + } + + return exports + +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/keys.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/keys.js new file mode 100644 index 0000000..77922c7 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/keys.js @@ -0,0 +1,213 @@ +var keys = (function(){ + + var keys = {} + keys.bind = function(){ + cursor_input.addEventListener('keydown', function(e){ + + // console.log("keycode:", e.keyCode) + if (e.altKey) { + document.body.classList.add("dropper") + } + + switch (e.keyCode) { + case 27: // esc + if (!selection.hidden && current_canvas === canvas){ + selection.hide() + selection.show() + } else if (focused){ + focused.blur() + } + return + } + + if (window.focused && focused.raw_key) { + focused.raw_key(e) + return + } + + switch (e.keyCode) { + case 219: // [ + if (current_tool.name != "text") { + e.preventDefault() + brush.contract(1) + brush.modified = false + check_if_lost_focus() + } + break + case 221: // ] + if (current_tool.name != "text") { + e.preventDefault() + brush.expand(1) + brush.modified = false + } + break + case 8: // backspace + e.preventDefault() + if (current_canvas === canvas) + undo.new() + current_canvas.focus_add(-1, 0) + if (current_canvas === canvas) + undo.save_focused_lex() + focused.char = " " + focused.build() + return + case 13: // return + e.preventDefault() + current_canvas.focusLex(focused.y, focused.x+1) + return + case 38: // up + e.preventDefault() + current_canvas.focus_add(0, -1) + break + case 40: // down + e.preventDefault() + current_canvas.focus_add(0, 1) + break + case 37: // left + e.preventDefault() + current_canvas.focus_add(-1, 0) + break + case 39: // right + e.preventDefault() + current_canvas.focus_add(1, 0) + break + // use typical windows and os x shortcuts + // undo: ctrl-z or cmd-z + // redo: ctrl-y or shift-cmd-z + case 89: // y + if (!e.ctrlKey && !e.metaKey) break; + e.preventDefault(); + undo.redo(); + break + case 90: // z + if (!e.ctrlKey && !e.metaKey) break; + e.preventDefault(); + if (e.shiftKey) + undo.redo(); + else + undo.undo(); + break + // default: + // if (focused) { focused.key(undefined, e.keyCode) } + } + }) + + cursor_input.addEventListener('input', function(e){ + /* + if (! e.metaKey && ! e.ctrlKey && ! e.altKey) { + e.preventDefault() + } + */ + if (current_tool.name == "shader") { + cursor_input.value = "" + return + } + var char = cursor_input.value + cursor_input.value = "" + + // console.log("input:", char) + + if (current_tool.name != "text" && ! brush.modified) { + brush.char = char + if (char == " ") { + brush.bg = brush.fg + } + else if (brush.bg != fillColor) { + brush.fg = brush.bg + brush.bg = fillColor + } + brush.rebuild() + } + + if (focused && char) { + var y = focused.y, x = focused.x + if (current_canvas === canvas){ + undo.new() + undo.save_focused_lex() + } + var moving = focused.key(char, e.keyCode) + if ( ! moving || ! ('y' in focused && 'x' in focused) ) { return } + current_canvas.focus_add(1, 0) + } + }) + + cursor_input.addEventListener("keyup", function(e){ + if (! e.altKey) { + document.body.classList.remove("dropper") + } + }) + } + + keys.int_key = function (f) { + return function (key, keyCode) { + var n = parseInt(key) + ! isNaN(n) && f(n) + } + } + + keys.arrow_key = function (fn) { + return function (e){ + switch (e.keyCode) { + case 38: // up + e.preventDefault() + fn(1) + break + case 40: // down + e.preventDefault() + fn(-1) + break + } + } + } + keys.left_right_key = function (fn) { + return function (e){ + switch (e.keyCode) { + case 39: // right + e.preventDefault() + fn(1) + break + case 38: // up + case 40: // down + e.preventDefault() + fn(0) + break + case 37: // left + e.preventDefault() + fn(-1) + break + } + } + } + + keys.single_numeral_key = function (lex, fn) { + return keys.int_key(function(n, keyCode){ + if (n == 0) n = 10 + lex.blur() + fn(n) + }) + } + keys.multi_numeral_key = function (lex, digits){ + return keys.int_key(function(n, keyCode){ + lex.read() + if (lex.char.length < digits) { + n = parseInt(lex.char) * 10 + n + } + lex.char = ""+n + lex.build() + }) + } + keys.multi_numeral_blur = function (lex, fn){ + return function(){ + var n = parseInt(lex.char) + if (isNaN(n)) return + fn(n) + } + } + + return keys +})() + +function check_if_lost_focus() { + if (! window.focused || ! window.focused.span) + window.focused = canvas.aa[0][0] +} diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/letters.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/letters.js new file mode 100644 index 0000000..d745171 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/letters.js @@ -0,0 +1,89 @@ +var letters = (function(){ + + var last_charset = "" + var charset_index = 0 + var charsets = [ + 'Basic Latin', + 'Latin-1 Supplement', + 'Box Drawing', + 'Block Elements', + ] + + var letters = new Matrix (1, 1, function(x,y){ + var lex = new Lex (x,y) + return lex + }) + + letters.charset = "" + + letters.repaint = function(charset){ + letters.charset = charset = charset || last_charset + last_charset = charset + var chars = unicode.block(charset, 32) + if (chars[0] != " ") chars.unshift(" ") + if (canvas.vertical) { + letters.resize( Math.ceil( chars.length / 16 ), 16 ) + } + else { + letters.resize( 32, Math.ceil( chars.length / 32 ) ) + } + + var i = 0 + + letters.forEach(function(lex,x,y){ + if (canvas.vertical) { x=x^y;y=x^y;x=x^y } + var char = chars[i++] + if (palette.chars.indexOf(brush.char) > 1) { + lex.bg = brush.fg + lex.fg = brush.bg + } + else { + lex.bg = colors.black + lex.fg = brush.fg == fillColor ? colors.black : brush.fg + } + lex.char = char + lex.opacity = 1 + lex.build() + }) + } + + letters.bind = function(){ + letters.forEach(function(lex,x,y){ + if (lex.bound) return + lex.bound = true + + lex.span.addEventListener('mousedown', function(e){ + e.preventDefault() + if (e.shiftKey) { + charset_index = (charset_index+1) % charsets.length + letters.repaint(charsets[charset_index]) + return + } + else if (e.ctrlKey || e.which == 3) { + brush.char = lex.char + brush.bg = brush.fg + brush.fg = fillColor + } + else { + brush.char = lex.char + if (lex.char == " ") { + brush.bg = brush.fg + } + else if (brush.bg != fillColor) { + brush.fg = brush.bg + brush.bg = fillColor + } + } + if (! brush.modified) { + brush.generate() + } + palette.repaint() + }) + lex.span.addEventListener('contextmenu', function(e){ + e.preventDefault() + }) + }) + } + + return letters +})() \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/palette.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/palette.js new file mode 100644 index 0000000..46045eb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/palette.js @@ -0,0 +1,116 @@ +var palette = (function(){ + + var palette = new Matrix (32, 2, function(x,y){ + var lex = new Lex (x,y) + return lex + }) + + var palette_index = localStorage.getItem("ascii.palette") || 1 + var palette_list = [all_hue, all_inv_hue, mirc_color, mirc_color_reverse] + var palette_fn = palette_list[palette_index] + var dither = { + aa: '▓▒░ ', + a: '▓', + b: '▒', + c: '░', + d: ' ', + p: function(n){ + return dither.aa[Math.floor(Math.abs(n) % 4)] + } + } + palette.chars = " " + dither.a + dither.b + dither.c + + palette.repaint = function(){ + var xw = use_experimental_palette ? 5 : 2 + if (canvas.vertical) { + palette.resize( xw, 16 ) + } + else { + palette.resize( 32, xw ) + } + + palette.forEach(function(lex,x,y){ + if (canvas.vertical) { x=x^y;y=x^y;x=x^y;x*=2 } + if (y < 2) { + lex.bg = palette_fn(x>>1) + lex.fg = palette_fn(x>>1) + } + else { + lex.bg = fillColor + lex.fg = palette_fn(x>>1) + } + lex.char = palette.chars[y] + lex.opacity = 1 + lex.build() + if (lex.char == "_") lex.char = " " + }) + } + palette.repaint() + var use_experimental_palette = false + palette.experimental = function(state){ + use_experimental_palette = typeof state == "boolean" ? state : ! use_experimental_palette + use_experimental_palette ? palette.resize(32, 5) : palette.resize(32, 2) + palette.repaint() + return use_experimental_palette + } + + palette.bind = function(){ + palette.forEach(function(lex, x, y){ + if (lex.bound) return + lex.bound = true + + lex.span.addEventListener('mousedown', function(e){ + e.preventDefault() + if (e.shiftKey) { + palette_index = (palette_index+1) % palette_list.length + localStorage.setItem("ascii.palette", palette_index) + palette_fn = palette_list[palette_index] + palette.repaint() + return + } + if (e.ctrlKey || e.which == 3) return + if (brush.char == " " && lex.char == " ") { + brush.fg = lex.fg + brush.bg = lex.bg + brush.char = lex.char + } + else if (lex.char != " ") { + brush.fg = lex.bg + brush.bg = lex.fg + brush.char = lex.char + } + else { + brush.fg = lex.bg + brush.bg = fillColor +// brush.char = lex.char + } + brush.opacity = lex.opacity + if (! brush.modified) { + brush.generate() + } + if (filling || e.ctrlKey) { + fillColor = lex.bg + } + letters.repaint() + }) + + lex.span.addEventListener('contextmenu', function(e){ + e.preventDefault() + fillColor = y ? lex.fg : lex.bg + palette.repaint() + brush.fg = lex.fg + brush.char = lex.char + brush.opacity = lex.opacity + brush.generate() + brush_rapper.style.borderColor = css_reverse_lookup[fillColor] + return + }) + + }) + } + + brush_rapper.style.borderColor = css_reverse_lookup[fillColor] + + return palette + +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/selection.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/selection.js new file mode 100644 index 0000000..a2720cb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/selection.js @@ -0,0 +1,159 @@ +var selection = (function(){ + + var creating = false, moving = false, copying = false + + var selection_canvas = new Matrix (1, 1, function(x,y){ + var lex = new Lex (x,y) + lex.build() + return lex + }) + + var selector_el = document.createElement("div") + selector_el.className = "selector_el" + selection_canvas.append(selector_el) + document.body.appendChild(selector_el) + + // in selection mode.. + // - we start by clicking the canvas. this positions the selection, and copies + // the character + // - then we drag down and to the right. this resizes the selection and pushes new + // rows and columns. each of these copies the character underneath. + // - on mouseup, the selection is locked. then.. + // - drag the selection to move it -- this "cuts" it and leaves a blank space on the canvas. + // - shift-drag the selection to copy it + + var a = [0, 0] + var b = [0, 0] + var c = [0, 0] + var d = [0, 0] + + function reset () { + a[0] = a[1] = b[0] = b[1] = 0 + } + function left (a,b) { return min(a[0],b[0]) } + function top (a,b) { return min(a[1],b[1]) } + function right (a,b) { return max(a[0],b[0]) } + function bottom (a,b) { return max(a[1],b[1]) } + function width (a,b) { return abs(a[0]-b[0])+1 } + function height (a,b) { return abs(a[1]-b[1])+1 } + function mag_x (a,b) { return a[0]-b[0] } + function mag_y (a,b) { return a[1]-b[1] } + function orient (a,b) { + var l = left(a,b), m = top(a,b), n = right(a,b), o = bottom(a,b) + a[0] = l ; a[1] = m ; b[0] = n ; b[1] = o + } + + function contains (a,b,point) { + var contains_x = a[0] <= point[0] && point[0] <= b[0] + var contains_y = a[1] <= point[1] && point[1] <= b[1] + return (contains_x && contains_y) + } + function reposition (aa, bb) { + aa = aa || a + bb = bb || b + var cell = canvas.aa[top(aa, bb)][left(aa, bb)].span + var cell_left = cell.offsetLeft + var cell_top = cell.offsetTop + var cell_width = cell.offsetWidth + var cell_height = cell.offsetHeight + + var w = width(aa, bb) + var h = height(aa, bb) + + selector_el.style.top = (cell_top-1) + "px" + selector_el.style.left = (cell_left-1) + "px" + selector_el.style.width = (cell_width*w+1) + "px" + selector_el.style.height = (cell_height*h+1) + "px" + } + function down (e, lex, point){ + if ( ! contains(a,b,point) ) { + copying = false + moving = false + creating = true + a[0] = point[0] + a[1] = point[1] + b[0] = point[0] + b[1] = point[1] + reposition(a,b) + selection.hidden = false + selector_el.classList.add("creating") + } else { + copying = false + moving = true + creating = false + c[0] = point[0] + c[1] = point[1] + d[0] = point[0] + d[1] = point[1] + } + show() + selector_el.classList.remove("dragging") + } + function move (e, lex, point){ + if (creating) { + b[0] = point[0] + b[1] = point[1] + reposition(a,b) + } + else if (moving) { + d[0] = point[0] + d[1] = point[1] + var dx = - clamp( mag_x(c,d), b[0] - canvas.w + 1, a[0] ) + var dy = - clamp( mag_y(c,d), b[1] - canvas.h + 1, a[1] ) + reposition( [ a[0] + dx, a[1] + dy ], [ b[0] + dx, b[1] + dy ]) + } + else if (copying) { + } + } + function up (e) { + if (creating) { + orient(a,b) + selection_canvas.resize(width(a,b), height(a,b)) + reposition(a,b) + blit.copy_from( canvas, selection_canvas, a[0], a[1] ) + selection_canvas.build() + selector_el.classList.remove("creating") + } + if (moving) { + var dx = - clamp( mag_x(c,d), b[0] - canvas.w + 1, a[0] ) + var dy = - clamp( mag_y(c,d), b[1] - canvas.h + 1, a[1] ) + a[0] += dx + a[1] += dy + b[0] += dx + b[1] += dy + undo.new() + undo.save_rect(a[0], a[1], b[0] - a[0] + 1, b[1] - a[1] + 1) + blit.copy_to( canvas, selection_canvas, a[0], a[1] ) + } + if (copying) { + } + creating = moving = copying = false + selector_el.classList.remove("dragging") + } + + function show () { + selecting = true + } + function hide () { + reset() + selector_el.style.top = "-9999px" + selector_el.style.left = "-9999px" + selector_el.style.width = "0px" + selector_el.style.height = "0px" + creating = moving = copying = false + selection.hidden = true + selecting = false + } + + var selection = {} + selection.reposition = reposition + selection.down = down + selection.move = move + selection.up = up + selection.canvas = selection_canvas + selection.show = show + selection.hide = hide + selection.hidden = true + return selection + +})() diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/tool.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/tool.js new file mode 100644 index 0000000..d0053a6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/tool.js @@ -0,0 +1,170 @@ +var Tool = Model({ + init: function (el) { + this.el = el + this.lex = new Lex (el) + this.name = el.innerHTML + }, + bind: function(){ + var tool = this + tool.el.addEventListener('mousedown', function(e){ + tool.focus() + }) + tool.el.addEventListener('contextmenu', function(e){ + tool.context(e) + }) + if (tool.memorable) { + // console.log(tool.name, localStorage.getItem("ascii.tools." + tool.name) ) + tool.use( localStorage.getItem("ascii.tools." + tool.name) == "true" ) + } + }, + use: function(){}, + context: function(e){}, + done: function(){}, + focus: function(){ + // focused && focused.blur() + current_tool && current_tool.blur() + current_tool = this + this.el.classList.add('focused') + this.use() + if (this.name != 'shader' && is_desktop) { cursor_input.focus() } + }, + blur: function(){ + current_tool = null + this.el.classList.remove('focused') + this.done() + } +}) + +var FileTool = Tool.extend({ + focus: function(){ + if (current_filetool === this) { + this.blur() + return + } + current_filetool && current_filetool.blur() + current_filetool = this + this.el.classList.add('focused') + this.use() + if (this.name != 'shader' && is_desktop) { cursor_input.focus() } + }, + blur: function(){ + current_filetool = null + this.el.classList.remove('focused') + this.done() + } +}) + +var RadioItem = Tool.extend({ + init: function(group, el){ + this.group = group + this.el = el + }, + focus: function(){ + this.el.classList.add('focused') + }, + blur: function(){ + this.el.classList.remove('focused') + }, + bind: function(){ + var control = this + this.el.addEventListener('mousedown', function(){ + control.group.use(control) + }) + } +}) + +var RadioGroup = Tool.extend({ + init: function(el){ + this.el = el + this.controls = {} + var names = el.innerHTML.split(' ') + el.innerHTML = '' + var group = this + names.forEach(function(value){ + var el = document.createElement('span') + el.classList.add('radio','tool') + var control = new RadioItem(group, el) + if (value.substr(0,1) === '*') { + control.value = value = value.substr(1) + group.use(control) + } + control.value = el.innerHTML = value + group.controls[value] = control + group.el.appendChild(el) + }) + }, + use: function(control){ + if (typeof control === 'string') { + control = this.controls[control] + } + this.selected_control && this.selected_control.blur() + this.value = control.value + this.selected_control = control + control.focus() + control.use() + if (this.memorable){ + localStorage.setItem("ascii.tools." + this.name, this.value) + } + }, + bind: function(){ + var tool = this + for (var n in this.controls){ + this.controls[n].bind() + } + if (tool.memorable) { + var value = localStorage.getItem("ascii.tools." + tool.name) + if (value) tool.use(value) + } + } +}) + +var Checkbox = Tool.extend({ + init: function (el){ + this.__init(el) + var name = this.name.replace(/^[x_] /,"") + var state = localStorage.getItem("ascii.tools." + name) == "true" || this.name[0] == "x" + this.name = name + this.update(state) + }, + update: function(state){ + if (state) this.el.innerHTML = "x " + this.name + else this.el.innerHTML = "_ " + this.name + if (this.memorable) { localStorage.setItem("ascii.tools." + this.name, !! state) } + } +}) + +var BlurredCheckbox = Checkbox.extend({ + focus: function(){ + this.use() + }, + blur: function(){ + this.el.classList.remove('focused') + this.done() + } +}) + +var BlurredTool = Tool.extend({ + focus: function(){ + this.use() + }, + blur: function(){ + this.el.classList.remove('focused') + this.done() + } +}) + +var HiddenCheckbox = BlurredCheckbox.extend({ + on: "o", + off: ".", + init: function (el){ + this.el = el + this.lex = new Lex (el) + this.name = this.el.id + var state = localStorage.getItem("ascii.tools." + name) == "true" || this.el.innerHTML[0] == this.on + this.update(state) + }, + update: function(state){ + this.el.innerHTML = state ? this.on : this.off + if (this.memorable) { localStorage.setItem("ascii.tools." + this.name, !! state) } + } +}) diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/transform.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/transform.js new file mode 100644 index 0000000..d6253bc --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/js/ui/transform.js @@ -0,0 +1,176 @@ +var transform = (function(){ + + var p = [0,0], q = [0,0] + var mode + var copy + + function down (e, lex, point){ + p[0] = point[0] + p[1] = point[1] + q[0] = e.pageX + q[1] = e.pageY + undo.new() + undo.save_rect(0, 0, canvas.w, canvas.h) + copy = canvas.clone() + mode.init(e) + } + function move (e, lex, point){ + var pdx = point[0] - p[0] + var pdy = point[1] - p[1] + var dx = e.pageX - q[0] + var dy = e.pageY - q[1] + var w = canvas.w + var h = canvas.h + mode.before(dx, dy, pdx, pdy, point) + for (var x = 0; x < w; x++) { + for (var y = 0; y < h; y++) { + lex = canvas.get(x, y) + if (! mode.shade( copy, canvas, lex, x, y, w, h )) { + lex.build() + } + } + } + } + function up (e){ + } + + var modes = { + + rotate: { + init: function(e){ + mode.theta = 0 + }, + before: function(dx, dy){ + var radius = dist(0, 0, dx, dy) + if (radius < 10) return + mode.theta = angle(0, 0, dx, -dy) + }, + shade: function(src, dest, lex, x, y, w, h){ + x = (x/w) * 2 - 1 + y = (y/h) * 2 - 1 + var ca = cos(mode.theta) + var sa = sin(mode.theta) + var a = x * ca - y * sa + var b = x * sa + y * ca + x = (a + 1) / 2 * w + y = (b + 1) / 2 * h + var copy = src.get(x, y) + lex.assign(copy) + return true + }, + }, + + scale: { + init: function(e){ + mode.independent = e.shiftKey || e.altKey || e.metaKey + mode.x_scale = mode.y_scale = 0 + }, + before: function(dx, dy, pdx, pdy){ + if (mode.independent) { + mode.x_scale = Math.pow(2, -pdx / (canvas.w / 8)) + mode.y_scale = Math.pow(2, -pdy / (canvas.h / 8)) + } + else { + mode.x_scale = mode.y_scale = Math.pow(2, -pdx / (canvas.w / 8)) + } + }, + shade: function(src, dest, lex, x, y, w, h){ + x = ((x-p[0])/w) * 2 - 1 + y = ((y-p[1])/h) * 2 - 1 + x *= mode.x_scale + y *= mode.y_scale + x = (x + 1) / 2 * w + y = (y + 1) / 2 * h + var copy = src.get(x+p[0], y+p[1]) + lex.assign(copy) + return true + }, + }, + + translate: { + init: function(e){ + mode.dx = mode.dy = 0 + }, + before: function(dx, dy, pdx, pdy){ + mode.dx = -pdx + mode.dy = -pdy + }, + shade: function(src, dest, lex, x, y, w, h){ + var copy = src.get(x+mode.dx, y+mode.dy) + lex.assign(copy) + return true + }, + }, + + slice: { + init: function(e){ + mode.is_y = ! (e.altKey || e.metaKey) + mode.reverse = !! (e.shiftKey) + mode.position = 0 + mode.direction = 0 + mode.last_dd = -1 + }, + before: function(dx, dy, pdx, pdy, point){ + var new_position = mode.is_y ? point[1] : point[0] + var dd = mode.is_y ? pdx : pdy + + if (mode.position !== new_position) { + mode.position = new_position + mode.direction = 0 + } + if (mode.last_dd !== -1) { + mode.direction = mode.last_dd - dd + } + console.log(mode.position) + mode.last_dd = dd + copy.assign(canvas) + }, + shade: function(src, dest, lex, x, y, w, h){ + if (mode.is_y) { + if (y >= mode.position || (mode.reverse && mode.position >= y)) { + var copy = src.get(x + mode.direction, y) + lex.assign(copy) + } + } + else if (x >= mode.position || (mode.reverse && mode.position >= x)) { + var copy = src.get(x, y + mode.direction) + lex.assign(copy) + } + return true + }, + }, + +/* + mode: { + init: function(e){ + }, + before: function(dx, dy, pdx, pdy){ + }, + shade: function(src, dest, lex, x, y, w, h){ + }, + }, +*/ + } + + function set_mode(m){ + if (m in modes) { + mode = modes[m] + transforming = true + } + } + + function done(){ + transforming = false + copy && copy.demolish() + } + + return { + down: down, + move: move, + up: up, + set_mode: set_mode, + modes: modes, + done: done, + } + +})() \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/LICENCE b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/LICENCE new file mode 100644 index 0000000..b451736 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/LICENCE @@ -0,0 +1,29 @@ + Jollo LNT license + Version 1 - February 2015 + + Copyright, 2015. JOLLO NET NA. + The Jollo IRC Network. + + Vu, fare wanderer, confronted with raw, programmatic instruction + dans la forme la plus pure. A hesitation, troubled to the terms + qui ce license affirme. Par un voyage du explorer le mechanisme + et ponder la fabrication. Voila! La remide: egress sans risque. + + Sans trace (Leave No Trace) via sept principales: + + 0. Modifique language en advance. L'Apposer Jollo LNT license + with copies en distribuer. + + 1. Non responsible pour neglige programme du problematique. + + 2. Non sympathie pour neglige programme du problematique. + + 3. Non permission l'modifique under any circumstance. + + 4. Non permission distribution under any circumstance. + + 5. Respect les programmatic instructions. + + 6. Non interfere avec l'harmonie d'une amitie. + + \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/TODO b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/TODO new file mode 100644 index 0000000..9facca6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/text/TODO @@ -0,0 +1,9 @@ +1) document: constraints for video reverse +2) document: Shift + LMB to delete brush, Shift + LMB to switch character sets +3) feature: allow to adjust cutoff warning threshold, {dis,en}able cutoff & print line numbers affected +4) feature: {bold,italic,underline} attributes +5) feature: keyboard instead of [LR]MB +6) feature: {line,measuring} tool +7) feature: status bar w/ position, etc. +8) feature: zoom {in,out} +9) reimplement: {save,upload} as PNG & gallery diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/nativeapiprovider.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/nativeapiprovider.js new file mode 100644 index 0000000..2e9aa67 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/nativeapiprovider.js @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. +*/ + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/promptbasednativeapi.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/promptbasednativeapi.js new file mode 100644 index 0000000..f7fb6bc --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/android/promptbasednativeapi.js @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. +*/ + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used pre-JellyBean, where addJavascriptInterface() is disabled. + */ + +module.exports = { + exec: function(bridgeSecret, service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(bridgeSecret, value) { + prompt(value, 'gap_bridge_mode:' + bridgeSecret); + }, + retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret); + } +}; diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/exec.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/exec.js new file mode 100644 index 0000000..39e8c97 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/exec.js @@ -0,0 +1,286 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + * +*/ + +/** + * Execute a cordova command. It is up to the native side whether this action + * is synchronous or asynchronous. The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchronous: Empty string "" + * If async, the native side will cordova.callbackSuccess or cordova.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in cordova + * @param {String[]} [args] Zero or more arguments to pass to the method + */ +var cordova = require('cordova'), + nativeApiProvider = require('cordova/android/nativeapiprovider'), + utils = require('cordova/utils'), + base64 = require('cordova/base64'), + channel = require('cordova/channel'), + jsToNativeModes = { + PROMPT: 0, + JS_OBJECT: 1 + }, + nativeToJsModes = { + // Polls for messages using the JS->Native bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, + pollEnabled = false, + bridgeSecret = -1; + +var messagesFromNative = []; +var isProcessing = false; +var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve(); +var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); }; + +function androidExec(success, fail, service, action, args) { + if (bridgeSecret < 0) { + // If we ever catch this firing, we'll need to queue up exec()s + // and fire them once we get a secret. For now, I don't think + // it's possible for exec() to be called since plugins are parsed but + // not run until until after onNativeReady. + throw new Error('exec() called without bridgeSecret'); + } + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // If args is not provided, default to an empty array + args = args || []; + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } else if (msgs) { + messagesFromNative.push(msgs); + // Always process async to avoid exceptions messing up stack. + nextTick(processMessages); + } +} + +androidExec.init = function() { + bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); + channel.onNativeReady.fire(); +}; + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + if (bridgeSecret < 0) { + // This can happen when the NativeToJsMessageQueue resets the online state on page transitions. + // We know there's nothing to retrieve, so no need to poll. + return; + } + var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent); + if (msgs) { + messagesFromNative.push(msgs); + // Process sync since we know we're already top-of-stack. + processMessages(); + } +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + // Otherwise, it will be set by androidExec.init() + if (bridgeSecret >= 0) { + nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode); + } + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +function buildPayload(payload, message) { + var payloadKind = message.charAt(0); + if (payloadKind == 's') { + payload.push(message.slice(1)); + } else if (payloadKind == 't') { + payload.push(true); + } else if (payloadKind == 'f') { + payload.push(false); + } else if (payloadKind == 'N') { + payload.push(null); + } else if (payloadKind == 'n') { + payload.push(+message.slice(1)); + } else if (payloadKind == 'A') { + var data = message.slice(1); + payload.push(base64.toArrayBuffer(data)); + } else if (payloadKind == 'S') { + payload.push(window.atob(message.slice(1))); + } else if (payloadKind == 'M') { + var multipartMessages = message.slice(1); + while (multipartMessages !== "") { + var spaceIdx = multipartMessages.indexOf(' '); + var msgLen = +multipartMessages.slice(0, spaceIdx); + var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen); + multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1); + buildPayload(payload, multipartMessage); + } + } else { + payload.push(JSON.parse(message)); + } +} + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + // This is deprecated on the .java side. It doesn't work with CSP enabled. + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadMessage = message.slice(nextSpaceIdx + 1); + var payload = []; + buildPayload(payload, payloadMessage); + cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); + } else { + console.log("processMessage failed: invalid message: " + JSON.stringify(message)); + } +} + +function processMessages() { + // Check for the reentrant case. + if (isProcessing) { + return; + } + if (messagesFromNative.length === 0) { + return; + } + isProcessing = true; + try { + var msg = popMessageFromQueue(); + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (msg == '*' && messagesFromNative.length === 0) { + nextTick(pollOnce); + return; + } + processMessage(msg); + } finally { + isProcessing = false; + if (messagesFromNative.length > 0) { + nextTick(processMessages); + } + } +} + +function popMessageFromQueue() { + var messageBatch = messagesFromNative.shift(); + if (messageBatch == '*') { + return '*'; + } + + var spaceIdx = messageBatch.indexOf(' '); + var msgLen = +messageBatch.slice(0, spaceIdx); + var message = messageBatch.substr(spaceIdx + 1, msgLen); + messageBatch = messageBatch.slice(spaceIdx + msgLen + 1); + if (messageBatch) { + messagesFromNative.unshift(messageBatch); + } + return message; +} + +module.exports = androidExec; diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/platform.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/platform.js new file mode 100644 index 0000000..2bfd024 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/platform.js @@ -0,0 +1,125 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + * +*/ + +// The last resume event that was received that had the result of a plugin call. +var lastResumeEvent = null; + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Get the shared secret needed to use the bridge. + exec.init(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + function bindButtonChannel(buttonName) { + // generic button bind used for volumeup/volumedown buttons + var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button'); + volumeButtonChannel.onHasSubscribersChange = function() { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]); + }; + } + // Inject a listener for the volume buttons on the document. + bindButtonChannel('volumeup'); + bindButtonChannel('volumedown'); + + // The resume event is not "sticky", but it is possible that the event + // will contain the result of a plugin call. We need to ensure that the + // plugin result is delivered even after the event is fired (CB-10498) + var cordovaAddEventListener = document.addEventListener; + + document.addEventListener = function(evt, handler, capture) { + cordovaAddEventListener(evt, handler, capture); + + if (evt === 'resume' && lastResumeEvent) { + handler(lastResumeEvent); + } + }; + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []); + exec(null, null, APP_PLUGIN_NAME, "show", []); + }); + } +}; + +function onMessageFromNative(msg) { + var cordova = require('cordova'); + var action = msg.action; + + switch (action) + { + // Button events + case 'backbutton': + case 'menubutton': + case 'searchbutton': + // App life cycle events + case 'pause': + // Volume events + case 'volumedownbutton': + case 'volumeupbutton': + cordova.fireDocumentEvent(action); + break; + case 'resume': + if(arguments.length > 1 && msg.pendingResult) { + if(arguments.length === 2) { + msg.pendingResult.result = arguments[1]; + } else { + // The plugin returned a multipart message + var res = []; + for(var i = 1; i < arguments.length; i++) { + res.push(arguments[i]); + } + msg.pendingResult.result = res; + } + + // Save the plugin result so that it can be delivered to the js + // even if they miss the initial firing of the event + lastResumeEvent = msg; + } + cordova.fireDocumentEvent(action, msg); + break; + default: + throw new Error('Unknown event action ' + action); + } +} diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/plugin/android/app.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/plugin/android/app.js new file mode 100644 index 0000000..22cf96e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova-js-src/plugin/android/app.js @@ -0,0 +1,108 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + * +*/ + +var exec = require('cordova/exec'); +var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, APP_PLUGIN_NAME, "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, APP_PLUGIN_NAME, "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, APP_PLUGIN_NAME, "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]); + }, + + /** + * Override the default behavior of the Android volume button. + * If overridden, when the volume button is pressed, the "volume[up|down]button" + * JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "volume[up|down]button" event, this is automatically done. + * + * @param button volumeup, volumedown + * @param override T=override, F=cancel override + */ + overrideButton:function(button, override) { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, APP_PLUGIN_NAME, "exitApp", []); + } +}; diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova.js b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova.js new file mode 100644 index 0000000..c6d0632 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/assets/www/cordova.js @@ -0,0 +1,2189 @@ +// Platform: android +// 9e8e1b716252c4a08abcd31a13013b868d6f4141 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +;(function() { +var PLATFORM_VERSION_BUILD_LABEL = '7.1.3'; +// file: src/scripts/require.js + +/* jshint -W079 */ +/* jshint -W020 */ + +var require; +var define; + +(function () { + var modules = {}; + // Stack of moduleIds currently being built. + var requireStack = []; + // Map of module ID -> index into requireStack of modules currently being built. + var inProgressModules = {}; + var SEPARATOR = '.'; + + function build (module) { + var factory = module.factory; + var localRequire = function (id) { + var resultantId = id; + // Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === '.') { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw 'module ' + id + ' not found'; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw 'Cycle in require graph: ' + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw 'module ' + id + ' already defined'; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +// Export for use in node +if (typeof module === 'object' && typeof require === 'function') { + module.exports.require = require; + module.exports.define = define; +} + +// file: src/cordova.js +define("cordova", function(require, exports, module) { + +// Workaround for Windows 10 in hosted environment case +// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object +if (window.cordova && !(window.cordova instanceof HTMLElement)) { // eslint-disable-line no-undef + throw new Error('cordova already defined'); +} + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}; +var windowEventHandlers = {}; + +document.addEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] !== 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] !== 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] !== 'undefined') { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] !== 'undefined') { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent (type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +/* eslint-disable no-undef */ +var cordova = { + define: define, + require: require, + version: PLATFORM_VERSION_BUILD_LABEL, + platformVersion: PLATFORM_VERSION_BUILD_LABEL, + platformId: platform.id, + + /* eslint-enable no-undef */ + + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler: function (event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler: function (event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler: function (event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler: function (event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler: function (event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function () { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function (type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] !== 'undefined') { + if (bNoDetach) { + documentEventHandlers[type].fire(evt); + } else { + setTimeout(function () { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type === 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function (type, data) { + var evt = createEvent(type, data); + if (typeof windowEventHandlers[type] !== 'undefined') { + setTimeout(function () { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function (callbackId, args) { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function (callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) { + try { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (isSuccess && status === cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!isSuccess) { + callback.fail && callback.fail.apply(null, args); + } + /* + else + Note, this case is intentionally not caught. + this can happen if isSuccess is true, but callbackStatus is NO_RESULT + which is used to remove a callback from the list without calling the callbacks + typically keepCallback is false in this case + */ + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + } catch (err) { + var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err; + console && console.log && console.log(msg); + console && console.log && err.stack && console.log(err.stack); + cordova.fireWindowEvent('cordovacallbackerror', { 'message': msg }); + throw err; + } + }, + addConstructor: function (func) { + channel.onCordovaReady.subscribe(function () { + try { + func(); + } catch (e) { + console.log('Failed to run constructor: ' + e); + } + }); + } +}; + +module.exports = cordova; + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/android/nativeapiprovider.js +define("cordova/android/nativeapiprovider", function(require, exports, module) { + +/** + * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi. + */ + +var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi'); +var currentApi = nativeApi; + +module.exports = { + get: function() { return currentApi; }, + setPreferPrompt: function(value) { + currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi; + }, + // Used only by tests. + set: function(value) { + currentApi = value; + } +}; + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/android/promptbasednativeapi.js +define("cordova/android/promptbasednativeapi", function(require, exports, module) { + +/** + * Implements the API of ExposedJsApi.java, but uses prompt() to communicate. + * This is used pre-JellyBean, where addJavascriptInterface() is disabled. + */ + +module.exports = { + exec: function(bridgeSecret, service, action, callbackId, argsJson) { + return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId])); + }, + setNativeToJsBridgeMode: function(bridgeSecret, value) { + prompt(value, 'gap_bridge_mode:' + bridgeSecret); + }, + retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) { + return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret); + } +}; + +}); + +// file: src/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName (callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs (spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i); + var cUpper = c.toUpperCase(); + var arg = args[i]; + // Asterix means allow anything. + if (c === '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c === cUpper) { + continue; + } + if (typeName !== typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine === 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue (value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + +}); + +// file: src/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function (arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +base64.toArrayBuffer = function (str) { + var decodedStr = typeof atob !== 'undefined' ? atob(str) : Buffer.from(str, 'base64').toString('binary'); // eslint-disable-line no-undef + var arrayBuffer = new ArrayBuffer(decodedStr.length); + var array = new Uint8Array(arrayBuffer); + for (var i = 0, len = decodedStr.length; i < len; i++) { + array[i] = decodedStr.charCodeAt(i); + } + return arrayBuffer; +}; + +// ------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +var b64_12bit; + +var b64_12bitTable = function () { + b64_12bit = []; + for (var i = 0; i < 64; i++) { + for (var j = 0; j < 64; j++) { + b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function () { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64 (rawData) { + var numBytes = rawData.byteLength; + var output = ''; + var segment; + var table = b64_12bitTable(); + for (var i = 0; i < numBytes - 2; i += 3) { + segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2]; + output += table[segment >> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i === 2) { + segment = (rawData[i] << 16) + (rawData[i + 1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i === 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: src/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each (objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber (obj, key, value) { + exports.replaceHookForTesting(obj, key); + var needsProperty = false; + try { + obj[key] = value; + } catch (e) { + needsProperty = true; + } + // Getters can only be overridden by getters. + if (needsProperty || obj[key] !== value) { + utils.defineGetter(obj, key, function () { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter (obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function () { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include (parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch (e) { + utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge (target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function (objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function (objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function (objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function () {}; + +}); + +// file: src/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'); +var nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function (type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}; +var channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function (h, c) { + var len = c.length; + var i = len; + var f = function () { + if (!(--i)) h(); + }; + for (var j = 0; j < len; j++) { + if (c[j].state === 0) { + throw Error('Can only use join with sticky channels.'); + } + c[j].subscribe(f); + } + if (!len) h(); + }, + /* eslint-disable no-return-assign */ + create: function (type) { + return channel[type] = new Channel(type, false); + }, + createSticky: function (type) { + return channel[type] = new Channel(type, true); + }, + /* eslint-enable no-return-assign */ + /** + * cordova Channels that must fire before "deviceready" is fired. + */ + deviceReadyChannelsArray: [], + deviceReadyChannelsMap: {}, + + /** + * Indicate that a feature needs to be initialized before it is ready to be used. + * This holds up Cordova's "deviceready" event until the feature has been initialized + * and Cordova.initComplete(feature) is called. + * + * @param feature {String} The unique feature name + */ + waitForInitialization: function (feature) { + if (feature) { + var c = channel[feature] || this.createSticky(feature); + this.deviceReadyChannelsMap[feature] = c; + this.deviceReadyChannelsArray.push(c); + } + }, + + /** + * Indicate that initialization code has completed and the feature is ready to be used. + * + * @param feature {String} The unique feature name + */ + initializationComplete: function (feature) { + var c = this.deviceReadyChannelsMap[feature]; + if (c) { + c.fire(); + } + } +}; + +function checkSubscriptionArgument (argument) { + if (typeof argument !== 'function' && typeof argument.handleEvent !== 'function') { + throw new Error( + 'Must provide a function or an EventListener object ' + + 'implementing the handleEvent interface.' + ); + } +} + +/** + * Subscribes the given function to the channel. Any time that + * Channel.fire is called so too will the function. + * Optionally specify an execution context for the function + * and a guid that can be used to stop subscribing to the channel. + * Returns the guid. + */ +Channel.prototype.subscribe = function (eventListenerOrFunction, eventListener) { + checkSubscriptionArgument(eventListenerOrFunction); + var handleEvent, guid; + + if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') { + // Received an EventListener object implementing the handleEvent interface + handleEvent = eventListenerOrFunction.handleEvent; + eventListener = eventListenerOrFunction; + } else { + // Received a function to handle event + handleEvent = eventListenerOrFunction; + } + + if (this.state === 2) { + handleEvent.apply(eventListener || this, this.fireArgs); + return; + } + + guid = eventListenerOrFunction.observer_guid; + if (typeof eventListener === 'object') { + handleEvent = utils.close(eventListener, handleEvent); + } + + if (!guid) { + // First time any channel has seen this subscriber + guid = '' + nextGuid++; + } + handleEvent.observer_guid = guid; + eventListenerOrFunction.observer_guid = guid; + + // Don't add the same handler more than once. + if (!this.handlers[guid]) { + this.handlers[guid] = handleEvent; + this.numHandlers++; + if (this.numHandlers === 1) { + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +/** + * Unsubscribes the function with the given guid from the channel. + */ +Channel.prototype.unsubscribe = function (eventListenerOrFunction) { + checkSubscriptionArgument(eventListenerOrFunction); + var handleEvent, guid, handler; + + if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') { + // Received an EventListener object implementing the handleEvent interface + handleEvent = eventListenerOrFunction.handleEvent; + } else { + // Received a function to handle event + handleEvent = eventListenerOrFunction; + } + + guid = handleEvent.observer_guid; + handler = this.handlers[guid]; + if (handler) { + delete this.handlers[guid]; + this.numHandlers--; + if (this.numHandlers === 0) { + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +/** + * Calls all functions subscribed to this channel. + */ +Channel.prototype.fire = function (e) { + var fail = false; // eslint-disable-line no-unused-vars + var fireArgs = Array.prototype.slice.call(arguments); + // Apply stickiness. + if (this.state === 1) { + this.state = 2; + this.fireArgs = fireArgs; + } + if (this.numHandlers) { + // Copy the values first so that it is safe to modify it from within + // callbacks. + var toCall = []; + for (var item in this.handlers) { + toCall.push(this.handlers[item]); + } + for (var i = 0; i < toCall.length; ++i) { + toCall[i].apply(this, fireArgs); + } + if (this.state === 2 && this.numHandlers) { + this.numHandlers = 0; + this.handlers = {}; + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +// defining them here so they are ready super fast! +// DOM event that is received when the web page is loaded and parsed. +channel.createSticky('onDOMContentLoaded'); + +// Event to indicate the Cordova native side is ready. +channel.createSticky('onNativeReady'); + +// Event to indicate that all Cordova JavaScript objects have been created +// and it's time to run plugin constructors. +channel.createSticky('onCordovaReady'); + +// Event to indicate that all automatically loaded JS plugins are loaded and ready. +// FIXME remove this +channel.createSticky('onPluginsReady'); + +// Event to indicate that Cordova is ready +channel.createSticky('onDeviceReady'); + +// Event to indicate a resume lifecycle event +channel.create('onResume'); + +// Event to indicate a pause lifecycle event +channel.create('onPause'); + +// Channels that must fire before "deviceready" is fired. +channel.waitForInitialization('onCordovaReady'); +channel.waitForInitialization('onDOMContentLoaded'); + +module.exports = channel; + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/exec.js +define("cordova/exec", function(require, exports, module) { + +/** + * Execute a cordova command. It is up to the native side whether this action + * is synchronous or asynchronous. The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchronous: Empty string "" + * If async, the native side will cordova.callbackSuccess or cordova.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in cordova + * @param {String[]} [args] Zero or more arguments to pass to the method + */ +var cordova = require('cordova'), + nativeApiProvider = require('cordova/android/nativeapiprovider'), + utils = require('cordova/utils'), + base64 = require('cordova/base64'), + channel = require('cordova/channel'), + jsToNativeModes = { + PROMPT: 0, + JS_OBJECT: 1 + }, + nativeToJsModes = { + // Polls for messages using the JS->Native bridge. + POLLING: 0, + // For LOAD_URL to be viable, it would need to have a work-around for + // the bug where the soft-keyboard gets dismissed when a message is sent. + LOAD_URL: 1, + // For the ONLINE_EVENT to be viable, it would need to intercept all event + // listeners (both through addEventListener and window.ononline) as well + // as set the navigator property itself. + ONLINE_EVENT: 2, + EVAL_BRIDGE: 3 + }, + jsToNativeBridgeMode, // Set lazily. + nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, + pollEnabled = false, + bridgeSecret = -1; + +var messagesFromNative = []; +var isProcessing = false; +var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve(); +var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); }; + +function androidExec(success, fail, service, action, args) { + if (bridgeSecret < 0) { + // If we ever catch this firing, we'll need to queue up exec()s + // and fire them once we get a secret. For now, I don't think + // it's possible for exec() to be called since plugins are parsed but + // not run until until after onNativeReady. + throw new Error('exec() called without bridgeSecret'); + } + // Set default bridge modes if they have not already been set. + // By default, we use the failsafe, since addJavascriptInterface breaks too often + if (jsToNativeBridgeMode === undefined) { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } + + // If args is not provided, default to an empty array + args = args || []; + + // Process any ArrayBuffers in the args into a string. + for (var i = 0; i < args.length; i++) { + if (utils.typeName(args[i]) == 'ArrayBuffer') { + args[i] = base64.fromArrayBuffer(args[i]); + } + } + + var callbackId = service + cordova.callbackId++, + argsJson = JSON.stringify(args); + if (success || fail) { + cordova.callbacks[callbackId] = {success:success, fail:fail}; + } + + var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson); + // If argsJson was received by Java as null, try again with the PROMPT bridge mode. + // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. + if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") { + androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); + androidExec(success, fail, service, action, args); + androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); + } else if (msgs) { + messagesFromNative.push(msgs); + // Always process async to avoid exceptions messing up stack. + nextTick(processMessages); + } +} + +androidExec.init = function() { + //CB-11828 + //This failsafe checks the version of Android and if it's Jellybean, it switches it to + //using the Online Event bridge for communicating from Native to JS + // + //It's ugly, but it's necessary. + var check = navigator.userAgent.toLowerCase().match(/android\s[0-9].[0-9]/); + var version_code = check && check[0].match(/4.[0-3].*/); + if (version_code != null && nativeToJsBridgeMode == nativeToJsModes.EVAL_BRIDGE) { + nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT; + } + + bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); + channel.onNativeReady.fire(); +}; + +function pollOnceFromOnlineEvent() { + pollOnce(true); +} + +function pollOnce(opt_fromOnlineEvent) { + if (bridgeSecret < 0) { + // This can happen when the NativeToJsMessageQueue resets the online state on page transitions. + // We know there's nothing to retrieve, so no need to poll. + return; + } + var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent); + if (msgs) { + messagesFromNative.push(msgs); + // Process sync since we know we're already top-of-stack. + processMessages(); + } +} + +function pollingTimerFunc() { + if (pollEnabled) { + pollOnce(); + setTimeout(pollingTimerFunc, 50); + } +} + +function hookOnlineApis() { + function proxyEvent(e) { + cordova.fireWindowEvent(e.type); + } + // The network module takes care of firing online and offline events. + // It currently fires them only on document though, so we bridge them + // to window here (while first listening for exec()-releated online/offline + // events). + window.addEventListener('online', pollOnceFromOnlineEvent, false); + window.addEventListener('offline', pollOnceFromOnlineEvent, false); + cordova.addWindowEventHandler('online'); + cordova.addWindowEventHandler('offline'); + document.addEventListener('online', proxyEvent, false); + document.addEventListener('offline', proxyEvent, false); +} + +hookOnlineApis(); + +androidExec.jsToNativeModes = jsToNativeModes; +androidExec.nativeToJsModes = nativeToJsModes; + +androidExec.setJsToNativeBridgeMode = function(mode) { + if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { + mode = jsToNativeModes.PROMPT; + } + nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); + jsToNativeBridgeMode = mode; +}; + +androidExec.setNativeToJsBridgeMode = function(mode) { + if (mode == nativeToJsBridgeMode) { + return; + } + if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { + pollEnabled = false; + } + + nativeToJsBridgeMode = mode; + // Tell the native side to switch modes. + // Otherwise, it will be set by androidExec.init() + if (bridgeSecret >= 0) { + nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode); + } + + if (mode == nativeToJsModes.POLLING) { + pollEnabled = true; + setTimeout(pollingTimerFunc, 1); + } +}; + +function buildPayload(payload, message) { + var payloadKind = message.charAt(0); + if (payloadKind == 's') { + payload.push(message.slice(1)); + } else if (payloadKind == 't') { + payload.push(true); + } else if (payloadKind == 'f') { + payload.push(false); + } else if (payloadKind == 'N') { + payload.push(null); + } else if (payloadKind == 'n') { + payload.push(+message.slice(1)); + } else if (payloadKind == 'A') { + var data = message.slice(1); + payload.push(base64.toArrayBuffer(data)); + } else if (payloadKind == 'S') { + payload.push(window.atob(message.slice(1))); + } else if (payloadKind == 'M') { + var multipartMessages = message.slice(1); + while (multipartMessages !== "") { + var spaceIdx = multipartMessages.indexOf(' '); + var msgLen = +multipartMessages.slice(0, spaceIdx); + var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen); + multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1); + buildPayload(payload, multipartMessage); + } + } else { + payload.push(JSON.parse(message)); + } +} + +// Processes a single message, as encoded by NativeToJsMessageQueue.java. +function processMessage(message) { + var firstChar = message.charAt(0); + if (firstChar == 'J') { + // This is deprecated on the .java side. It doesn't work with CSP enabled. + eval(message.slice(1)); + } else if (firstChar == 'S' || firstChar == 'F') { + var success = firstChar == 'S'; + var keepCallback = message.charAt(1) == '1'; + var spaceIdx = message.indexOf(' ', 2); + var status = +message.slice(2, spaceIdx); + var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); + var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); + var payloadMessage = message.slice(nextSpaceIdx + 1); + var payload = []; + buildPayload(payload, payloadMessage); + cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); + } else { + console.log("processMessage failed: invalid message: " + JSON.stringify(message)); + } +} + +function processMessages() { + // Check for the reentrant case. + if (isProcessing) { + return; + } + if (messagesFromNative.length === 0) { + return; + } + isProcessing = true; + try { + var msg = popMessageFromQueue(); + // The Java side can send a * message to indicate that it + // still has messages waiting to be retrieved. + if (msg == '*' && messagesFromNative.length === 0) { + nextTick(pollOnce); + return; + } + processMessage(msg); + } finally { + isProcessing = false; + if (messagesFromNative.length > 0) { + nextTick(processMessages); + } + } +} + +function popMessageFromQueue() { + var messageBatch = messagesFromNative.shift(); + if (messageBatch == '*') { + return '*'; + } + + var spaceIdx = messageBatch.indexOf(' '); + var msgLen = +messageBatch.slice(0, spaceIdx); + var message = messageBatch.substr(spaceIdx + 1, msgLen); + messageBatch = messageBatch.slice(spaceIdx + msgLen + 1); + if (messageBatch) { + messagesFromNative.unshift(messageBatch); + } + return message; +} + +module.exports = androidExec; + +}); + +// file: src/common/exec/proxy.js +define("cordova/exec/proxy", function(require, exports, module) { + +// internal map of proxy function +var CommandProxyMap = {}; + +module.exports = { + + // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...); + add: function (id, proxyObj) { + console.log('adding proxy for ' + id); + CommandProxyMap[id] = proxyObj; + return proxyObj; + }, + + // cordova.commandProxy.remove("Accelerometer"); + remove: function (id) { + var proxy = CommandProxyMap[id]; + delete CommandProxyMap[id]; + CommandProxyMap[id] = null; + return proxy; + }, + + get: function (service, action) { + return (CommandProxyMap[service] ? CommandProxyMap[service][action] : null); + } +}; + +}); + +// file: src/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); +var utils = require('cordova/utils'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels (arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state !== 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function () { + if (channel.onDeviceReady.state !== 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator (origNavigator) { + var CordovaNavigator = function () {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] === 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } else { + (function (k) { + utils.defineGetterSetter(newNavigator, key, function () { + return origNavigator[k]; + }); + })(key); + } + } + } + return newNavigator; +} + +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function () {} + }; +} +if (!window.console.warn) { + window.console.warn = function (msg) { + this.log('warn: ' + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState === 'complete' || document.readyState === 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function () { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function () { + pluginloader.load(function () { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function () { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function () { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + +}); + +// file: src/common/init_b.js +define("cordova/init_b", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); +var utils = require('cordova/utils'); + +var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady]; + +// setting exec +cordova.exec = require('cordova/exec'); + +function logUnfiredChannels (arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state !== 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function () { + if (channel.onDeviceReady.state !== 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator (origNavigator) { + var CordovaNavigator = function () {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + if (typeof origNavigator[key] === 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } else { + (function (k) { + utils.defineGetterSetter(newNavigator, key, function () { + return origNavigator[k]; + }); + })(key); + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function () {} + }; +} +if (!window.console.warn) { + window.console.warn = function (msg) { + this.log('warn: ' + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState === 'complete' || document.readyState === 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function () { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function () { + pluginloader.load(function () { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function () { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function () { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + +}); + +// file: src/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'); +var moduleMap = define.moduleMap; // eslint-disable-line no-undef +var symbolList; +var deprecationMap; + +exports.reset = function () { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function (moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace (symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function (context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy === 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy === 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy === 'd' && !target) || (strategy !== 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function (context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + +}); + +// file: src/common/modulemapper_b.js +define("cordova/modulemapper_b", function(require, exports, module) { + +var builder = require('cordova/builder'); +var symbolList = []; +var deprecationMap; + +exports.reset = function () { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) { + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function (moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace (symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function (context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy === 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy === 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy === 'd' && !target) || (strategy !== 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function (context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/platform.js +define("cordova/platform", function(require, exports, module) { + +// The last resume event that was received that had the result of a plugin call. +var lastResumeEvent = null; + +module.exports = { + id: 'android', + bootstrap: function() { + var channel = require('cordova/channel'), + cordova = require('cordova'), + exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'); + + // Get the shared secret needed to use the bridge. + exec.init(); + + // TODO: Extract this as a proper plugin. + modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); + + var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + + // Inject a listener for the backbutton on the document. + var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); + backButtonChannel.onHasSubscribersChange = function() { + // If we just attached the first handler or detached the last handler, + // let native know we need to override the back button. + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]); + }; + + // Add hardware MENU and SEARCH button handlers + cordova.addDocumentEventHandler('menubutton'); + cordova.addDocumentEventHandler('searchbutton'); + + function bindButtonChannel(buttonName) { + // generic button bind used for volumeup/volumedown buttons + var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button'); + volumeButtonChannel.onHasSubscribersChange = function() { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]); + }; + } + // Inject a listener for the volume buttons on the document. + bindButtonChannel('volumeup'); + bindButtonChannel('volumedown'); + + // The resume event is not "sticky", but it is possible that the event + // will contain the result of a plugin call. We need to ensure that the + // plugin result is delivered even after the event is fired (CB-10498) + var cordovaAddEventListener = document.addEventListener; + + document.addEventListener = function(evt, handler, capture) { + cordovaAddEventListener(evt, handler, capture); + + if (evt === 'resume' && lastResumeEvent) { + handler(lastResumeEvent); + } + }; + + // Let native code know we are all done on the JS side. + // Native code will then un-hide the WebView. + channel.onCordovaReady.subscribe(function() { + exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []); + exec(null, null, APP_PLUGIN_NAME, "show", []); + }); + } +}; + +function onMessageFromNative(msg) { + var cordova = require('cordova'); + var action = msg.action; + + switch (action) + { + // Button events + case 'backbutton': + case 'menubutton': + case 'searchbutton': + // App life cycle events + case 'pause': + // Volume events + case 'volumedownbutton': + case 'volumeupbutton': + cordova.fireDocumentEvent(action); + break; + case 'resume': + if(arguments.length > 1 && msg.pendingResult) { + if(arguments.length === 2) { + msg.pendingResult.result = arguments[1]; + } else { + // The plugin returned a multipart message + var res = []; + for(var i = 1; i < arguments.length; i++) { + res.push(arguments[i]); + } + msg.pendingResult.result = res; + } + + // Save the plugin result so that it can be delivered to the js + // even if they miss the initial firing of the event + lastResumeEvent = msg; + } + cordova.fireDocumentEvent(action, msg); + break; + default: + throw new Error('Unknown event action ' + action); + } +} + +}); + +// file: /Users/brodybits/Documents/cordova/cordova-android/cordova-js-src/plugin/android/app.js +define("cordova/plugin/android/app", function(require, exports, module) { + +var exec = require('cordova/exec'); +var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; + +module.exports = { + /** + * Clear the resource cache. + */ + clearCache:function() { + exec(null, null, APP_PLUGIN_NAME, "clearCache", []); + }, + + /** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ + loadUrl:function(url, props) { + exec(null, null, APP_PLUGIN_NAME, "loadUrl", [url, props]); + }, + + /** + * Cancel loadUrl that is waiting to be loaded. + */ + cancelLoadUrl:function() { + exec(null, null, APP_PLUGIN_NAME, "cancelLoadUrl", []); + }, + + /** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ + clearHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "clearHistory", []); + }, + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + backHistory:function() { + exec(null, null, APP_PLUGIN_NAME, "backHistory", []); + }, + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ + overrideBackbutton:function(override) { + exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]); + }, + + /** + * Override the default behavior of the Android volume button. + * If overridden, when the volume button is pressed, the "volume[up|down]button" + * JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "volume[up|down]button" event, this is automatically done. + * + * @param button volumeup, volumedown + * @param override T=override, F=cancel override + */ + overrideButton:function(button, override) { + exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]); + }, + + /** + * Exit and terminate the application. + */ + exitApp:function() { + return exec(null, null, APP_PLUGIN_NAME, "exitApp", []); + } +}; + +}); + +// file: src/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Helper function to inject a + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/java/com/lalbornoz/asciiblaster/MainActivity.java b/asciiblaster-cordoba/platforms/android/app/src/main/java/com/lalbornoz/asciiblaster/MainActivity.java new file mode 100644 index 0000000..4a7b228 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/java/com/lalbornoz/asciiblaster/MainActivity.java @@ -0,0 +1,41 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +package com.lalbornoz.asciiblaster; + +import android.os.Bundle; +import org.apache.cordova.*; + +public class MainActivity extends CordovaActivity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // enable Cordova apps to be started in the background + Bundle extras = getIntent().getExtras(); + if (extras != null && extras.getBoolean("cdvStartInBackground", false)) { + moveTaskToBack(true); + } + + // Set by in config.xml + loadUrl(launchUrl); + } +} diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/java/org/apache/cordova/whitelist/WhitelistPlugin.java b/asciiblaster-cordoba/platforms/android/app/src/main/java/org/apache/cordova/whitelist/WhitelistPlugin.java new file mode 100644 index 0000000..3656788 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/java/org/apache/cordova/whitelist/WhitelistPlugin.java @@ -0,0 +1,161 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova.whitelist; + +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.ConfigXmlParser; +import org.apache.cordova.LOG; +import org.apache.cordova.Whitelist; +import org.xmlpull.v1.XmlPullParser; + +import android.content.Context; + +public class WhitelistPlugin extends CordovaPlugin { + private static final String LOG_TAG = "WhitelistPlugin"; + private Whitelist allowedNavigations; + private Whitelist allowedIntents; + private Whitelist allowedRequests; + + // Used when instantiated via reflection by PluginManager + public WhitelistPlugin() { + } + // These can be used by embedders to allow Java-configuration of whitelists. + public WhitelistPlugin(Context context) { + this(new Whitelist(), new Whitelist(), null); + new CustomConfigXmlParser().parse(context); + } + public WhitelistPlugin(XmlPullParser xmlParser) { + this(new Whitelist(), new Whitelist(), null); + new CustomConfigXmlParser().parse(xmlParser); + } + public WhitelistPlugin(Whitelist allowedNavigations, Whitelist allowedIntents, Whitelist allowedRequests) { + if (allowedRequests == null) { + allowedRequests = new Whitelist(); + allowedRequests.addWhiteListEntry("file:///*", false); + allowedRequests.addWhiteListEntry("data:*", false); + } + this.allowedNavigations = allowedNavigations; + this.allowedIntents = allowedIntents; + this.allowedRequests = allowedRequests; + } + @Override + public void pluginInitialize() { + if (allowedNavigations == null) { + allowedNavigations = new Whitelist(); + allowedIntents = new Whitelist(); + allowedRequests = new Whitelist(); + new CustomConfigXmlParser().parse(webView.getContext()); + } + } + + private class CustomConfigXmlParser extends ConfigXmlParser { + @Override + public void handleStartTag(XmlPullParser xml) { + String strNode = xml.getName(); + if (strNode.equals("content")) { + String startPage = xml.getAttributeValue(null, "src"); + allowedNavigations.addWhiteListEntry(startPage, false); + } else if (strNode.equals("allow-navigation")) { + String origin = xml.getAttributeValue(null, "href"); + if ("*".equals(origin)) { + allowedNavigations.addWhiteListEntry("http://*/*", false); + allowedNavigations.addWhiteListEntry("https://*/*", false); + allowedNavigations.addWhiteListEntry("data:*", false); + } else { + allowedNavigations.addWhiteListEntry(origin, false); + } + } else if (strNode.equals("allow-intent")) { + String origin = xml.getAttributeValue(null, "href"); + allowedIntents.addWhiteListEntry(origin, false); + } else if (strNode.equals("access")) { + String origin = xml.getAttributeValue(null, "origin"); + String subdomains = xml.getAttributeValue(null, "subdomains"); + boolean external = (xml.getAttributeValue(null, "launch-external") != null); + if (origin != null) { + if (external) { + LOG.w(LOG_TAG, "Found within config.xml. Please use instead."); + allowedIntents.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); + } else { + if ("*".equals(origin)) { + allowedRequests.addWhiteListEntry("http://*/*", false); + allowedRequests.addWhiteListEntry("https://*/*", false); + } else { + allowedRequests.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); + } + } + } + } + } + @Override + public void handleEndTag(XmlPullParser xml) { + } + } + + @Override + public Boolean shouldAllowNavigation(String url) { + if (allowedNavigations.isUrlWhiteListed(url)) { + return true; + } + return null; // Default policy + } + + @Override + public Boolean shouldAllowRequest(String url) { + if (Boolean.TRUE == shouldAllowNavigation(url)) { + return true; + } + if (allowedRequests.isUrlWhiteListed(url)) { + return true; + } + return null; // Default policy + } + + @Override + public Boolean shouldOpenExternalUrl(String url) { + if (allowedIntents.isUrlWhiteListed(url)) { + return true; + } + return null; // Default policy + } + + public Whitelist getAllowedNavigations() { + return allowedNavigations; + } + + public void setAllowedNavigations(Whitelist allowedNavigations) { + this.allowedNavigations = allowedNavigations; + } + + public Whitelist getAllowedIntents() { + return allowedIntents; + } + + public void setAllowedIntents(Whitelist allowedIntents) { + this.allowedIntents = allowedIntents; + } + + public Whitelist getAllowedRequests() { + return allowedRequests; + } + + public void setAllowedRequests(Whitelist allowedRequests) { + this.allowedRequests = allowedRequests; + } +} diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-hdpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-hdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..2d564f49c90572edb628bb3b81284900ca3b52f5 GIT binary patch literal 64368 zcmV)3K+C_0P)Cc< zsHmu?sHmu@sHmr@si>%_si~={s;a4~s;a7~s;jH3tgNi7tgNlAt*)-FudlDLu&}YQ zv9hwVv9hwWv$M0Zv$V9dv$V9ewY9mqx$5fb?Ck95=;-F==Huhz!otGK%gg)w`}p|y z_V)Jl^z`!b^6>ER?(Xi>)6=)Nx8&vI(~Z zR5(RagNu_`V{O2|z{<+X(b3W5GrP{{Qs<|7wn!WVFR;p|I4{ z(|&$_-QM2f;^E=o;C6O)YH)Q=gOX90szScd($dl0-P~beVcXleQE3F-VR**uQ_0}jvg^!96}G#}r09zl2fC>`TNu*Z4+Lqu`(C3%hy_FXKcMKX40 zW8d%wc=^$5Y<#5O`86}=A745`cP)S3P5<7`H~xBU&N}!LC&t;`{*LB+_c6{R<3r}V zd_k0#9#+gU*Y8CQkG&{FXo2=hme-2f6&1&^IM%7<)hkAqRy4b^J#;~TPZUvC{d|H#>p9P92-C9;C!Ks zV~+J)sn6r8pI8UIzA=8-uXqgSqYzHtE4SmEM$w&%S9{$J=PpYq3-eQJ+U}nhk)Hdq ze%dY?qV{q=_O3awbgMs17WDG8cZPEoK4yC5_H$>XE)F~9)KYmKhx1xi8CzHHW=r4L zc8Uz+1EKRgH_>CmOMz!?McIjG`Ybc@# zPR`}f@CY@00!$85S2@-T=g=7g*-B)2kXP$fsvG%9!JpsI{U*&fY_lF-t^#S&Q$3yh6J`{~n(IfjFRp7z5;z8o(` zBHbv3Q0F|CyR9c>>vl|P`Rsc)Qyuy@O>q@Jkj<#wgGcrG0 zFQ-Q)=|$z%ijq~Y)0r8NgJCr(|B1)8=wZtha#mG4`8K1f*p>ErSN-s^b50ml-Q_;zq|KUc+#0-m{QvA4n25$^a}yrf$xFV@t0>j}m8+KTQHUN{vmq zwNC(YuENeG08AJQB4X+c*2( ztqbmgkBpOpI81=BFo|gSmQ7#JJmWYB^Ct<(&YX77)6`YpWbb>=mSL7`&{fu@q=I--D0{*@AAl&frOYNnv=8f=2AJZ2yaml16evWmw3E zcB1D7zGE;Rh&=0r84dzQ9&tsjh8{DL?Fh?cdgvHB;QI%2WI=&VG>}etOqICup~Tk< zFK}kmL)G4 zG6X=*_{D>YmPvxkDUjPY&h+WrMx)4tmzch0lE-DJlkI$_COimNCYkd*iL#%0bf_?Z zvWbh>e217$-!H@#>DwS@kP%)MQK)4}{df}*pTimrs3UQVFk`=wjv?^yIc;YY{7AGj z&}M{jL;^4pg6SHhije#knn4$|dBtNx$HQ{2{$LAb#2rMR2MtF(tA|N5UB!THyk$O( zETKSAP$Drjb_6W3pyObYm!v6~T<6O0M!y#V+rmjg zBmzwN8Gs_~r0TE}1pt{vwh=~BqaROpJrS0xMPVWwi^AMUmFeT;;lXBE?#9~Lks z;5n@lLGeq>#{l6;&KBR+_r#2D;YTp>@_k66Q|RIjMiU!~%qdjjC)(qza^s24kHRA^ zJ2~nOKky}r0g5BeZYR@ml#m^FO-8=(>BQq+Rtlj6Yh{=fq|Jz%AmZ!R-2 zCN60~5HxXO?-9;{Vnv9&NeWsYA{{GC>pXq{CzlLhnoVous4NKOw7DR07E}4!n!Z8Z zXWMM5BX3D26ApIZ9nv*!yq#5%*0g-1q3)^G)Rdp8VInIwuK*mr<0lCM+F{uoh@PpQ zS0bEQEhpYHp;CZ?5c~*aFt3Qa4q2Z0R>DaS?(zTfF+e8H0$l>Y6(xBmBEUKn@}GHF+K92-g&Ny-uN*q-!G z*;A6o6x^~B-H2N?G+juP>eg;W^>D48nMOKRGFPMNQ+zfe_moWF$cIacMOO>8UmLa{ zYP?%!*tVv69L6|~mV?AL$HTZ>fJ&{^g{v#u9=6~()O`tCg}{U!ezW&2dtYy!@p_5S z2T%s;*WN!I$DtvkCRD+^C=V<5rmHxXCdyma$*?7O^J<%g4M*nqRcNGDGXjK44-ee#+eTjX(qXVhEyo=O z+0<0SHLN?&YoU&}#0lLrbcxqp`lb=C7Ow)#6CJy5%y zxc;n}a0Gd*_^-zJxMIrovxV~k%J2UN?EwcW_ci91$p+!xhkeDLiHErXE;Uc z7eY<8OUEAmmXCto^Y(#`T3LI?GH5$5F+RGpkFNcW-|;*CD+}c7Uw-ZV((vx~KXVA_ zAA9fPpBKoV**tzGoPG7?71x$Ol;u~gyY}^iBDj}`$Db1O_~VKy*2i_y-1(`nzIJCa z_+_E#!@X;1=;;dP{qa+A{=8Z)GWhj9HdB{=UR~GrkN&Yh+UOoEU&Qh-J%4b!M?N9x z&H6K=63`5OeP;9P?$2X!Sxbx{^07$OSEH;WH?FI<^U~JGYi)MR>F(<XiFwvK90_b%?#6~WyF&CK&fS90qP75b>Hzgk?<{B>#Z zb#tyWnRzVGFu_B8F}IS`3J2laEeFY~XT6ctt$`C-A(3}6WZrsh_+9H2I_|o58vsf8dcfvA@U^bR-8hLK zCU!~q+$*B8Vv%gcpoLqe_5LxGYFWe95mgvQd8C7nw0;-(V%+BPCVze4 zkeRs?UGu5`M5jy=8WAS7bP=2q457#-kgH{-&4WeEla)wnv;HN?=zAeZ^1p%y0x4}m z*X|{(E)&V^w6c{Asu#rfWn@bQz?0r2~z=U4APQ)1G3g3Qf52` zekPvQ^=d2vb-#0JBNQl(GqVVm3`iyKYv02Rh>_P{t7rHsU*6Jqiq+8J|1{|Rk zfhOL*DBLh)f|P)kC!vZLea8q=zPNBD36{9lPVRa6@*d;`oK@v!(0-F$M4*KlyMqFM zHZ8Dm-3=*BoRT-z0cc^QSz9ya&@`fEi;qa{FN>Ac>Z`DTAXror|Mnb``w)#PFhu(*kx=@4oT+~60Jl>$CvttU%NP`X@S&nCOq*j5d1-hi+A%%65X zsaji^kXqL;z(NmA7Z4R@9oDXtJ9ucqRGSMbqNADf<+bqX%<|Ets|&(H3vk=2Ha)w4TBg0CEU5CvyPgp1oxAj-wNml=FQ3(e=j`|nA6Ef*OfFZ_7oxRD3p1^bsV8GF zcC+M!Eq&X>0N^*`Dl-&eCiKIjVN65x1a3RJ5l|i=`98VR^a#Ne*zT-BuWII}F|8Lh z$Qz$-Y_T>ETnp2MskuSx+y1BX4tu?>eO;cg4R6P#6jiXbo!#+_}sbRU)0h_ zGd3&!Z6R$Q^!(Xlr?U~SH34^Q3-==!fH3HcK?o&JDF0(x-{p$GErRj#hpHpKD``A_S`MAYgjePWf=|z@B zUM9;Gi+?cMU$=9u)-A@(uIr}#Q>Yugwc18^Gs~UeEIIleE1rK>dVB zPu#wL$+1AYm$lbBBjml;Vv)XFanIFjh_5<-?pyzKrEJmen;?2-Y|(h?GNlsw;ldtt z-|5w%F8SnfQWDUwVsp!1Z7xt1Nn`IB&HU-1uKD)@>ubODslXbc7k*{B+q`y}e{f^=eS-v2Z91=pO6j}zrv802nCE(+nsi>;g`(sPaL)}+i|V>Q zicYNy)8Jg$$4ihaiWX%7H3~|!exI%-Hm9YasekQF$8Z{-f2x#Sl|C&e z<+YDJ(w}ALX-iGm{8UQHT;Hnt=3O3pXS8^^`1N`v9m+y~{qrV#>Gu{UaF$(yxE zYuO>Scax+Jyu~vJyb1NLwy_epo?ma3*Hx}jyH=`W-o~jXZv~p&w`yDQ7?>xFF-~8a;uQB} zuH`LJ@8#!ZY8#=EEJbzGi(joD*JRDR^g)rd`?UUBWEGh=Qgq?mh+dw_nhsit>n-sO3-?QMs$-orLUYchk!aJBVW*@&mxn73+JHcvVuX-~PZNv^5{Gd;G2 z-H%GSj(WIW;i^1w}v1c6o?7J4B-TUt(_KC1nQn#8g&onk#Q=Qm7;|US9aI-AEgI zPkW(CG@ZbGdYu<90kEO4G+oI-!{(V|L?0}KVQ{jVpm<_aA%$FnUAfIu?3Z&Rx7b$% zY+8L!g=7_5Nzf-eiMla|O2Z~Qkjq>~RAttMwchmiqr;P@M_pirttuaiD{yo*rpcaoC?%5 z{BRCBdG5t&n0DSt6G`Tns=5E7nlc3@aGD1J>~f(KAWlgChRb_M6Y0%X&S zQSl7c@vc0nrnl2~95^&JiT?8z$N>*bc+Pajr%6zj(z$db?kA#j$<*T2D0J=IIJ0e{ zKyUmu7l<`^HjQ3^jBMGJUI=^o-NnF*J~z;)q?s;+qFEDRu9=<$>9f)5j7n;LQ0ZdY617=vfT(yi zwZihsjXqB_q^DIVO>$804Ym^2PLe22&enf3D~#?nY)zf2oFZ&e*Jhn~t$pf-v9=|u z_m%Zx-pJUWTWs}GdA2MBvGeMn8TW{S>V7>IRrf30O|M%ncBf6Z`1XiuQnhVHu9mcm zVR(k=_8ej>4Q4lYwhf&-EQtb zZEK=cOXx#`v_SqB#_#xlf925c`2XzH+iu)SuLNM-FOBWI|I6;ol=y!r1dRp+@4-5l z$w*B$&n(KvTZcevt?3fuw~j{K7yCfizcH8z*EUXn-3@oQcVu4g@5uW8_MngGZ-Ara zVd;dA#tOdF*R6Ca#$neYocGpw6}61NPI`TXLA=88{T;2;y*VIUnB51@x=YeP7){?h zCD>>Odh5BYCF~H11(A0h%E~Hm?AFA|oJ)pLAcvzR2ZkP!Sf(E+l-I=P8Ubb0NSE!c>(aByyH-Nger7VfUrVGUF*qqgb*-hz)Yp<=Pin z6h?Y1SWNzfKWbQjpb5^Ln3~LTr+5iZS7cN320(_i07i>I#9uG{m;cDFGqZLN)ef=B zjm{`xVph^5i4{pVMhnzJ=&86Iq8TP8)`!W+%S)jw8SE`WBbvGOKIx$8vF(kt1^iS-QsX3b zn6BVpvuHyEhH=q^` z_ez|f5~b_g)Zl=?N>_c6A(>cB&@%HWMwA++_L`5Os}fFZG$#hGU?q>L50NX`z?S|9 ztj=m%d>r^*5b?!SGPa(GSo?um{?^4)iC$&NL;pEr4HDF9sS+(AMb;5lS7-xOINB0dmxaD?% zYI}Jv2gmo5{1NsWo7@ZXLqGIG-@72^ZOg~Q`EB&b?{5C*Qg*(rbu7QVfn5LnX*~^M zQ@>5etp=Uvxm7)vysRbe9!HPpv{_-#W*=-esnD~rLhakWNSh|BJZNrnafvV_PPgDB zawqL#0l}rT2Z}|s*DN!Wakp?v_4c-#Av(B0Gtcu;Hg%m;v~_?=fuFP*{Jbb_+jZuw z2Nb#C`y`FYW3?ufFoE=7Tz-lm8%q$$Wpx1L9xorKYfg9&?PQK*7b48l`9iT~+tFgEp>mU{H=d3^d%ei9xmq(~oJ zb`vQ0Nw>2idBz;90*6`DGsc&rS%L^tVI01;Cv7`l6`RG&5g?ta3Wnh3oF#m^P45B} zs7%lE3tcc4!C%eSW#Z-ApiPMe75OT~#b7;SN>RDZv|w}kbOtE!n79LG>)|qM7~=#> zfL8<4n+!J}u7^QCxn!TL3@==u^|H^HQhs9Cq$sAx;m23b$@56o(}I`hnM2ecvCE2_ z*CRT?UOc9tnD~XBIu3Dc$d9Wx*_%_>Vw~*5UqwVYwI;u(EOU%f#{bH;-K5N98WkVH z0Q|Q!1*Rk89F`N&^%si=S{^Xm^Jsl-C&kH2uH8?s!_>x^?)6daQA5%ka^URE* zkUk|)p)n9`RKR z678%=yk!ImOb3Ie2tg^=Gbb)6Ws7ETQ&DzzHshoZtXA0EvOtFdqiLw^Ct#RgV=|Ky zT0-0)D zcM+_koUEdUH6W29%V&tss*0Y!Vi6!zckJdu600A62wG;3}W*L9Uq>yLS^c{B9dNV+36GI!8wglW9&VPIQ zp^tY5{GsD-F~r|q5)Z(=3;90(nC%mogwqb{k?ThB@k znog3l2rhO|B`~o&yXLqUi4<^)?4m`yp6^is%eT3JV|Sj8!34Z3jGA9`OCk0g&aqOE zmADxBps3&|&?cKI)}tjRM2h8&8qz9@Qn0)j=^|T|6M2gyuN z&hv23vR{op-dqw%!YN8B$$|T-mo_(`lS+x&IoQ-5t9S;*Oao!pq`-gT9uP3oz*xnQ z%%gg7l9IH#scV_WTn@O`xV(h2{>lz736>o^7ltDr>f|KgpozYI;iZuON*Ei7jdf4j zT=S}>X{%`SS!nPRBPJZ>y4#@zRke`iPaq%;V?*?0+)9KOsZh*YE&@y#cH#MkSBt5H ziEhwxR*y3CI$Vv042T=39Mf=@2qdKiX1QQHotGn&0|@U0WV-Oc8wlAxbFZ|@b`&TL z>AO3l@=G zx6qK!GPa-u>wqSYuq??)y`0*o`$dZ#cpd?Q>viF1Sqo;lbB1Lz+URfw`+W*~;U3uw z+Z&ssu&oh>Oq2Gj(J}Yo7Z*2ryjG=7xG#hZi`l8~FYfDpzq2)Tw*HT|X8C@)pXEz=;Rq>5qpgz{mb-16h_N@yQ(C9y+?w0Ky3rB#nbE|Oy7;rBE?s-OqGK?KqGeNk*p@2Fi4bV%`L0*4Md#;R^R%6_d2;H&s zMyx99PI-Eyw()l8x(XU_W`g~c7w;LxOFIV{YDuiIthH3?6L>T`*EtYlVnpl8Na+xn z2nwEGu0#MhQ{X7YvDSgkV*DD#r?dqbIpAu5UfTakWOQI&6}(PMx)8?j8!-?_%TNW= zWfRuj+MXP8W&vRu2a)pBaW!YiVu(4K`k=U2SzZftC<=OKh;9TQ^{|?vPF|uGMaXoe zv-3{aS_)$8_;qJPPNgcbmB7`Z4(iwlk*91L_v0=^`AhW<=mrF1l-SKRjdDWMCm zOdI|@<=%xL>);l=E`Lrk&)X0F0hB=t3WF%@5m%Af}k=4Aa zjU0&q0;4Rt&?Y3u(PV3E07p*Nc!N(>bcj~17O1dD>kU;}a$zq|2`Q%xG4rZQxpe30 z%>e>YnHWe_ygI1bjdVC`UVtLdwUjN6nmZ-FoZ6A>fM*5$~BIbUQfHx)DJ?3O`AFZFgt#EOUt7%oTQ z>?dH)#t$I|ySc~b!l5&69W$=%kv5hkRr^y?3$iFm^0)V6t%$i#ANQ4s-w^w~bTc!k z{r?Qd;=T?nlQ@27HWuWEe&~l53-X1(NnGGJ>UsY@eBpK`RMFaS<$CGl`-yAbowqF7 z-+jjr@Av0RjrRca?uqcdS&;SQa5;Uo2)^OaCE?c`T8CmBM9YN-!RlTL@VJ<`6M<^j zuKK!X+T{XEOI%8Q71+tJ-SCCdU-i+zQhn-D>OSX(uL;bJ87#rrkZ^Q`IAgS2$=w9y zLrDlirz2OnWD78?F;z|!H7Rm^BrcuSlTwsHBi;IHH5G7z$sNJP#+^c=WILHFR z=xRm7Eoy&Oy50tNi)oB?$wmZuWZKTtG?$W2*@eotjx}SA!??jAqa~v3RiKfn;*$w2 zC8;Hhio_T0n0aPcx~BGs)nX888Z&-!Q;W$TjP$J_no(LflUh)!3G#OpBxyWUwWOA;iRY&Y1vL*3MqRWzskqjv1M_^{k%h~8; zOK}L0dp46GC`c`=%0^O^${}LB`#@>jPayAd+c35A-Gu zY4YDvXCOwMy?f|F({fX-_oV5}MlcrQt+SUkF(u_lRtO8Cy(^O6>Uv}9x!gB!q_>-9 zX|i7?tshMG{+DdKAlXlCAC+^YC2QA!>Sn>NVm9%)?!ATI6RTaXIBx=NwDDmstFAh# z#e)1t=<|Eb9sbUBnD!6dYv<>GY(akAxVq=`4PM?5<_8vsd%8C;<+#tpX{(XLudpLP zG=Djglm&^GGwwE;ItAjLr*$TZ?@D*wUuV%S$Q^eDku9$_HL7Tzu>;zSt0f-YyNxde z9@6C?r{_)lzRoF4OWUq*^tK_dJCx!S5>%uzvD~yEKhEXeBqMLBr_N`Z9P>iAyV1#D zI~f<=4mw2B(W@~qWfL%Utu?&hBN*N*dX>6U#Zck!QwIG7@t?zb@ioVsnTo zxf6S$VEIX046|vJWLjfP8Y8x;Qq*)EJ1+P@00DMpIa!E0+BM%Ojfowg9(Ixde1;0J z56L43JuzxPG;tMJ8@WNfOZ7A~d)cT*Rhve^DM9A0n>WVbqv}SrgV&{?C@q4_T9_$_ zNLRSwRYG5wPAsgosSS3TT=dq$VVO$7UtB|`wun03}0nbY!qEr(nz zUT0SEy%%1H_}J%VLH4EIC;r|>hI}JM?AuEOmA?ypy?+{ePj5up@lAgIkG*=qm0n4a z09xic&Oy$?NdYu|_MbRu;}48w*_H_+YetW5L@bGebq3hQCe2f%+~ z&!+y!{C0z0u%ZOl^eZ8!w@~SYwqekV87Gj&?-bk4qPJxNT)IToqL3o@qq7P_$4<0v zmu-dEa3j)%&xd74*1hb{(hWMk3UB5yQJ^Ab+&;Ig9Sf(mWQ z*dotTDsI&lE^J3|b8s>yE5ptA48tl?K{hQSU4>*v$+h2{_7eTB&_txaw(o_=VAa9* z$i;Jv2X+)&*h^m#Qo)YQT)>{iT?S$!u%8D z&*8%b;h(EZ{=W>!KkIl__`mZ#>->H1|Hn?h9}t9{wud+$B0mX!Eyv^drg$qJ$5Rs4 zIukAV9l*Kc;mgkPSkCMpydUQ|vWfq!YF+ObXFuB=|L;%F@mySbZk?qw#&X<+JGy7J zJM^K+kmi!%UYyxviNb&!l+N=!lp|&9iJ{Vwv5mSq!*W67ppi~Tvlw=6l;h~3nkQ^a zB#XM+RBMpQz$ut!x{LPeJ^}-Bl#<4GoK-khnU8h03d3QIgSD!=0vQQ|mPa<{i4dw( zOkucexLNe+&@U+mSCNRJ&+yO@b_bA4p&lpHbB&IO1j2N6HTrjQy%N?4Z6LeaG@k<0 z4L$3p7Zoua%5~IU$MQY{5E1|6@gmw&e{#_xo-(>QHjW&gWga~eDGrV^$?diCI7OQ1 zSyvVO@Ox^=>Y}x!J%oN#7waet6V=q4r{SG>sRbu#I2>rNJZLqn2#+eqs4ihnS&V99 zoh9Qym15Aa&KfIVQ#u>h=pIcjnV}}Uv8_cB+TzoPb(Q#P2>W1z1tmtF9Oa2;0@~As z3Ge{XLvY%Ktjv7O?_e89OWDO$wd%XQ^U^u}6(Q^F3!=gm#~16wLICSlfy+`cP91*M z^?f8rKD2s~5CmIRgVrk(b|%)ThQ5ex!{9htef8X(cB#8wS5%iBnuF>D6>xtfG0;>D zvw39JDpgA}6|)BeHzA1XkXkP|WgHEGqB}H)pxn>AdY-qt>eU%U?j`Qn`;)aS!i9RE zY5wRRtxS~8j^E*@xCu?(2U1eJL|Kgbz-XWamY}dY8-vPI1W4*hk<;gmqJ4e{@YQhr z<%fMtcJLy_ZvpUU0wUI&SRf7s;7VGLWG1jHJ+By6)zQ%OIW^elVVDzN{ zSaHWMC1e0WxU^7_t$~mFX_iy$`am~otI}U%^`|x6eky>0JrK!$#=OSI0WF?IEd!;A z-}ZLY)P-5Ru}+^hooUIYdundB)BE$O>inASS)6chfe`*AEpMOHzDuydDAl^RAZpW% zLX1~}*LkevEqZQH`AjrTCj?Tu!UQwYzvb=hb z)8f-#Kvx0X{(MPoDGg<0Mr(ZUsC#2*S+0jZ-Y`oj7DD#vdJ!$t1u_A_vRq5}F`i9; zzZ5)}+xdoV{yHP7uF--`K10F_wTRsS>rcD__!e{uiCz=&^RC17lJq6O=tB2hI0Lcy)>RfVI@VXE|!q~4o_*(@LmN$G?<(@ zLG;)2t!gAn`!F9muGw_|%+;&+<=~UTPf`GHVZd%KCb$)edyFAXZ-c}gvSV|HTTPE% zC9ZOLV?arui8sd3y3E48kddJ1yo*_pWk%k&YSl>+Mk(!Z5Y#)56}k}SWJ74jlz^*be!>e7VZJ-7NZi#3|)*BEcynC$Puu{0U zNXsQJiJ-S-@Y7#uYxG_3JOY0E;v%xfRc&rl-Hf~TiX>hHk4w^b-5?1ca)@r7l`u^a z=yHi5RR!c&30*e;!#;O&L!Q1_tyN;kLgEkkeJl(7B>xLA~CfL zflc0WGm4Rk8qO*IV}uK%ml# zNu_#$+F`zOs-G5rob^Hho1OwuJhZJj>6G0&EAjwBXko;C=qBzdbk}HFdbPkI;MVoUS=KJ;vcg_?W=;=z;dbJ&cDKcEZd^x7M>us#|+7?44?ST|ah9-PHrL zo4bd2o|3yB7`QgbzW%<49|PXq`=InNAU1+lhMyldmr3~91&mTQcby_v%w7=wu^{TM z9LIO@t9Df&iplklGs_<1?OL5u2~U$39NvR=ZWw{F8IarMXRcHg`mnL z9l`w%o;1b1CgmFHSEN|GF3M$#I=2;&*7Ze*es~0{A=z9h`&4(5e*COq6@)c$$*(PQFR`Cj)Z_EWbS<-5>RZ~x;E_|8xRZ+r{VIpR*%jTsf zQYr_<Lwml5_==PDo{#5g}xF_wlcj|r~SO9iIhEKAN2+-7ga|J=5$yb zl$hAoTl)#+^~;x;ircFlnAeqOG`cSxeJ8?Nid!qjI-KFY^=$T6Z7~F_`A1o8wDV7a zWiZ=mp2lAF`mAD$S0~wqi8eu5Dm0*MdW)b~2Rm-)A`1oO^ztWA#^tRU8(rv4a0tE4 zXlXu4we7Fw#E0-=E|~_}EUxUP;#d5LKi!L?PKFqY6)>#evB&P~`6_4-a-rYrA8q
A5L*v0sz6m!)SdCwG>EQ1E5xeBDH!GFS^Q5;J2ksM~SAN^L<}DLHJ%RFPM; z?SCghbL+V(q)UVt(>@6XRDwd=NsMe3NJ~e6*d|z9SzH<(GwzVTV$p?b5w5qL(ysz; z91Xs6*;Y%-yso?HH3Ra``afUSpEBzAf3a^L>TTW17J&I0q3jgO?MBY&z3ZIx{{ByM zxt9m|J@o!I!cehp(V~S7%nSxo30eHum;dKn=ne8t{#^tL5bhN8p}bRMyopyRaK{G6 zrpuh81H}Zx^sKzRL)lCg6sQG}$qp&nP7ZB*0$vnuqPgC?;fO z1l+ZdXEob2G2Mbiz`JlV&45%CTh|XHK3K+J=8UsuE$MIsGfOH_$Z!{Z+Z@@iS%!7L z^BjB+lau&@MDV#X;N)#Mh(27?9d}}Eo_W+{Q2A`N*prdtnTJPTDJoT25Rx5H(nuv@ zON(0B+>g(Sj^PkBTncyC#FCy{ktvP#ah?zRt49GG30KRb<8g*!Q=z zOvit4xISF}fG4lvX@=#s;92lAui*LfXUEs;c=6)+4<4DW}X^VCu)h~W{t5jO>$wTI~G z5|8@H3xvTwf;8JiB{6LGgAF{>g%-TwiNYXIFHJ_WffQLH79T!))eMDdfagmGDE}(> z@Tq)WsCVv=L+iRIw?#9a@Sx>Vy-}${)=pL* ztRrYeC5{%bp&yS^^|eC)`hXTwGu}=>7#I)0k#+iPp@~l;H{Cn2-rDRJb!p_Da8=YD zp+%Ngb%{P%kg?jN9(qKptmBuf`2q<(}0i-73KbzM1b2`V?1$L$n zm|>oQ_YY4BPnQ;PhiDOZNbm@*mRI5N@^Y2Ddcn>5>*iO@xC`)rGaBUA=c~2T<5Df= zrhstaVHYWSbp0e(Nc$}dTp_tZ+#!W49pVBx;|_WEwS_#oE;9}VWUBC=r?C7UigVUEa9=lBhI)A|t&QxUrk#Rb*={n0wUgmGP zq%9TPj;C0yUh9~$xEw+UVH{gA7@<~krX&pYwbejn#IxX!KHx`wSV|kiYT*QtX9kzr zKg1E1I{Ekc!_~Flvi!x$FIj%g8mRUNuG}KJ!yWQ?`wlr0{~)^gDMy;8E#_HCaU_e> zfjq)n!UStSYN^#YEt!MWi_Z?5dL5U1L|6=x&s~Q%#@K4D05ji3`=~2r8zE~Rmvl`; zS*(SqWRzJ>uUX3t;tp|zyKbC%e`Jx^^`5CZ_yGRg9@zE zgj)NtSqhEnj61ES-01p_OS~F~FkX6vaL29F_nbggdyLcg8Hl=*xz-)hWvBYkomMYs zsSr2>DIt>e`YuG0&Lu0lL$O&t0?8Eu{-+MlxBjQzf6IE@P*(`7-XJ%BW*g(!T|YR$ zNee5f=vypRx@439Z9tO0fJ~?WTd5}-UASO>SF+Xvd?xFC5!$YfohjI2X1OVkfYMFv zWJBl7kD+m9xtY1G>wPovS@&cA>FHs7Jh<{-^?rqH{Z~ExQP{jfR&J2x=P%5jAcefi z?)-Uf)_LnhinbJ3uNIH#hAhg=3eX^Tga`ccu=4r2|EM3)J~LmtLtG)%Bt8ytg>2j* zA^i0Ye0hKd`OxCS{5u!tZE?;83W;89jZG68#`@%M$NtbF{vV=6{G#=I`wm&TLR=zS zf6J;5L(UJy-KU$N>08R{ow~p48mo9eq(1~_O{+cICx+9zt!Sd+R2sn{4l`jPd-KdI zi`6Y+1CDrc&>!s%@k>_wWAEf6!}SkD>I#9C8|2-Wzvp#(T5=P2GkIhQIt5T1f@mPr z`9p2nX<>!7TD6Xuc|_DxzSAHzM;F74`R9DH`RVR0l4C!?sNy*+f43I!MV zS9G49%8YOcBPlsimVzpc&QK{m1(C6Vv;=qMXqHmDQiVltf;1<7$N?cD*_Pje#T-*bfhLJINEk9xEf~NNA0wM(#;7&hJZj zrZ&)F#Yjt54N+RdzggPjaG2d8b%pf5_O9O{dc@};vpZxA|NIj#VyC?KTq{zQcIvIV zFJIk6!l@b@EKH4}C-f%vSn3@)b(FoF0=m`|L+csZnlHOel@pL~^mHp83NqS;tc4{r zrZ)3(Dhdc@p8vY7{+Qk&knY&HL*OxN-y!dg;oofAs2~EyX?7LTY9vg^_3f>1R5<{K z6;Lp7Y1ThmN9?A0=4L-&|Mc+c2ASO<{Uh}sb%(e_=68q>L*D=27)Dif|D~uwes26} zZGmu>nv8$CYx6D_{>9-HuFtwdp5OT$@~#gX%sq{6niPEHGfA=P@K#m(&L07Wd4%l&OS!47hK+51UZ}K$RBWq)ZnNDP88w>YhMP_iHtf>S!_Vtl zh1-18VjrhJVD|rz_3wvF?~v)=vf2%D^T`NrxtOQm*HZ{;(rZ+LdprVqS}hZ#A{v}m z%JeA;MyADKnqw&(8XZ`&q?o0g0uf?*#(M6?JaW!0bY|b{fh;x@bO!IbD6)Z85b5=; zEhMO9%m^d$c;uWJdaP~v==yNDeX}_Z?vUB{Lne2~BX`K;`yp-kk9hEt?VQbocgsjb z`H%|(Tf7FKsI)pzAGP0Nd~!&Og|=NOhMjz)o2|of>uhu&y*8PFcSvV! z1jGyW^!el4Y7c0?Xr2505O+v$#`iIDI0}v?z)*|svRJ49(wo9O(S66x)w7& z&yD38!0u0%;Q^l=+v7H`c8BEWEq_16Z&<;aTJn0umL5sZ2?}tFT+$n?b8aeg#s(v|ng zX>;EB(hS*chM;-I=*A_qaIEnJ6q<;0qve>${HSh66lovXk^ls;Wx>972PBW!A9*{BYSlO^hWI8Yuj5IiJP-Ls!DLEpKtWq}-+1oWN z8jIMwkBJ$-yba#CKk{=A-w)|m$Y-DLm0_%}v{WR!uOSOx^~m1(^Qt3vdeWX~WbYEG zkxTDoRlyO9+B#_HD%tuW5mvNDaUD{Jj`T%|@{%*nJUq#%!&hCV;k8N(&vKV%PK#FW zA2Dco#l+aSOsWNk?@=B<;>~Ec9KBFg>fpu1hz^GO+03XFYPMelVnOB= z0qqjKF)q|-i)=WxJ)VXYMX&s+r0L*-w4YbB zvZ}g?D{)w9SKK31KO;GjuhbPYv|`qL#6N25j5>0>=Y~2ezNE4kZ?(xw^_^OZSQ(xp zQnOK4F261$Snl$gSG$ag3eW+4ecMW{Vhc8`vrs&A1*H{Br?&WK0Fh%7 z*jkd+0oqzuz+Vox@a7G2AKwpgg9KmiH#6JI+f*{;hD_UqU_Ul^YcW!53kfuGV}S*T zx`1ouY+eN?HONoHr)SFFzy7;E`SI=TH?Q9zX%ZcBPu~v-s!#s;oBbtt!0yrt`qT<$ zggK*0nAhr4#Jj0@V)RekKED2?JzODheP7=XSzZI*Zn-3bRu+J@B8#$hf(NpcvSVH; z=Vz9r3GfNQeAivg)FLy!yvA4{^k%1a^cAIKA=DaK!h@b=$44Z~S2NlN$4^&cqe=P3 z@4%Yy@)5}GH=4v>d*NQbAL0TzPQT-3CQzO<((oKC!;+sYh~vmrZIP+ALG)L`Orv7( zAfTYEPF1Qb2bipszEb&gSI=-(jLV~0=YZPB?J#O(Zw7=qFv2Ct0G*d0)~j}XrZdnfEPL4q5oL-u>D_7N)G-QK#D;?6CXjsQP#%apI`TCo0a)WH%A=mfx{g4}1$Y-*X zS+75DQo>eH!L}E5@I+nShXMkjWF^nLm0cIWf&b_6$u|qe6{1nxAsuOugEl#iPp97x zfz~GQBfh78^VLsF?6fW~*N6CXLBpI64RWXWZ}!f^JE|i~<9*Vcyg7qBMiRj@IN}_R zO>m|iU>4*cl8k~u!eRj>5Z=|mTATmmt@^0%{JQT`wQ4zRyH3^f*@fUA{tm^6d7V|2VF_Lg`(*$X28C_ zK@FjTWQt6>4x|Gh(T^N7Iwgerko`}oOi(O9E*l9)5-mpk{~-yleW{CS2oMr9a9B0; zv}o11fCfe?0%QOSB%B*jnIT51Diwtu5?RqDk{e{4_cHRIne`#|XhL3s{v60WO-<%@c6}ytWM~^srkts|H7}&rB1s|4xYPqeQ_z_#*G_4{II;d zeBHSD2>*2R7ZW4@{}55+b6*aA9=vp}om57f_()nT5Yxe|x4zGwf$Q97!69|G2se`n zHOlM?T?Qll*t-P~$hO?qV5%S%vrFI(SwjZ98}{QxF#sG4r1%~|JV67z+o2_F#l6v} zz&=@kKp@1^Y!tz3ec&1bL-Y>o=-JD+Zr!?^aa*`^=g!O>D06jgc1#2*pq321-5Q%) zSzTSdma&$wp0Kg8v68X4xVW^qbo0BzM`8&v_-C?kKT#MAAeW4nId@`F-TiG^)u#V^1INcR>YF0eR}|EeLWuzQ+i1*NxbEO(JW7awI|`fHOaejX_yTOB><$18EW#2p z^%zCW&dF3nGQh^hJ zQaYop76JzkXATc=x!%WEAAsXNQl_*U^-YCn-+NnhTO+nEUIxdybM+gQ1f)GyT^dO z*(f3?h)1x5!jJu(K?UiL|8puJ5G35C&xjzivoH7kOubS=5)MwDy0;cT#tH;kU!FZg z38~hQV}oum@Up%vLTkr1;S>kN{Ec#*p#G-LxPBTfwtXqYo0@z@d> z4C#8_C)QaQQOtSJl}BBgTwPZ&HaQW}00;qCkfma%XftJmO6cM^K}OY($=9y(F;;~j8#lfjul{Z?4@CaO-f@YD;lNi2NML}Q>q0k~Th~N} za#s|{BW7!nA=UC789a`a6*m9PLLJ|ky<2-Sfi zQG6_3u-zS3V83h-1y)A2;iqG;&`aNZjYvs00?21=!A6j?j#X?1g)-4|%1ANB6unSX zFE!|e2qz1ki$zOV4-*_sU-w5N-+@e~XCQ?jFeH|ctMh-?KR!Ny+TR_Hf0W2U z3F#6fi#Be&G*SH00i1<%EfJYr`hXhZ?cqg!&!$<^hJR6}MlYnVhVnr(x zP=bkFAQASlHk61WNNVfF1(jwITBDeR3GBlHO+)dK6hlF)%p~!-92;OuBt7wzCY1D| z8bCvUdzfM`mJNiF9*Okv`0fN5A3J*&f?U3QO9dp9ko2oqFZ4wVW2axr%9y@~6BrIRm<8)J`_V*zNiobA-5dARV#po?dOJ5_*U>ZRpolw=0!6BOZ#KF|HBD*7# ztrn&mY zsXa?yNs@=_D>q&rhaS~`{QZkfMH&}5V+2}=0Nep|nF%N~0*kVO`UDmrcHEdo3~kKD zkq2EGAjFnAj1_{^5*r|nI`u8otzfBXW`hd3j{sDMNQky2c?42Nx&yg8H7!7p+uVhi zAXiftzJ%Y1pUapR?#(|~-Qrn#cvPs5d9&>L)kB9>K}3@3--kR?31lVI^)Y01-S*fL zKfo4aEZfn3fi<(ecEeAwInh9n$y`9Ds30yO!vslWD4a+LoVX_}2;V1cL6C$1gU!fTBM#BZ?%f1j7T zbeD`7$_G?|ED41z4<2lddQ`afFbmeNr(f#jUnQ;neaLh1THm4ln*sT?2cbo|-frFv z)9MM_V}i0?UvUm9c(qIjO3aQ6p`TQ&EEzH41(A z1)+q@4D+SSj)EbAT?~mcO&tkUnais9B#aYMST1-a_GZ9wj95Cj-%pzg$bnoyrm7Vr5`+pOfEPAl z{RZR$!dtAtXX#={AV}`}_j~yqE8L0P`#uvSp+XSxLw6x_hbSQlSlI_H})XwLxLvD z+ohow*->Oe%8VJFjtWtC;`J=B30;YnL(2|bv_ewVl+@DfA@?Q$ z+N_$UByE-%Xq6Z^&>Ve5Y0#@#fG{({`(;UOO9PrD^)LFZ5784nd=GNh6yYwUT0!6k zkJBMY{bMW<#rPd`u{`TNGarm+_tMrbd+%ZF(sKC%g?pq_pE7RDDWj$BrnMzQg|?<7)T&tb7xyh zMWHa#dn|!ZdbXgJqLkpobOI^^y(@FBh|1i;TuEeI+;AE@1$F3Yrc(*MV&8=DdV=?3 zPDrb;N82yEkWrx&3$evJgj-HVRxw}Al>)iQ97MJ3((2nQ8NtmXB2!0T9IS_;jveQk-;K#i6kFop~YbABlU5K8A>|R5Te(vPoF8(Jj zWJC%AKbH#pCWGkdpi{A8NJ=6Ra`e)PaF-wbmJ#Z#mrtguP~_xi8dCjWwbDevx$BNg zl?Utx3Sc4#C|iXvmIZ91fC$im9E_070jRK72u3q5<{4oMq;f+(j>9B{``AnLhhs<_aNad7QddA2vYf+ccT!5?$YuvR6>MNpJn|=^a5ut+Z>=x zQUgHJ)&miNlwfpMMh#w#wiObXzyc)Ok<$QzJV6yF$J_5f5+KO%r&y(eKoEDrr@XUN zkc>o+NRYKi5Os7HGON3gS`C3B2cCqr33Y;OmT%hX0mkVgsAz;izR}$D7ubDaT1_jX zfnw~itNpEaAX8sK4=PCbyW0c^QoTusA*q1yF%~5Rf^6tH$jZZ&+`azMaVm&j1)+p| z@$s{*z@^m;K|s4bg3Xz-Nlc=`UPu55*dq@%xiZ>ZE)vvfxX%c)83AZ8LoarqrrMl= zv^YnGU<)TIn?m=o5WIn&cf*@;Mg7A@+O30!8 z`|33WikwOp%5@sVNn&Zp9YmJsS=kEKO>j@M)Ume272YwoGakdo@|%2tZazzYU||C7 z?d_PGJ+Gsao4J9})TZaI+6-ZUT@}G5JBtL+kmc;6sN25Vo}nI_CQ2Ab)6-*2Wdj4j z*Y0FIJ=t&kHQuSO!dt9RLc&c5_aMB*GDUch?h3M1d6vF1+`Do8b?!oHB}6zq_~Qp= z5PS)o-<;87)Oj%Iafm|bi3Dqq3nd_gA3G#~Q%Gz2OmMx+(uESRlRP8JWmV2L-P>fC zbXOO`$euxJbuF@E5*^b45=e!nU)YABs2dO%8scT|feuD66#G7~<^SwA-hoVuAN8B` z_zS%=w`o&As37HIED_}U@D?j!fFK*{Y`BCR-nW0ChSdH(*Jw>RQ^8X#3qQ| z9SK5J8HBrzmZ5K%<*2)}LO3K9uY zP$kIf4*$lxTJR%3PCt@L2t}m!_aVQ0b@K^E!vuK~LF`vXXdnnST^c%g8I~!6;Us3v4X~MZdHO3ww>yg`x?JVM`FLsn{(MF4@k|M$J8l=xO=1PrW zwHb@ca<2a!Pp6rjogjmRj#2!re=#|-&jBnOcjEJ zw^-e0>9ArZH^NOi6@<4~<#XPxDnatOFk~q)EZkdokg&BC{$wh_&p~t&mKK+UoAZYbC3+a$PqFy7NKX?0KwOC- zktDcggFOwcnCO9+I#wpep2|`gj5A9eH9SfaA~J_3AM|B}{>70S3{8QH4|R zYDP4=GPhMwc)}yY)JS*k;!OF(ck%k${UeXCzl(hX`1vWa1xMgNool|_H7Oo5h%uT- zNKdrelMQo5AQ5_;d(mV&+SSqht>G~@ufF`-X*Ia*TQccC1c?JgSS{}7A!4qe7Nt} zv16ZQ=wJR7e$05|jW^C^yqEA{!s*?ehkzbkpMDEy4?JV-Gav|=Hd39@<|!z3{OUgE z2uT>12{n*n8FY6En>mkW7z6L`8*9P7V`m?O2tkk#-k}Nko!Qh^vnzg2wN@j@VtOs< zKIHn=uYY;$RKl?Y@dTn2mK2^GI9bnj`fj+VE}pHSqQ)xSqyj8bjVDcj40IJj7K|o{ z5-vgWbYhv9Q1VWK&cTJ{h!2Y*bGX0^4aBU+{h0U0^eW3*f(yb5rQ>DF0_w4K3k4R2 zj!&OxB*=f9QT=G8hUs7#MI#SDfZM0cywqm5Zxj+~S>>7E6wDii4U zoV`9tn=I6kbY|I)>c01GjSn=Qq~>aYti=*G_Gtz2fYO*Tlpq`?-w7i+)J zNRa>e=zNt8@daEt5bA9eD0lXEzq-0n-e0W^myZm!O7+ldDg9B%r^n#OGZlU$T>9LR zbh?C}E946vw4Rkc0s){193nV)nuNB{Qgup`{J<>BXOIG99FzGDafTdT*fW{llRh&C zm!Zcj#Oeapl@1`gNyo4Z!}I_m91&HJ;wu1a89)Jh5Y7sxM-l`aedVj2_|XW;2H>Nw z{At$%5u{T-gwibhNVswH^5m&dJrZCCHz6m9BA?cq$6MZJ4 zg@oaXa8#0@38;EZCq;WqK!t7Q}2BBs1op^k0g+R zt`R>Mp3=v_Q!^W#w^tCvjU~||8`4-p02Kk-oRaslux~O)%H!JV*4m+l>ei!aeX&Tq$f&n zqXy5RatSk5al_E(B`=&XJ*uZyqJ*z{1QwR=`$mV|qhOq9|EDeozW!GMg1k}RJQ6OI z{EatMbECRSFN^jt*##DIwp{}G%tM9=ohd9I1#jS_@?1A>>PV1rc;T}GyM_)xwWdbU zL%&~o%>kj={Mg)*w{>t?m6jZ-SBrI`PNi~>q|P?3EqPjb zB1yKpJz9>C<{}6_J;&`Ox9whMdmhOMju0G6q^SC!yh4sLl8QH&P^n7XI4^vOTU9k~ zhk4_uUO-u6XMfliUsm~`j&~5Uzv=iQ|R%aGjzdW?@xHL-0LfN-lGWkfv(JwhFw=wWFrs2gqREUSVlAwp2PzL8fG zX^h6gMgDMuu2Q6=^Zhaj<+l@$C3ogw;KO};PNwbB#(h%T?zxcirCKVUpY7dMHR&uV z?dEK5zpxD+*|WzBb{B;2$ZGp(61h=9)NmoIH^gD-Jv>2SOOwnGZrc@PP~e!Vzwm945%~JD+||J4j8B794u|d$-Uz1bOVdYfPO0v80>q-D5dR%oJUff2==A?*+8Sl)MGu z-}&jL44e||H+CogPBnE2w`r3h0M7N~PKG@@DD6B6XJG z0!q~6VB>%vJD;CDk@t_9A1k$m<~aPq4}Mq(@-@4M{wLk7kuck#LaamtQh621-X5GS zO$@Yy*wjO}^MVGcAIL45Bx2%4HsX$wWA1@_iHmQxhS!2<0s9R(7QpPp@(s+?#T#N? zs>$`;@ZE1$1gW@DKa)z;iW&UxB1d045%dtAHANr=)L1BoABXpBdGqDA-NWRF|7W`I z)MwrVk_cx>y@W|a1`|J13b)o(ojeRms_YXO@N9(s&XUYw%+-JcncLCAMdl(vXM(ij zDyGM}5oF8nRs?z250EyC3Qxk0%nkEnPho|*QGTVmp!`gA;z!{{5QF0I(RFve+`4v`O;2Mws!v>v=%V}h+-vIb7aczcxe*euS+rnfyP(oSjhzh+ z%z5t+JAU+|AC>Ys6U6*r#OJ7Iv-BUxC*Owx3)qv&}u9^OYh zn20Utfj;U13os7}cG0(*D))k4>Z`n3WA7+@q|O0EF5<*5hOjLR=}+@p9SO2|t-Ycg zkMlID@Z+tw9(wC7eL7y@Xw41(2+GbE=KSLPxx$Zk-hJ=Aci$-t34#PaqKxy<((kPs zx_g)&1(S|38RU!8#$p?=3I=OzSjHOB6-%3tVVK!FX5mM?{Bo6dsgAXON`u%2PM&NSa>D$8BIQAG z__?W9+TPiP9>UbtNTQVt+tk#M7&%jO;?*$d^19x6r}3q+o^$^i&4ueEwxJ1qVS2L(zLWeCKRFP|z5c>-F16>fmz!p^;O{z0GT3P0X?@8t6G$)A`Y3vD?3^xynY)Tr5! z=`mH%Z(F$*Kpkw656=KnveH-GD}rziMVm?8nXIU?CXIy$Kv4w z8}7UfdccnH%no64vj2Z!nf{Z}o0ur&AX*bmYhv1w8R`kKHk7ci
hCBf)Dr&$DVb}3l)58S$$;mV4&Yz7f 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 RGuZ$D002ovPDHLkV1k)#T3-MF literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-ldpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-ldpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..c7eae7edea4f154bc7caeb903fe2502a0f69851f GIT binary patch literal 15341 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 LNkvXXu0mjfO|L?x literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-mdpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-mdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf1ec2e90e9b315d1afcd2385eb93c8eef640a4 GIT binary patch literal 31136 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xhdpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..987a92462cb24a451657ab5f228db8b033f7b861 GIT binary patch literal 142334 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%0D-_Hx}cffxf0z{WdwuA<0Ba* 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xxhdpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-land-xxhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9fc74003955699bbdd4c3846f9d8e78b0bc4d5 GIT binary patch literal 227190 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⪻ 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 i_#Pni?;qcV^M3&jQ^Tj{F9o&$0000zt~d={nt2 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xxhdpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xxhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6bfe4a89abaad079c0d631fcf4c399ebb3f49c GIT binary patch literal 211817 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%0DP!)lanttl>odnN(p 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 q~pAq&Ab0IFU> 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 LNkvXXu0mjfO0X$c literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xxxhdpi/screen.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/drawable-port-xxxhdpi/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..ec655cde16183b834f1cb79bf7b5bdbb4669dbc8 GIT binary patch literal 299018 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

    Ja?fmqW?E1MLTD=hmi~T90eDNsX+;1) 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�Urfjt{DlsAKY@a1X5ybNUNT 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-hdpi/icon.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..53842612476cfe0d35e54ca3db1238f50df14293 GIT binary patch literal 3345 zcmb7{cT^L57RLiYj1drlrvy+yL}vGj~4sd+)E!{LYj}Lj!F_I0qa8fiUXoXc~iO zo!^rp5ea(#XM*RNlPhlf-ubz@^=_20I%v_#$6+1}pX+}s2U z*4EZmS5}snmlqco7eJez|MBC;+}zyv@84%x0%l7y8kB*LJXJ?O( zk3j}2!4OP=W#B;5)6>VtM_@N#2#3RadV2c$`o8q`c6N4F)YOy7WYYWh@7}$utE(#_ zmUne^5i4r$KS4Qq1Uy0c+PZi@a`ZH|w2Mq2oZ%J|SJo3&&=!)@6qHftm)77BRq_wR zcm{_1ghaXdhq?NMI6n`zuyp~Bk5%;UDC(HXYZ+hHG?Y;{kW@v+B&AMGO|i1Fg3|~J zk2SM)#J)-!8X8j5zxyI8A-AYh)6n7%ekpLC5pj53(+47ox@b(&ODqm~*G5*`48|^y znq7!X%OzywCZ=X3;4`MCCew0@xr7xc6iR=8e|vlTz(D`!&!55d%E{jx85tQL9|Knh zUfalMESt5*#Kc#yEI98?K;MLP07eu5uI1JU%WHvae+vM9L1?w=CJF!;4bC8t4~0b) zT3cJ2o11O1sTsRR;j6pPz5PFZ`ec<^mbiaxvANIsJPOR-O3Zd&-^)4zm|qgWY<+z_ zI9%Z|(Ae16(9mFNVtG|cRq(15gNfaT4#_nlINC-VWy@iDZAteP= z?wMPLhlhisWn^TitE+>GqoZSXb~XsKw6r-nImUPHfeZo;hXdjNve-0{Ca}S=hp~YP zM1Gpm+uOUA4DN(~n6Wbe%$(xfNhkw4XHi%%Qv%TZBmcj#o$lM;1=s$jzW}_!*=%6o z)DAkW|ELOoCHH>Am%kza2=4hW@BD58T0H<{0A|0b zYThvQrWxqdpbb`osP#IHKi^e-@V55I$`=!?N~bO^8P;u0a-CtNOT2uuU%E+LxD&-C z<`J22`C3$V@mO4OkSjxfrEtR7J-#8w%F^x8?vh#Gq5B+#iQgO4UySbDpnbrl%+Ms3 zz@e;Yz}4M1uD~B_NOhwC^A6LsNtNuLy2ti>9!<(QhfU!EA$ zcrQN%f9#XAvQLHG$uaE};r5(P(>fPMqoi#13~IaVQqAhcgRph2g|FeRU%qvINz}wE zc3@%xs3Ut#itEfpUpz?rsk}xKAv!xdi-@eQR+(+usE~;{Rp6#271Tb9NB^uoyv?U+ z^jg#CNV48iLR?PgOn2@#v}+?G$vAIF+&t}m9ohH>$AJy$LKHAc@b7!LICa}!L_pNj)btqouTcoqu z9S+-Jr);U(SAV_#F{3S`%0=@2JcI}4k^#)bWxvV%LjmVBI>4rdb@o7P+?@nLngP1wl zlX{H`zq|Q-mA@iz|LTn5pmToSvXCrW_u&b*OGzgDnJiNdK1Z-qVMtDzOUb6EHxl{$L$2X~P^ZYVLwu%!cJhw+sIDP9!fezQKqgrMn;niBfb~t}) zC0LT2+h)Wf8%G@>#!WU=A>hYK{T2t>)J@`IF|6JdWk1+2rZ{uY?-RY6|4Wl(QIkJK ztz?=EXZmIODP`{VMb}PtS8?DT-&vFgU%+jab*{u2>Cc>}_|Emj=VRzuzc1}14q$G< z#a+w)fQokQL1l|LYvm%0FcHyc1ShMCbelmWK8S+3l*fgARNY4NPDur3f^oDB9xCkN z#%Er625lA}8(CMfZ554~sCTc;658z`nMht!ee&Y&9}s=)c%7APRr_lsJnI1FfUwHi z<*B~$qdSy5_=P@_4uM}qoK3Z)36ICv@Qu-PcHKUxa*CSclqkgs=3cDEU{I9MaDn11 z2lR_!DRNT}QPcNO#dCInZ|ruz2kyDV%B;Zc4Q#s7(9@a<+aewO$+VvIKQ$c78Fu0J z&wIVuft(!K!pQStiK9-}Q}mxoL&yrZ^p)l^c}K4b85UG+nb-6yE+T&k{e}V;fYPEYGi@#2c-b_ zLoy#5_CO-6J-WJ>ahnZ~$RzK@^W>HmiA^q_|+r`r?J=@#PvsVI!;T6#?&aG)UXJ|Yai zF|l>L#Ph2>o2cxDz{QzGYc&!hHssJ5nGlWk*C_{@6wT{)6O}Dab1|I<;{x6hgirqd z$7<_rJ9eJaOIe0;n{G;+LP8u^Cl^GrDLvOS;WhV6HP2JW-k0RGMbZyE=24RTlMlX) zGKUf+bOccW^GhKF#@4Ce2Wq<4kn1hbO?j0fKe0C|W|~x+vq@*QIO{Iw_npMt;(*5M zHXoUzVAkrJex~IuVl*9+cH9@_^gEs=;_;TMmB^UR^jma?Pf>IyST-MU{3`Gg!#KoO z97^uIWUo>vg0a3@W%U&ctAfOd2m9lVv}}0R5YfV^B8ytXvGgu?Dv@8eaq_0|;RvHQ zb6*2&U5$5R?%;@no;Ejo8>?ilFe24h)`{UO!HIxC@bHlL)>v3AhK|Kdz3Di2mSVl@N zYZRED>R~HA@Z)XX-K{;uk@mG{Cp4_>s0a6!cG@_Y#CjJB#a(su-pIP!opV^n5>JLO jULDVwxEMiC+&vSW_By-L`Sz3FpM$zL4K&NtABOx3iWtIV literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-ldpi/icon.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fcaeb648c732c2ca619d032eeb033c0df2ada2 GIT binary patch literal 1821 zcmV+&2jcjNP)>-t%$s!mMPtiK$@7#m;=kT49v_kHkO7hL4nHedu8h5?$Uaf+gV zBuShoiku(_w54;Smx5@bEX!bHFY2zaP24`bukmyc{VD|KqR_KZv!{Y+lBz0!P!wYf zju*PNY_=R=Bzva!#lQsj=ty{O|{lh?#t^r|C=<<~-x_If5P;p7As0$o3r&zCD zyQZY%6s2cmC@n2r2?>e7;2pCrwe);AXn!VJIOO`%U%HIV9c}1!5-LPGgW-rlbDVT zx&J0}jnwWSFT(s_W*J%JjP8{aQp%u*mdx@w(mK}3LLBU z>_24R?L6W>9XfW3G^$FK2CCPvErpE?NRct|x_RxYa&vQ#va+(2nVEUs1IPgwVYx+E zN#_s%7jVdA&X{AQlXEzSLx6nTq%%^rx-Egxd*9Y2jVdlKQh8aa!60R1WE`&usD**p z%FsI<5JcS&42Z{pOD}8ji6G6Ly_i&4=aD+~>o=U>>URFNn(R5H&p!H&d8F4qt*VZF zhU>zG^D4;C2gHV_Qd3h`cmOef0C9_4GyLc#0s}B%{Vrum+MHRaK_ez`&0XNCTdS#_ zY12Z!T7&V1y4~&5*IVnj=NlC*zfS3o&1y@S~M9wMF$8A1#szz?! zr<;;?XBVsUfKhZ8fw%_;a73^68Eepb?u%LgF|mQCehdUDF)ohvc+L5BhUV@?SUHYi`*qJ&eX-Zfk>0#y|;HVXS`E^ab{Cz{skkl(AL2tbJ5kP>^ z0Mrm5ij9p$iiwFi?{!l1w*U}Ct|@G~0vKMV1ZJgJ8&8}^H`%=5-9>7UzWJ`U-Wf4d zA9fkUcYr8r#sd2RqUh*oMMXs^GBPsCD-bU`_g@Ua_(cE_(55dlhIS@JoOi?E5+ZfD z#dqHRKm`T{Dl;SPF-SxN;@l3eK>R5K1PBxLL^sjO1ZJiX#0|j88~wBD6$^KG7H6m# zK*GYp6cQ4Grh5gVxENZ97a?*Wd6QEEOj-gE92tbIe-(&y(^a?wNKjA^!l7VjoCr+A}@`zUr*Ko!SV*1uAkn{OrX=!O9Ajrl$ zP_!#4GzSeBx!+6F2y)LFj!Bh4pn!k?ojG&nk=H+Hz&QF*et!N2cL1BJY;3E|5rSCz zTG!x0czC$g2&)Ik>C>l?PM$oONlaq9feeNVKXbeMNuqeqVh5Yr81Fz6?aenpYldj|0xfN3*k$+^C< zUAuO{e+|T4Bg>X8E#sLsoq9f?j<{|xXy3kl>xfBgO$7BOoZ*>QUVZKGk|j$D{QUfq(e~}zgHXSI{l0fQ1dAK!X9nb~UpcDp zsFS0ijwU;r>uB*4E&n@Z_wy`!uvZuMCI+#HN$iS%p!}ty7oObsiKA~F)o@hz$tI2d zN%3r5_F_-=CI+#HX+`~X+am*mm>bFOv;SuOioJ>9t{pef|CRm>@X8mfi&qH)00000 LNkvXXu0mjfLN8_f literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-mdpi/icon.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a18167be1a88d3e724a28d4fe6299fc7ed48c71d GIT binary patch literal 2368 zcmaJ?c{tQtA0NvQy=bINa&J+Vn1~vNER7j!h_T;fiKHk?m>ELDSYk$8+f>%E@4^UW zj~RusB$JFRV{Z`QM&|zB_kEuG$NR^7p68tNJ?DHspY#2GzR!8iV=GHz5n(A|5C|k< zYJ$c9^M!x+LwvyK_C<&W0`Y;Y%xw*g{mp@$|I-8n1pYbY<>meM?b|=g{~F)Ff8XBT z2JGbIWHOoD-QB&pxj8>Szqq)_;c))Pxvi~jVq&7Mu5MvrVQy}YPN(nh@7LDW0(MnZ z6@`)s_{YY^!Zo#IWY2QBT!8%G;Gm(QVQFcpy1E)bB_$>G_V)hz^$Wlb3=CkgSb#Gx zFR!Jg1-LXPCkHrMSy=&i*48*BB_)92>FH@@g()s6wsUY~u~-1r)YKF}%Vx9t`udnm zCg4V;QcFuqfgJ{ek&==^B9XGPvI2r}06Zcp7KaU?P$-R!jV>PENF-80K|w@B1P+Jq z?CbzR0)zk%xE%;j8DUsoU;lk$qq4G69*zPc0Z>4`fJCoey#myG`?e1VnEsy>-oJm} z)ZEEaD z368YXGqWEV8KKc=K$)21<5BU+L19FERKjH=jHEpL)2A`k;rR zl!{JJM4Tb!21G{9*~>p5H2OY{;C?4iNnQWlyLU+$*}fr>s=8)3eS--JsWmU^%d2Wr zpXG-{#@o1fo7lONQlA9|g+Wf9Q;=1yu5T_auWD#)rsNjAXlP8&Dkv|6RW$jSOLu`lV4^7+X=_3+O2gWw-j;|Xo1g>= zE5{NJ`>#3CUn~dMKA9aKZ}3Y zM*D4YbHQKdm?zvk-4ob2_gDB!5@0zEA-r%{XD7 zfV%7I)mA<6PaLO01W*fI{FCCQnHJ*8X!saQuAkn~L8*>vj56ps@vmz!c1q`I5k=h; z2Ib+xp+j?p6|WoXjbuBTgw#-YJB_v>&)V`B>Cp;FV^I(FPI}WM+xYHt=j?1t#ZgwZ zh7?;MB3m@kuvJQn)SAO<5qcJJ;2U2ckj9vrcd??`|;?CYiGkPN)6mE z$}qlZ!$j|mtzWRe$>P1KIWzIu83#6fX+Yqwki8cF-oG5ne?rkQYqu2qY`IzwlXR-z z$!c6g&OETWm9P6HaY@adE`lWLBwFr3AiL5~=!Ye8U}?v~gb(q@)2GMeR|f?Y?! zG#dO9cmJ=u4|vS;^D5Zend1t4KdZJ;}Bt+6|2%$H4no&z1826Z(%YT*kcxDX~B#Lm80uv zzbay5(q*ktsOWg6ix45c}F zJs4kqW)Y$G!$>*PRS0)~Mr!KtCCT-2B_>mw55{|#nv%iUEFK)C@a?*9o9C{h?d-zC zi!14apB)k={$Ir;gYit`y7&^ zZZn$K<71cSXZA31Sgde?!Zh`&$EQD0xK?(0`$id>U#cABcUD?gO%p;-Oz=wWbIH-G zAjYlLn0@?XshgnR&&s{})zHvKk%*MHSu7O6g|nJjJ0Wo4;oB-m1lno>%Gt>sQ6? zPcBY%Hf)0BT#cX#xOt0A$5hOx2cg<$KYHz}pa zh7Fk!1+>vUvBS^RW(k)so`Ly>+0GG{&VaRrNRMSkP^f|e1(I1%khkL3**nNWNc3qi zc-Z^kV3tm5*C!u`qN!B1w5!{JZ<(W)0Qg);2Qv$8d{>O I4cwys27c0^*Z=?k literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xhdpi/icon.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3eec364b5bcfd360da42c262f410a1a75e3efb GIT binary patch literal 4085 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xxhdpi/icon.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xxhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a569289659e332826e030396820e94ffcd1b1dd1 GIT binary patch literal 6421 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xxxhdpi/icon.png b/asciiblaster-cordoba/platforms/android/app/src/main/res/mipmap-xxxhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c322f2ea76baa18ada8a8bffceecec84fd35702 GIT binary patch literal 7934 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/values/strings.xml b/asciiblaster-cordoba/platforms/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..f870857 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + + asciiblaster-cordoba + @string/app_name + @string/launcher_name + diff --git a/asciiblaster-cordoba/platforms/android/app/src/main/res/xml/config.xml b/asciiblaster-cordoba/platforms/android/app/src/main/res/xml/config.xml new file mode 100644 index 0000000..251e42f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/app/src/main/res/xml/config.xml @@ -0,0 +1,24 @@ + + + + + + + + Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>, based on work by JOLLO NET NA + + + asciiblaster (standalone Apache Córdoba app) + + asciiblaster-cordoba + + + + + + + + + + + diff --git a/asciiblaster-cordoba/platforms/android/build.gradle b/asciiblaster-cordoba/platforms/android/build.gradle new file mode 100644 index 0000000..569004f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/build.gradle @@ -0,0 +1,54 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + dependencies { + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + classpath 'com.android.tools.build:gradle:3.0.1' + } +} + +allprojects { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + //This replaces project.properties w.r.t. build settings + project.ext { + defaultBuildToolsVersion="27.0.1" //String + defaultMinSdkVersion=19 //Integer - Minimum requirement is Android 4.4 + defaultTargetSdkVersion=27 //Integer - We ALWAYS target the latest by default + defaultCompileSdkVersion=27 //Integer - We ALWAYS compile with the latest by default + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/Api.js b/asciiblaster-cordoba/platforms/android/cordova/Api.js new file mode 100644 index 0000000..ae4d17b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/Api.js @@ -0,0 +1,411 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var path = require('path'); +var Q = require('q'); + +var AndroidProject = require('./lib/AndroidProject'); +var AndroidStudio = require('./lib/AndroidStudio'); +var PluginManager = require('cordova-common').PluginManager; + +var CordovaLogger = require('cordova-common').CordovaLogger; +var selfEvents = require('cordova-common').events; + +var PLATFORM = 'android'; + +function setupEvents (externalEventEmitter) { + if (externalEventEmitter) { + // This will make the platform internal events visible outside + selfEvents.forwardEventsTo(externalEventEmitter); + return externalEventEmitter; + } + + // There is no logger if external emitter is not present, + // so attach a console logger + CordovaLogger.get().subscribe(selfEvents); + return selfEvents; +} + +/** + * Class, that acts as abstraction over particular platform. Encapsulates the + * platform's properties and methods. + * + * Platform that implements own PlatformApi instance _should implement all + * prototype methods_ of this class to be fully compatible with cordova-lib. + * + * The PlatformApi instance also should define the following field: + * + * * platform: String that defines a platform name. + */ +function Api (platform, platformRootDir, events) { + this.platform = PLATFORM; + this.root = path.resolve(__dirname, '..'); + this.builder = 'gradle'; + + setupEvents(events); + + var self = this; + + this.locations = { + root: self.root, + www: path.join(self.root, 'assets/www'), + res: path.join(self.root, 'res'), + platformWww: path.join(self.root, 'platform_www'), + configXml: path.join(self.root, 'res/xml/config.xml'), + defaultConfigXml: path.join(self.root, 'cordova/defaults.xml'), + strings: path.join(self.root, 'res/values/strings.xml'), + manifest: path.join(self.root, 'AndroidManifest.xml'), + build: path.join(self.root, 'build'), + javaSrc: path.join(self.root, 'src'), + // NOTE: Due to platformApi spec we need to return relative paths here + cordovaJs: 'bin/templates/project/assets/www/cordova.js', + cordovaJsSrc: 'cordova-js-src' + }; + + // XXX Override some locations for Android Studio projects + if (AndroidStudio.isAndroidStudioProject(self.root) === true) { + selfEvents.emit('log', 'Android Studio project detected'); + this.builder = 'studio'; + this.android_studio = true; + this.locations.configXml = path.join(self.root, 'app/src/main/res/xml/config.xml'); + this.locations.strings = path.join(self.root, 'app/src/main/res/values/strings.xml'); + this.locations.manifest = path.join(self.root, 'app/src/main/AndroidManifest.xml'); + // We could have Java Source, we could have other languages + this.locations.javaSrc = path.join(self.root, 'app/src/main/java/'); + this.locations.www = path.join(self.root, 'app/src/main/assets/www'); + this.locations.res = path.join(self.root, 'app/src/main/res'); + } +} + +/** + * Installs platform to specified directory and creates a platform project. + * + * @param {String} destination Destination directory, where insatll platform to + * @param {ConfigParser} [config] ConfgiParser instance, used to retrieve + * project creation options, such as package id and project name. + * @param {Object} [options] An options object. The most common options are: + * @param {String} [options.customTemplate] A path to custom template, that + * should override the default one from platform. + * @param {Boolean} [options.link] Flag that indicates that platform's + * sources will be linked to installed platform instead of copying. + * @param {EventEmitter} [events] An EventEmitter instance that will be used for + * logging purposes. If no EventEmitter provided, all events will be logged to + * console + * + * @return {Promise} Promise either fulfilled with PlatformApi + * instance or rejected with CordovaError. + */ +Api.createPlatform = function (destination, config, options, events) { + events = setupEvents(events); + var result; + try { + result = require('../../lib/create').create(destination, config, options, events).then(function (destination) { + var PlatformApi = require(path.resolve(destination, 'cordova/Api')); + return new PlatformApi(PLATFORM, destination, events); + }); + } catch (e) { + events.emit('error', 'createPlatform is not callable from the android project API.'); + throw (e); + } + return result; +}; + +/** + * Updates already installed platform. + * + * @param {String} destination Destination directory, where platform installed + * @param {Object} [options] An options object. The most common options are: + * @param {String} [options.customTemplate] A path to custom template, that + * should override the default one from platform. + * @param {Boolean} [options.link] Flag that indicates that platform's + * sources will be linked to installed platform instead of copying. + * @param {EventEmitter} [events] An EventEmitter instance that will be used for + * logging purposes. If no EventEmitter provided, all events will be logged to + * console + * + * @return {Promise} Promise either fulfilled with PlatformApi + * instance or rejected with CordovaError. + */ +Api.updatePlatform = function (destination, options, events) { + events = setupEvents(events); + var result; + try { + result = require('../../lib/create').update(destination, options, events).then(function (destination) { + var PlatformApi = require(path.resolve(destination, 'cordova/Api')); + return new PlatformApi('android', destination, events); + }); + } catch (e) { + events.emit('error', 'updatePlatform is not callable from the android project API, you will need to do this manually.'); + throw (e); + } + return result; +}; + +/** + * Gets a CordovaPlatform object, that represents the platform structure. + * + * @return {CordovaPlatform} A structure that contains the description of + * platform's file structure and other properties of platform. + */ +Api.prototype.getPlatformInfo = function () { + var result = {}; + result.locations = this.locations; + result.root = this.root; + result.name = this.platform; + result.version = require('./version'); + result.projectConfig = this._config; + + return result; +}; + +/** + * Updates installed platform with provided www assets and new app + * configuration. This method is required for CLI workflow and will be called + * each time before build, so the changes, made to app configuration and www + * code, will be applied to platform. + * + * @param {CordovaProject} cordovaProject A CordovaProject instance, that defines a + * project structure and configuration, that should be applied to platform + * (contains project's www location and ConfigParser instance for project's + * config). + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError instance. + */ +Api.prototype.prepare = function (cordovaProject, prepareOptions) { + return require('./lib/prepare').prepare.call(this, cordovaProject, prepareOptions); +}; + +/** + * Installs a new plugin into platform. This method only copies non-www files + * (sources, libs, etc.) to platform. It also doesn't resolves the + * dependencies of plugin. Both of handling of www files, such as assets and + * js-files and resolving dependencies are the responsibility of caller. + * + * @param {PluginInfo} plugin A PluginInfo instance that represents plugin + * that will be installed. + * @param {Object} installOptions An options object. Possible options below: + * @param {Boolean} installOptions.link: Flag that specifies that plugin + * sources will be symlinked to app's directory instead of copying (if + * possible). + * @param {Object} installOptions.variables An object that represents + * variables that will be used to install plugin. See more details on plugin + * variables in documentation: + * https://cordova.apache.org/docs/en/4.0.0/plugin_ref_spec.md.html + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError instance. + */ +Api.prototype.addPlugin = function (plugin, installOptions) { + var project = AndroidProject.getProjectFile(this.root); + var self = this; + + installOptions = installOptions || {}; + installOptions.variables = installOptions.variables || {}; + // Add PACKAGE_NAME variable into vars + if (!installOptions.variables.PACKAGE_NAME) { + installOptions.variables.PACKAGE_NAME = project.getPackageName(); + } + + if (this.android_studio === true) { + installOptions.android_studio = true; + } + + return Q().then(function () { + // CB-11964: Do a clean when installing the plugin code to get around + // the Gradle bug introduced by the Android Gradle Plugin Version 2.2 + // TODO: Delete when the next version of Android Gradle plugin comes out + // Since clean doesn't just clean the build, it also wipes out www, we need + // to pass additional options. + + // Do some basic argument parsing + var opts = {}; + + // Skip cleaning prepared files when not invoking via cordova CLI. + opts.noPrepare = true; + + if (!AndroidStudio.isAndroidStudioProject(self.root) && !project.isClean()) { + return self.clean(opts); + } + }).then(function () { + return PluginManager.get(self.platform, self.locations, project).addPlugin(plugin, installOptions); + }).then(function () { + if (plugin.getFrameworks(this.platform).length === 0) return; + selfEvents.emit('verbose', 'Updating build files since android plugin contained '); + // This should pick the correct builder, not just get gradle + require('./lib/builders/builders').getBuilder(this.builder).prepBuildFiles(); + }.bind(this)) + // CB-11022 Return truthy value to prevent running prepare after + .thenResolve(true); +}; + +/** + * Removes an installed plugin from platform. + * + * Since method accepts PluginInfo instance as input parameter instead of plugin + * id, caller shoud take care of managing/storing PluginInfo instances for + * future uninstalls. + * + * @param {PluginInfo} plugin A PluginInfo instance that represents plugin + * that will be installed. + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError instance. + */ +Api.prototype.removePlugin = function (plugin, uninstallOptions) { + var project = AndroidProject.getProjectFile(this.root); + + if (uninstallOptions && uninstallOptions.usePlatformWww === true && this.android_studio === true) { + uninstallOptions.usePlatformWww = false; + uninstallOptions.android_studio = true; + } + + return PluginManager.get(this.platform, this.locations, project) + .removePlugin(plugin, uninstallOptions) + .then(function () { + if (plugin.getFrameworks(this.platform).length === 0) return; + + selfEvents.emit('verbose', 'Updating build files since android plugin contained '); + require('./lib/builders/builders').getBuilder(this.builder).prepBuildFiles(); + }.bind(this)) + // CB-11022 Return truthy value to prevent running prepare after + .thenResolve(true); +}; + +/** + * Builds an application package for current platform. + * + * @param {Object} buildOptions A build options. This object's structure is + * highly depends on platform's specific. The most common options are: + * @param {Boolean} buildOptions.debug Indicates that packages should be + * built with debug configuration. This is set to true by default unless the + * 'release' option is not specified. + * @param {Boolean} buildOptions.release Indicates that packages should be + * built with release configuration. If not set to true, debug configuration + * will be used. + * @param {Boolean} buildOptions.device Specifies that built app is intended + * to run on device + * @param {Boolean} buildOptions.emulator: Specifies that built app is + * intended to run on emulator + * @param {String} buildOptions.target Specifies the device id that will be + * used to run built application. + * @param {Boolean} buildOptions.nobuild Indicates that this should be a + * dry-run call, so no build artifacts will be produced. + * @param {String[]} buildOptions.archs Specifies chip architectures which + * app packages should be built for. List of valid architectures is depends on + * platform. + * @param {String} buildOptions.buildConfig The path to build configuration + * file. The format of this file is depends on platform. + * @param {String[]} buildOptions.argv Raw array of command-line arguments, + * passed to `build` command. The purpose of this property is to pass a + * platform-specific arguments, and eventually let platform define own + * arguments processing logic. + * + * @return {Promise} A promise either fulfilled with an array of build + * artifacts (application packages) if package was built successfully, + * or rejected with CordovaError. The resultant build artifact objects is not + * strictly typed and may conatin arbitrary set of fields as in sample below. + * + * { + * architecture: 'x86', + * buildType: 'debug', + * path: '/path/to/build', + * type: 'app' + * } + * + * The return value in most cases will contain only one item but in some cases + * there could be multiple items in output array, e.g. when multiple + * arhcitectures is specified. + */ +Api.prototype.build = function (buildOptions) { + var self = this; + if (this.android_studio) { + buildOptions.studio = true; + } + return require('./lib/check_reqs').run().then(function () { + return require('./lib/build').run.call(self, buildOptions); + }).then(function (buildResults) { + // Cast build result to array of build artifacts + return buildResults.apkPaths.map(function (apkPath) { + return { + buildType: buildResults.buildType, + buildMethod: buildResults.buildMethod, + path: apkPath, + type: 'apk' + }; + }); + }); +}; + +/** + * Builds an application package for current platform and runs it on + * specified/default device. If no 'device'/'emulator'/'target' options are + * specified, then tries to run app on default device if connected, otherwise + * runs the app on emulator. + * + * @param {Object} runOptions An options object. The structure is the same + * as for build options. + * + * @return {Promise} A promise either fulfilled if package was built and ran + * successfully, or rejected with CordovaError. + */ +Api.prototype.run = function (runOptions) { + var self = this; + return require('./lib/check_reqs').run().then(function () { + return require('./lib/run').run.call(self, runOptions); + }); +}; + +/** + * Cleans out the build artifacts from platform's directory, and also + * cleans out the platform www directory if called without options specified. + * + * @return {Promise} Return a promise either fulfilled, or rejected with + * CordovaError. + */ +Api.prototype.clean = function (cleanOptions) { + var self = this; + if (this.android_studio) { + // This will lint, checking for null won't + if (typeof cleanOptions === 'undefined') { + cleanOptions = {}; + } + cleanOptions.studio = true; + } + + return require('./lib/check_reqs').run().then(function () { + return require('./lib/build').runClean.call(self, cleanOptions); + }).then(function () { + return require('./lib/prepare').clean.call(self, cleanOptions); + }); +}; + +/** + * Performs a requirements check for current platform. Each platform defines its + * own set of requirements, which should be resolved before platform can be + * built successfully. + * + * @return {Promise} Promise, resolved with set of Requirement + * objects for current platform. + */ +Api.prototype.requirements = function () { + return require('./lib/check_reqs').check_all(); +}; + +module.exports = Api; diff --git a/asciiblaster-cordoba/platforms/android/cordova/android_sdk_version b/asciiblaster-cordoba/platforms/android/cordova/android_sdk_version new file mode 100644 index 0000000..34ed28f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/android_sdk_version @@ -0,0 +1,29 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var android_sdk = require('./lib/android_sdk'); + +android_sdk.print_newest_available_sdk_target().done(null, function(err) { + console.error(err); + process.exit(2); +}); + + diff --git a/asciiblaster-cordoba/platforms/android/cordova/android_sdk_version.bat b/asciiblaster-cordoba/platforms/android/cordova/android_sdk_version.bat new file mode 100644 index 0000000..a6bc104 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/android_sdk_version.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0android_sdk_version" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'android_sdk_version' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/asciiblaster-cordoba/platforms/android/cordova/build b/asciiblaster-cordoba/platforms/android/cordova/build new file mode 100644 index 0000000..222e84a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/build @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var args = process.argv; +var Api = require('./Api'); +var nopt = require('nopt'); +var path = require('path'); + +// Support basic help commands +if(['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) >= 0) + require('./lib/build').help(); + +// Do some basic argument parsing +var buildOpts = nopt({ + 'verbose' : Boolean, + 'silent' : Boolean, + 'debug' : Boolean, + 'release' : Boolean, + 'nobuild': Boolean, + 'buildConfig' : path +}, { 'd' : '--verbose' }); + +// Make buildOptions compatible with PlatformApi build method spec +buildOpts.argv = buildOpts.argv.original; + +require('./loggingHelper').adjustLoggerLevel(buildOpts); + +new Api().build(buildOpts) +.catch(function(err) { + console.error(err.stack); + process.exit(2); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/build.bat b/asciiblaster-cordoba/platforms/android/cordova/build.bat new file mode 100644 index 0000000..46e966a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/build.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0build" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'build' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/check_reqs b/asciiblaster-cordoba/platforms/android/cordova/check_reqs new file mode 100644 index 0000000..372a383 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/check_reqs @@ -0,0 +1,31 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var check_reqs = require('./lib/check_reqs'); + +check_reqs.run().done( + function success() { + console.log('Looks like your environment fully supports cordova-android development!'); + }, function fail(err) { + console.log(err); + process.exit(2); + } +); diff --git a/asciiblaster-cordoba/platforms/android/cordova/check_reqs.bat b/asciiblaster-cordoba/platforms/android/cordova/check_reqs.bat new file mode 100644 index 0000000..846dfa1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/check_reqs.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0check_reqs" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'check_reqs' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/asciiblaster-cordoba/platforms/android/cordova/clean b/asciiblaster-cordoba/platforms/android/cordova/clean new file mode 100644 index 0000000..22065cc --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/clean @@ -0,0 +1,51 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Api = require('./Api'); +var path = require('path'); +var nopt = require('nopt'); + +// Support basic help commands +if(['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) >= 0) { + console.log('Usage: ' + path.relative(process.cwd(), process.argv[1])); + console.log('Cleans the project directory.'); + process.exit(0); +} + +// Do some basic argument parsing +var opts = nopt({ + 'verbose' : Boolean, + 'silent' : Boolean +}, { 'd' : '--verbose' }); + +// Make buildOptions compatible with PlatformApi clean method spec +opts.argv = opts.argv.original; + +// Skip cleaning prepared files when not invoking via cordova CLI. +opts.noPrepare = true; + +require('./loggingHelper').adjustLoggerLevel(opts); + +new Api().clean(opts) +.catch(function(err) { + console.error(err.stack); + process.exit(2); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/clean.bat b/asciiblaster-cordoba/platforms/android/cordova/clean.bat new file mode 100644 index 0000000..445ef6e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/clean.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0clean" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'clean' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/defaults.xml b/asciiblaster-cordoba/platforms/android/cordova/defaults.xml new file mode 100644 index 0000000..5286ab9 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/defaults.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/Adb.js b/asciiblaster-cordoba/platforms/android/cordova/lib/Adb.js new file mode 100644 index 0000000..038c67c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/Adb.js @@ -0,0 +1,101 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var os = require('os'); +var events = require('cordova-common').events; +var spawn = require('cordova-common').superspawn.spawn; +var CordovaError = require('cordova-common').CordovaError; + +var Adb = {}; + +function isDevice (line) { + return line.match(/\w+\tdevice/) && !line.match(/emulator/); +} + +function isEmulator (line) { + return line.match(/device/) && line.match(/emulator/); +} + +/** + * Lists available/connected devices and emulators + * + * @param {Object} opts Various options + * @param {Boolean} opts.emulators Specifies whether this method returns + * emulators only + * + * @return {Promise} list of available/connected + * devices/emulators + */ +Adb.devices = function (opts) { + return spawn('adb', ['devices'], {cwd: os.tmpdir()}).then(function (output) { + return output.split('\n').filter(function (line) { + // Filter out either real devices or emulators, depending on options + return (line && opts && opts.emulators) ? isEmulator(line) : isDevice(line); + }).map(function (line) { + return line.replace(/\tdevice/, '').replace('\r', ''); + }); + }); +}; + +Adb.install = function (target, packagePath, opts) { + events.emit('verbose', 'Installing apk ' + packagePath + ' on target ' + target + '...'); + var args = ['-s', target, 'install']; + if (opts && opts.replace) args.push('-r'); + return spawn('adb', args.concat(packagePath), {cwd: os.tmpdir()}).then(function (output) { + // 'adb install' seems to always returns no error, even if installation fails + // so we catching output to detect installation failure + if (output.match(/Failure/)) { + if (output.match(/INSTALL_PARSE_FAILED_NO_CERTIFICATES/)) { + output += '\n\n' + 'Sign the build using \'-- --keystore\' or \'--buildConfig\'' + + ' or sign and deploy the unsigned apk manually using Android tools.'; + } else if (output.match(/INSTALL_FAILED_VERSION_DOWNGRADE/)) { + output += '\n\n' + 'You\'re trying to install apk with a lower versionCode that is already installed.' + + '\nEither uninstall an app or increment the versionCode.'; + } + + return Q.reject(new CordovaError('Failed to install apk to device: ' + output)); + } + }); +}; + +Adb.uninstall = function (target, packageId) { + events.emit('verbose', 'Uninstalling package ' + packageId + ' from target ' + target + '...'); + return spawn('adb', ['-s', target, 'uninstall', packageId], {cwd: os.tmpdir()}); +}; + +Adb.shell = function (target, shellCommand) { + events.emit('verbose', 'Running adb shell command "' + shellCommand + '" on target ' + target + '...'); + var args = ['-s', target, 'shell']; + shellCommand = shellCommand.split(/\s+/); + return spawn('adb', args.concat(shellCommand), {cwd: os.tmpdir()}).catch(function (output) { + return Q.reject(new CordovaError('Failed to execute shell command "' + + shellCommand + '"" on device: ' + output)); + }); +}; + +Adb.start = function (target, activityName) { + events.emit('verbose', 'Starting application "' + activityName + '" on target ' + target + '...'); + return Adb.shell(target, 'am start -W -a android.intent.action.MAIN -n' + activityName).catch(function (output) { + return Q.reject(new CordovaError('Failed to start application "' + + activityName + '"" on device: ' + output)); + }); +}; + +module.exports = Adb; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidManifest.js b/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidManifest.js new file mode 100644 index 0000000..5b7077a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidManifest.js @@ -0,0 +1,160 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var fs = require('fs'); +var et = require('elementtree'); +var xml = require('cordova-common').xmlHelpers; + +var DEFAULT_ORIENTATION = 'default'; + +/** Wraps an AndroidManifest file */ +function AndroidManifest (path) { + this.path = path; + this.doc = xml.parseElementtreeSync(path); + if (this.doc.getroot().tag !== 'manifest') { + throw new Error('AndroidManifest at ' + path + ' has incorrect root node name (expected "manifest")'); + } +} + +AndroidManifest.prototype.getVersionName = function () { + return this.doc.getroot().attrib['android:versionName']; +}; + +AndroidManifest.prototype.setVersionName = function (versionName) { + this.doc.getroot().attrib['android:versionName'] = versionName; + return this; +}; + +AndroidManifest.prototype.getVersionCode = function () { + return this.doc.getroot().attrib['android:versionCode']; +}; + +AndroidManifest.prototype.setVersionCode = function (versionCode) { + this.doc.getroot().attrib['android:versionCode'] = versionCode; + return this; +}; + +AndroidManifest.prototype.getPackageId = function () { + /* jshint -W069 */ + return this.doc.getroot().attrib['package']; + /* jshint +W069 */ +}; + +AndroidManifest.prototype.setPackageId = function (pkgId) { + /* jshint -W069 */ + this.doc.getroot().attrib['package'] = pkgId; + /* jshint +W069 */ + return this; +}; + +AndroidManifest.prototype.getActivity = function () { + var activity = this.doc.getroot().find('./application/activity'); + return { + getName: function () { + return activity.attrib['android:name']; + }, + setName: function (name) { + if (!name) { + delete activity.attrib['android:name']; + } else { + activity.attrib['android:name'] = name; + } + return this; + }, + getOrientation: function () { + return activity.attrib['android:screenOrientation']; + }, + setOrientation: function (orientation) { + if (!orientation || orientation.toLowerCase() === DEFAULT_ORIENTATION) { + delete activity.attrib['android:screenOrientation']; + } else { + activity.attrib['android:screenOrientation'] = orientation; + } + return this; + }, + getLaunchMode: function () { + return activity.attrib['android:launchMode']; + }, + setLaunchMode: function (launchMode) { + if (!launchMode) { + delete activity.attrib['android:launchMode']; + } else { + activity.attrib['android:launchMode'] = launchMode; + } + return this; + } + }; +}; + +['minSdkVersion', 'maxSdkVersion', 'targetSdkVersion'].forEach(function (sdkPrefName) { + // Copy variable reference to avoid closure issues + var prefName = sdkPrefName; + + AndroidManifest.prototype['get' + capitalize(prefName)] = function () { + var usesSdk = this.doc.getroot().find('./uses-sdk'); + return usesSdk && usesSdk.attrib['android:' + prefName]; + }; + + AndroidManifest.prototype['set' + capitalize(prefName)] = function (prefValue) { + var usesSdk = this.doc.getroot().find('./uses-sdk'); + + if (!usesSdk && prefValue) { // if there is no required uses-sdk element, we should create it first + usesSdk = new et.Element('uses-sdk'); + this.doc.getroot().append(usesSdk); + } + + if (prefValue) { + usesSdk.attrib['android:' + prefName] = prefValue; + } + + return this; + }; +}); + +AndroidManifest.prototype.getDebuggable = function () { + return this.doc.getroot().find('./application').attrib['android:debuggable'] === 'true'; +}; + +AndroidManifest.prototype.setDebuggable = function (value) { + var application = this.doc.getroot().find('./application'); + if (value) { + application.attrib['android:debuggable'] = 'true'; + } else { + // The default value is "false", so we can remove attribute at all. + delete application.attrib['android:debuggable']; + } + return this; +}; + +/** + * Writes manifest to disk syncronously. If filename is specified, then manifest + * will be written to that file + * + * @param {String} [destPath] File to write manifest to. If omitted, + * manifest will be written to file it has been read from. + */ +AndroidManifest.prototype.write = function (destPath) { + fs.writeFileSync(destPath || this.path, this.doc.write({indent: 4}), 'utf-8'); +}; + +module.exports = AndroidManifest; + +function capitalize (str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidProject.js b/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidProject.js new file mode 100644 index 0000000..bf55cad --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidProject.js @@ -0,0 +1,209 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var fs = require('fs'); +var path = require('path'); +var properties_parser = require('properties-parser'); +var AndroidManifest = require('./AndroidManifest'); +var AndroidStudio = require('./AndroidStudio'); +var pluginHandlers = require('./pluginHandlers'); + +var projectFileCache = {}; + +function addToPropertyList (projectProperties, key, value) { + var i = 1; + while (projectProperties.get(key + '.' + i)) { i++; } + + projectProperties.set(key + '.' + i, value); + projectProperties.dirty = true; +} + +function removeFromPropertyList (projectProperties, key, value) { + var i = 1; + var currentValue; + while ((currentValue = projectProperties.get(key + '.' + i))) { + if (currentValue === value) { + while ((currentValue = projectProperties.get(key + '.' + (i + 1)))) { + projectProperties.set(key + '.' + i, currentValue); + i++; + } + projectProperties.set(key + '.' + i); + break; + } + i++; + } + projectProperties.dirty = true; +} + +function getRelativeLibraryPath (parentDir, subDir) { + var libraryPath = path.relative(parentDir, subDir); + return (path.sep === '\\') ? libraryPath.replace(/\\/g, '/') : libraryPath; +} + +function AndroidProject (projectDir) { + this._propertiesEditors = {}; + this._subProjectDirs = {}; + this._dirty = false; + this.projectDir = projectDir; + this.platformWww = path.join(this.projectDir, 'platform_www'); + this.www = path.join(this.projectDir, 'assets/www'); + if (AndroidStudio.isAndroidStudioProject(projectDir) === true) { + this.www = path.join(this.projectDir, 'app/src/main/assets/www'); + } +} + +AndroidProject.getProjectFile = function (projectDir) { + if (!projectFileCache[projectDir]) { + projectFileCache[projectDir] = new AndroidProject(projectDir); + } + + return projectFileCache[projectDir]; +}; + +AndroidProject.purgeCache = function (projectDir) { + if (projectDir) { + delete projectFileCache[projectDir]; + } else { + projectFileCache = {}; + } +}; + +/** + * Reads the package name out of the Android Manifest file + * + * @param {String} projectDir The absolute path to the directory containing the project + * + * @return {String} The name of the package + */ +AndroidProject.prototype.getPackageName = function () { + var manifestPath = path.join(this.projectDir, 'AndroidManifest.xml'); + if (AndroidStudio.isAndroidStudioProject(this.projectDir) === true) { + manifestPath = path.join(this.projectDir, 'app/src/main/AndroidManifest.xml'); + } + return new AndroidManifest(manifestPath).getPackageId(); +}; + +AndroidProject.prototype.getCustomSubprojectRelativeDir = function (plugin_id, src) { + // All custom subprojects are prefixed with the last portion of the package id. + // This is to avoid collisions when opening multiple projects in Eclipse that have subprojects with the same name. + var packageName = this.getPackageName(); + var lastDotIndex = packageName.lastIndexOf('.'); + var prefix = packageName.substring(lastDotIndex + 1); + var subRelativeDir = path.join(plugin_id, prefix + '-' + path.basename(src)); + return subRelativeDir; +}; + +AndroidProject.prototype.addSubProject = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var subProjectFile = path.resolve(subDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + // TODO: Setting the target needs to happen only for pre-3.7.0 projects + if (fs.existsSync(subProjectFile)) { + var subProperties = this._getPropertiesFile(subProjectFile); + subProperties.set('target', parentProperties.get('target')); + subProperties.dirty = true; + this._subProjectDirs[subDir] = true; + } + addToPropertyList(parentProperties, 'android.library.reference', getRelativeLibraryPath(parentDir, subDir)); + + this._dirty = true; +}; + +AndroidProject.prototype.removeSubProject = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + removeFromPropertyList(parentProperties, 'android.library.reference', getRelativeLibraryPath(parentDir, subDir)); + delete this._subProjectDirs[subDir]; + this._dirty = true; +}; + +AndroidProject.prototype.addGradleReference = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + addToPropertyList(parentProperties, 'cordova.gradle.include', getRelativeLibraryPath(parentDir, subDir)); + this._dirty = true; +}; + +AndroidProject.prototype.removeGradleReference = function (parentDir, subDir) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + removeFromPropertyList(parentProperties, 'cordova.gradle.include', getRelativeLibraryPath(parentDir, subDir)); + this._dirty = true; +}; + +AndroidProject.prototype.addSystemLibrary = function (parentDir, value) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + addToPropertyList(parentProperties, 'cordova.system.library', value); + this._dirty = true; +}; + +AndroidProject.prototype.removeSystemLibrary = function (parentDir, value) { + var parentProjectFile = path.resolve(parentDir, 'project.properties'); + var parentProperties = this._getPropertiesFile(parentProjectFile); + removeFromPropertyList(parentProperties, 'cordova.system.library', value); + this._dirty = true; +}; + +AndroidProject.prototype.write = function () { + if (!this._dirty) { + return; + } + this._dirty = false; + + for (var filename in this._propertiesEditors) { + var editor = this._propertiesEditors[filename]; + if (editor.dirty) { + fs.writeFileSync(filename, editor.toString()); + editor.dirty = false; + } + } +}; + +AndroidProject.prototype._getPropertiesFile = function (filename) { + if (!this._propertiesEditors[filename]) { + if (fs.existsSync(filename)) { + this._propertiesEditors[filename] = properties_parser.createEditor(filename); + } else { + this._propertiesEditors[filename] = properties_parser.createEditor(); + } + } + + return this._propertiesEditors[filename]; +}; + +AndroidProject.prototype.getInstaller = function (type) { + return pluginHandlers.getInstaller(type); +}; + +AndroidProject.prototype.getUninstaller = function (type) { + return pluginHandlers.getUninstaller(type); +}; + +/* + * This checks if an Android project is clean or has old build artifacts + */ + +AndroidProject.prototype.isClean = function () { + var build_path = path.join(this.projectDir, 'build'); + // If the build directory doesn't exist, it's clean + return !(fs.existsSync(build_path)); +}; + +module.exports = AndroidProject; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidStudio.js b/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidStudio.js new file mode 100644 index 0000000..68d4d8f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/AndroidStudio.js @@ -0,0 +1,11 @@ +/* + * This is a simple routine that checks if project is an Android Studio Project + * + * @param {String} root Root folder of the project + */ + +/* jshint esnext: false */ + +module.exports.isAndroidStudioProject = function isAndroidStudioProject (root) { + return true; +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/android_sdk.js b/asciiblaster-cordoba/platforms/android/cordova/lib/android_sdk.js new file mode 100644 index 0000000..148f9f3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/android_sdk.js @@ -0,0 +1,102 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var superspawn = require('cordova-common').superspawn; + +var suffix_number_regex = /(\d+)$/; +// Used for sorting Android targets, example strings to sort: +// android-19 +// android-L +// Google Inc.:Google APIs:20 +// Google Inc.:Glass Development Kit Preview:20 +// The idea is to sort based on largest "suffix" number - meaning the bigger +// the number at the end, the more recent the target, the closer to the +// start of the array. +function sort_by_largest_numerical_suffix (a, b) { + var suffix_a = a.match(suffix_number_regex); + var suffix_b = b.match(suffix_number_regex); + if (suffix_a && suffix_b) { + // If the two targets being compared have suffixes, return less than + // zero, or greater than zero, based on which suffix is larger. + return (parseInt(suffix_a[1]) > parseInt(suffix_b[1]) ? -1 : 1); + } else { + // If no suffix numbers were detected, leave the order as-is between + // elements a and b. + return 0; + } +} + +module.exports.print_newest_available_sdk_target = function () { + return module.exports.list_targets().then(function (targets) { + targets.sort(sort_by_largest_numerical_suffix); + console.log(targets[0]); + }); +}; + +module.exports.version_string_to_api_level = { + '4.0': 14, + '4.0.3': 15, + '4.1': 16, + '4.2': 17, + '4.3': 18, + '4.4': 19, + '4.4W': 20, + '5.0': 21, + '5.1': 22, + '6.0': 23, + '7.0': 24, + '7.1.1': 25, + '8.0': 26 +}; + +function parse_targets (output) { + var target_out = output.split('\n'); + var targets = []; + for (var i = target_out.length - 1; i >= 0; i--) { + if (target_out[i].match(/id:/)) { // if "id:" is in the line... + targets.push(target_out[i].match(/"(.+)"/)[1]); // .. match whatever is in quotes. + } + } + return targets; +} + +module.exports.list_targets_with_android = function () { + return superspawn.spawn('android', ['list', 'target']).then(parse_targets); +}; + +module.exports.list_targets_with_avdmanager = function () { + return superspawn.spawn('avdmanager', ['list', 'target']).then(parse_targets); +}; + +module.exports.list_targets = function () { + return module.exports.list_targets_with_avdmanager().catch(function (err) { + // If there's an error, like avdmanager could not be found, we can try + // as a last resort, to run `android`, in case this is a super old + // SDK installation. + if (err && (err.code === 'ENOENT' || (err.stderr && err.stderr.match(/not recognized/)))) { + return module.exports.list_targets_with_android(); + } else throw err; + }).then(function (targets) { + if (targets.length === 0) { + return Q.reject(new Error('No android targets (SDKs) installed!')); + } + return targets; + }); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/build.js b/asciiblaster-cordoba/platforms/android/cordova/lib/build.js new file mode 100644 index 0000000..e33cfae --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/build.js @@ -0,0 +1,294 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var path = require('path'); +var fs = require('fs'); +var nopt = require('nopt'); + +var Adb = require('./Adb'); + +var builders = require('./builders/builders'); +var events = require('cordova-common').events; +var spawn = require('cordova-common').superspawn.spawn; +var CordovaError = require('cordova-common').CordovaError; + +function parseOpts (options, resolvedTarget, projectRoot) { + options = options || {}; + options.argv = nopt({ + gradle: Boolean, + studio: Boolean, + prepenv: Boolean, + versionCode: String, + minSdkVersion: String, + gradleArg: [String, Array], + keystore: path, + alias: String, + storePassword: String, + password: String, + keystoreType: String + }, {}, options.argv, 0); + + // Android Studio Build method is the default + var ret = { + buildType: options.release ? 'release' : 'debug', + buildMethod: process.env.ANDROID_BUILD || 'studio', + prepEnv: options.argv.prepenv, + arch: resolvedTarget && resolvedTarget.arch, + extraArgs: [] + }; + + if (options.argv.gradle || options.argv.studio) { + ret.buildMethod = options.argv.studio ? 'studio' : 'gradle'; + } + + // This comes from cordova/run + if (options.studio) ret.buildMethod = 'studio'; + if (options.gradle) ret.buildMethod = 'gradle'; + + if (options.nobuild) ret.buildMethod = 'none'; + + if (options.argv.versionCode) { ret.extraArgs.push('-PcdvVersionCode=' + options.argv.versionCode); } + + if (options.argv.minSdkVersion) { ret.extraArgs.push('-PcdvMinSdkVersion=' + options.argv.minSdkVersion); } + + if (options.argv.gradleArg) { + ret.extraArgs = ret.extraArgs.concat(options.argv.gradleArg); + } + + var packageArgs = {}; + + if (options.argv.keystore) { packageArgs.keystore = path.relative(projectRoot, path.resolve(options.argv.keystore)); } + + ['alias', 'storePassword', 'password', 'keystoreType'].forEach(function (flagName) { + if (options.argv[flagName]) { packageArgs[flagName] = options.argv[flagName]; } + }); + + var buildConfig = options.buildConfig; + + // If some values are not specified as command line arguments - use build config to supplement them. + // Command line arguemnts have precedence over build config. + if (buildConfig) { + if (!fs.existsSync(buildConfig)) { + throw new Error('Specified build config file does not exist: ' + buildConfig); + } + events.emit('log', 'Reading build config file: ' + path.resolve(buildConfig)); + var buildjson = fs.readFileSync(buildConfig, 'utf8'); + var config = JSON.parse(buildjson.replace(/^\ufeff/, '')); // Remove BOM + if (config.android && config.android[ret.buildType]) { + var androidInfo = config.android[ret.buildType]; + if (androidInfo.keystore && !packageArgs.keystore) { + if (androidInfo.keystore.substr(0, 1) === '~') { + androidInfo.keystore = process.env.HOME + androidInfo.keystore.substr(1); + } + packageArgs.keystore = path.resolve(path.dirname(buildConfig), androidInfo.keystore); + events.emit('log', 'Reading the keystore from: ' + packageArgs.keystore); + } + + ['alias', 'storePassword', 'password', 'keystoreType'].forEach(function (key) { + packageArgs[key] = packageArgs[key] || androidInfo[key]; + }); + } + } + + if (packageArgs.keystore && packageArgs.alias) { + ret.packageInfo = new PackageInfo(packageArgs.keystore, packageArgs.alias, packageArgs.storePassword, + packageArgs.password, packageArgs.keystoreType); + } + + if (!ret.packageInfo) { + if (Object.keys(packageArgs).length > 0) { + events.emit('warn', '\'keystore\' and \'alias\' need to be specified to generate a signed archive.'); + } + } + + return ret; +} + +/* + * Builds the project with the specifed options + * Returns a promise. + */ +module.exports.runClean = function (options) { + var opts = parseOpts(options, null, this.root); + var builder = builders.getBuilder(opts.buildMethod); + return builder.prepEnv(opts).then(function () { + return builder.clean(opts); + }); +}; + +/** + * Builds the project with the specifed options. + * + * @param {BuildOptions} options A set of options. See PlatformApi.build + * method documentation for reference. + * @param {Object} optResolvedTarget A deployment target. Used to pass + * target architecture from upstream 'run' call. TODO: remove this option in + * favor of setting buildOptions.archs field. + * + * @return {Promise} Promise, resolved with built packages + * information. + */ +module.exports.run = function (options, optResolvedTarget) { + var opts = parseOpts(options, optResolvedTarget, this.root); + console.log(opts.buildMethod); + var builder = builders.getBuilder(opts.buildMethod); + return builder.prepEnv(opts).then(function () { + if (opts.prepEnv) { + events.emit('verbose', 'Build file successfully prepared.'); + return; + } + return builder.build(opts).then(function () { + var apkPaths = builder.findOutputApks(opts.buildType, opts.arch); + events.emit('log', 'Built the following apk(s): \n\t' + apkPaths.join('\n\t')); + return { + apkPaths: apkPaths, + buildType: opts.buildType, + buildMethod: opts.buildMethod + }; + }); + }); +}; + +/* + * Detects the architecture of a device/emulator + * Returns "arm" or "x86". + */ +module.exports.detectArchitecture = function (target) { + function helper () { + return Adb.shell(target, 'cat /proc/cpuinfo').then(function (output) { + return /intel/i.exec(output) ? 'x86' : 'arm'; + }); + } + // It sometimes happens (at least on OS X), that this command will hang forever. + // To fix it, either unplug & replug device, or restart adb server. + return helper().timeout(1000, new CordovaError('Device communication timed out. Try unplugging & replugging the device.')).then(null, function (err) { + if (/timed out/.exec('' + err)) { + // adb kill-server doesn't seem to do the trick. + // Could probably find a x-platform version of killall, but I'm not actually + // sure that this scenario even happens on non-OSX machines. + events.emit('verbose', 'adb timed out while detecting device/emulator architecture. Killing adb and trying again.'); + return spawn('killall', ['adb']).then(function () { + return helper().then(null, function () { + // The double kill is sadly often necessary, at least on mac. + events.emit('warn', 'adb timed out a second time while detecting device/emulator architecture. Killing adb and trying again.'); + return spawn('killall', ['adb']).then(function () { + return helper().then(null, function () { + return Q.reject(new CordovaError('adb timed out a third time while detecting device/emulator architecture. Try unplugging & replugging the device.')); + }); + }); + }); + }, function () { + // For non-killall OS's. + return Q.reject(err); + }); + } + throw err; + }); +}; + +module.exports.findBestApkForArchitecture = function (buildResults, arch) { + var paths = buildResults.apkPaths.filter(function (p) { + var apkName = path.basename(p); + if (buildResults.buildType === 'debug') { + return /-debug/.exec(apkName); + } + return !/-debug/.exec(apkName); + }); + var archPattern = new RegExp('-' + arch); + var hasArchPattern = /-x86|-arm/; + for (var i = 0; i < paths.length; ++i) { + var apkName = path.basename(paths[i]); + if (hasArchPattern.exec(apkName)) { + if (archPattern.exec(apkName)) { + return paths[i]; + } + } else { + return paths[i]; + } + } + throw new Error('Could not find apk architecture: ' + arch + ' build-type: ' + buildResults.buildType); +}; + +function PackageInfo (keystore, alias, storePassword, password, keystoreType) { + this.keystore = { + 'name': 'key.store', + 'value': keystore + }; + this.alias = { + 'name': 'key.alias', + 'value': alias + }; + if (storePassword) { + this.storePassword = { + 'name': 'key.store.password', + 'value': storePassword + }; + } + if (password) { + this.password = { + 'name': 'key.alias.password', + 'value': password + }; + } + if (keystoreType) { + this.keystoreType = { + 'name': 'key.store.type', + 'value': keystoreType + }; + } +} + +PackageInfo.prototype = { + toProperties: function () { + var self = this; + var result = ''; + Object.keys(self).forEach(function (key) { + result += self[key].name; + result += '='; + result += self[key].value.replace(/\\/g, '\\\\'); + result += '\n'; + }); + return result; + } +}; + +module.exports.help = function () { + console.log('Usage: ' + path.relative(process.cwd(), path.join('../build')) + ' [flags] [Signed APK flags]'); + console.log('Flags:'); + console.log(' \'--debug\': will build project in debug mode (default)'); + console.log(' \'--release\': will build project for release'); + console.log(' \'--ant\': will build project with ant'); + console.log(' \'--gradle\': will build project with gradle (default)'); + console.log(' \'--nobuild\': will skip build process (useful when using run command)'); + console.log(' \'--prepenv\': don\'t build, but copy in build scripts where necessary'); + console.log(' \'--versionCode=#\': Override versionCode for this build. Useful for uploading multiple APKs. Requires --gradle.'); + console.log(' \'--minSdkVersion=#\': Override minSdkVersion for this build. Useful for uploading multiple APKs. Requires --gradle.'); + console.log(' \'--gradleArg=\': Extra args to pass to the gradle command. Use one flag per arg. Ex. --gradleArg=-PcdvBuildMultipleApks=true'); + console.log(''); + console.log('Signed APK flags (overwrites debug/release-signing.proprties) :'); + console.log(' \'--keystore=\': Key store used to build a signed archive. (Required)'); + console.log(' \'--alias=\': Alias for the key store. (Required)'); + console.log(' \'--storePassword=\': Password for the key store. (Optional - prompted)'); + console.log(' \'--password=\': Password for the key. (Optional - prompted)'); + console.log(' \'--keystoreType\': Type of the keystore. (Optional)'); + process.exit(0); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/builders/GenericBuilder.js b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/GenericBuilder.js new file mode 100644 index 0000000..892aa38 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/GenericBuilder.js @@ -0,0 +1,124 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +/* eslint no-self-assign: 0 */ +/* eslint no-unused-vars: 0 */ + +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var events = require('cordova-common').events; + +function GenericBuilder (projectDir) { + this.root = projectDir || path.resolve(__dirname, '../../..'); + this.binDirs = { + studio: path.join(this.root, 'app', 'build', 'outputs', 'apk'), + gradle: path.join(this.root, 'build', 'outputs', 'apk') + }; +} + +GenericBuilder.prototype.prepEnv = function () { + return Q(); +}; + +GenericBuilder.prototype.build = function () { + events.emit('log', 'Skipping build...'); + return Q(null); +}; + +GenericBuilder.prototype.clean = function () { + return Q(); +}; + +GenericBuilder.prototype.findOutputApks = function (build_type, arch) { + var self = this; + return Object.keys(this.binDirs).reduce(function (result, builderName) { + var binDir = self.binDirs[builderName]; + return result.concat(findOutputApksHelper(binDir, build_type, builderName === 'ant' ? null : arch)); + }, []).sort(apkSorter); +}; + +module.exports = GenericBuilder; + +function apkSorter (fileA, fileB) { + // De-prioritize arch specific builds + var archSpecificRE = /-x86|-arm/; + if (archSpecificRE.exec(fileA)) { + return 1; + } else if (archSpecificRE.exec(fileB)) { + return -1; + } + + // De-prioritize unsigned builds + var unsignedRE = /-unsigned/; + if (unsignedRE.exec(fileA)) { + return 1; + } else if (unsignedRE.exec(fileB)) { + return -1; + } + + var timeDiff = fs.statSync(fileB).mtime - fs.statSync(fileA).mtime; + return timeDiff === 0 ? fileA.length - fileB.length : timeDiff; +} + +function findOutputApksHelper (dir, build_type, arch) { + var shellSilent = shell.config.silent; + shell.config.silent = true; + + // list directory recursively + var ret = shell.ls('-R', dir).map(function (file) { + // ls does not include base directory + return path.join(dir, file); + }).filter(function (file) { + // find all APKs + return file.match(/\.apk?$/i); + }).filter(function (candidate) { + var apkName = path.basename(candidate); + // Need to choose between release and debug .apk. + if (build_type === 'debug') { + return /-debug/.exec(apkName) && !/-unaligned|-unsigned/.exec(apkName); + } + if (build_type === 'release') { + return /-release/.exec(apkName) && !/-unaligned/.exec(apkName); + } + return true; + }).sort(apkSorter); + + shellSilent = shellSilent; + + if (ret.length === 0) { + return ret; + } + // Assume arch-specific build if newest apk has -x86 or -arm. + var archSpecific = !!/-x86|-arm/.exec(path.basename(ret[0])); + // And show only arch-specific ones (or non-arch-specific) + ret = ret.filter(function (p) { + /* jshint -W018 */ + return !!/-x86|-arm/.exec(path.basename(p)) === archSpecific; + /* jshint +W018 */ + }); + + if (archSpecific && ret.length > 1 && arch) { + ret = ret.filter(function (p) { + return path.basename(p).indexOf('-' + arch) !== -1; + }); + } + + return ret; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/builders/GradleBuilder.js b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/GradleBuilder.js new file mode 100644 index 0000000..b955db1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/GradleBuilder.js @@ -0,0 +1,331 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var fs = require('fs'); +var util = require('util'); +var path = require('path'); +var shell = require('shelljs'); +var superspawn = require('cordova-common').superspawn; +var CordovaError = require('cordova-common').CordovaError; +var events = require('cordova-common').events; +var check_reqs = require('../check_reqs'); + +var GenericBuilder = require('./GenericBuilder'); + +var MARKER = 'YOUR CHANGES WILL BE ERASED!'; +var SIGNING_PROPERTIES = '-signing.properties'; +var TEMPLATE = + '# This file is automatically generated.\n' + + '# Do not modify this file -- ' + MARKER + '\n'; + +function GradleBuilder (projectRoot) { + GenericBuilder.call(this, projectRoot); + + this.binDirs = { gradle: this.binDirs.gradle }; +} + +util.inherits(GradleBuilder, GenericBuilder); + +GradleBuilder.prototype.getArgs = function (cmd, opts) { + if (cmd === 'release') { + cmd = 'cdvBuildRelease'; + } else if (cmd === 'debug') { + cmd = 'cdvBuildDebug'; + } + var args = [cmd, '-b', path.join(this.root, 'build.gradle')]; + if (opts.arch) { + args.push('-PcdvBuildArch=' + opts.arch); + } + + // 10 seconds -> 6 seconds + args.push('-Dorg.gradle.daemon=true'); + // to allow dex in process + args.push('-Dorg.gradle.jvmargs=-Xmx2048m'); + // allow NDK to be used - required by Gradle 1.5 plugin + args.push('-Pandroid.useDeprecatedNdk=true'); + args.push.apply(args, opts.extraArgs); + // Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet): + // args.push('-Dorg.gradle.parallel=true'); + return args; +}; + +/* + * This returns a promise + */ + +GradleBuilder.prototype.runGradleWrapper = function (gradle_cmd, gradle_file) { + var gradlePath = path.join(this.root, 'gradlew'); + gradle_file = path.join(this.root, (gradle_file || 'wrapper.gradle')); + if (fs.existsSync(gradlePath)) { + // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows + } else { + return superspawn.spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', gradle_file], { stdio: 'pipe' }) + .progress(function (stdio) { + suppressJavaOptionsInfo(stdio); + }); + } +}; + +/* + * We need to kill this in a fire. + */ + +GradleBuilder.prototype.readProjectProperties = function () { + function findAllUniq (data, r) { + var s = {}; + var m; + while ((m = r.exec(data))) { + s[m[1]] = 1; + } + return Object.keys(s); + } + + var data = fs.readFileSync(path.join(this.root, 'project.properties'), 'utf8'); + return { + libs: findAllUniq(data, /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg), + gradleIncludes: findAllUniq(data, /^\s*cordova\.gradle\.include\.\d+=(.*)(?:\s|$)/mg), + systemLibs: findAllUniq(data, /^\s*cordova\.system\.library\.\d+=(.*)(?:\s|$)/mg) + }; +}; + +GradleBuilder.prototype.extractRealProjectNameFromManifest = function () { + var manifestPath = path.join(this.root, 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, 'utf8'); + var m = /= 0) { + return check_reqs.check_android_target(error).then(function () { + // If due to some odd reason - check_android_target succeeds + // we should still fail here. + return Q.reject(error); + }); + } + return Q.reject(error); + }); +}; + +GradleBuilder.prototype.clean = function (opts) { + var builder = this; + var wrapper = path.join(this.root, 'gradlew'); + var args = builder.getArgs('clean', opts); + return Q().then(function () { + return superspawn.spawn(wrapper, args, { stdio: 'inherit' }); + }).then(function () { + shell.rm('-rf', path.join(builder.root, 'out')); + + ['debug', 'release'].forEach(function (config) { + var propertiesFilePath = path.join(builder.root, config + SIGNING_PROPERTIES); + if (isAutoGenerated(propertiesFilePath)) { + shell.rm('-f', propertiesFilePath); + } + }); + }); +}; + +module.exports = GradleBuilder; + +function suppressJavaOptionsInfo (stdio) { + if (stdio.stderr) { + /* + * Workaround for the issue with Java printing some unwanted information to + * stderr instead of stdout. + * This function suppresses 'Picked up _JAVA_OPTIONS' message from being + * printed to stderr. See https://issues.apache.org/jira/browse/CB-9971 for + * explanation. + */ + var suppressThisLine = /^Picked up _JAVA_OPTIONS: /i.test(stdio.stderr.toString()); + if (suppressThisLine) { + return; + } + process.stderr.write(stdio.stderr); + } else { + process.stdout.write(stdio.stdout); + } +} + +function isAutoGenerated (file) { + return fs.existsSync(file) && fs.readFileSync(file, 'utf8').indexOf(MARKER) > 0; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/builders/StudioBuilder.js b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/StudioBuilder.js new file mode 100644 index 0000000..1689e16 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/StudioBuilder.js @@ -0,0 +1,303 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var fs = require('fs'); +var util = require('util'); +var path = require('path'); +var shell = require('shelljs'); +var spawn = require('cordova-common').superspawn.spawn; +var events = require('cordova-common').events; +var CordovaError = require('cordova-common').CordovaError; +var check_reqs = require('../check_reqs'); + +var GenericBuilder = require('./GenericBuilder'); + +var MARKER = 'YOUR CHANGES WILL BE ERASED!'; +var SIGNING_PROPERTIES = '-signing.properties'; +var TEMPLATE = + '# This file is automatically generated.\n' + + '# Do not modify this file -- ' + MARKER + '\n'; + +function StudioBuilder (projectRoot) { + GenericBuilder.call(this, projectRoot); + + this.binDirs = {gradle: this.binDirs.studio}; +} + +util.inherits(StudioBuilder, GenericBuilder); + +StudioBuilder.prototype.getArgs = function (cmd, opts) { + if (cmd === 'release') { + cmd = 'cdvBuildRelease'; + } else if (cmd === 'debug') { + cmd = 'cdvBuildDebug'; + } + var args = [cmd, '-b', path.join(this.root, 'build.gradle')]; + if (opts.arch) { + args.push('-PcdvBuildArch=' + opts.arch); + } + + // 10 seconds -> 6 seconds + args.push('-Dorg.gradle.daemon=true'); + // to allow dex in process + args.push('-Dorg.gradle.jvmargs=-Xmx2048m'); + // allow NDK to be used - required by Gradle 1.5 plugin + // args.push('-Pandroid.useDeprecatedNdk=true'); + args.push.apply(args, opts.extraArgs); + // Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet): + // args.push('-Dorg.gradle.parallel=true'); + return args; +}; + +/* + * This returns a promise + */ + +StudioBuilder.prototype.runGradleWrapper = function (gradle_cmd) { + var gradlePath = path.join(this.root, 'gradlew'); + var wrapperGradle = path.join(this.root, 'wrapper.gradle'); + if (fs.existsSync(gradlePath)) { + // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows + } else { + return spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', wrapperGradle], {stdio: 'inherit'}); + } +}; + +StudioBuilder.prototype.readProjectProperties = function () { + + function findAllUniq (data, r) { + var s = {}; + var m; + while ((m = r.exec(data))) { + s[m[1]] = 1; + } + return Object.keys(s); + } + + var data = fs.readFileSync(path.join(this.root, 'project.properties'), 'utf8'); + return { + libs: findAllUniq(data, /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg), + gradleIncludes: findAllUniq(data, /^\s*cordova\.gradle\.include\.\d+=(.*)(?:\s|$)/mg), + systemLibs: findAllUniq(data, /^\s*cordova\.system\.library\.\d+=(.*)(?:\s|$)/mg) + }; +}; + +StudioBuilder.prototype.extractRealProjectNameFromManifest = function () { + var manifestPath = path.join(this.root, 'app', 'src', 'main', 'AndroidManifest.xml'); + var manifestData = fs.readFileSync(manifestPath, 'utf8'); + var m = /= 0) { + return check_reqs.check_android_target(error).then(function () { + // If due to some odd reason - check_android_target succeeds + // we should still fail here. + return Q.reject(error); + }); + } + return Q.reject(error); + }); +}; + +StudioBuilder.prototype.clean = function (opts) { + var builder = this; + var wrapper = path.join(this.root, 'gradlew'); + var args = builder.getArgs('clean', opts); + return Q().then(function () { + return spawn(wrapper, args, {stdio: 'inherit'}); + }) + .then(function () { + shell.rm('-rf', path.join(builder.root, 'out')); + + ['debug', 'release'].forEach(function (config) { + var propertiesFilePath = path.join(builder.root, config + SIGNING_PROPERTIES); + if (isAutoGenerated(propertiesFilePath)) { + shell.rm('-f', propertiesFilePath); + } + }); + }); +}; + +module.exports = StudioBuilder; + +function isAutoGenerated (file) { + return fs.existsSync(file) && fs.readFileSync(file, 'utf8').indexOf(MARKER) > 0; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/builders/builders.js b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/builders.js new file mode 100644 index 0000000..aedf9be --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/builders/builders.js @@ -0,0 +1,46 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var CordovaError = require('cordova-common').CordovaError; + +var knownBuilders = { + gradle: 'GradleBuilder', + studio: 'StudioBuilder', + none: 'GenericBuilder' +}; + +/** + * Helper method that instantiates and returns a builder for specified build + * type. + * + * @param {String} builderType Builder name to construct and return. Must + * be one of 'ant', 'gradle' or 'none' + * + * @return {Builder} A builder instance for specified build type. + */ +module.exports.getBuilder = function (builderType, projectRoot) { + if (!knownBuilders[builderType]) { throw new CordovaError('Builder ' + builderType + ' is not supported.'); } + + try { + var Builder = require('./' + knownBuilders[builderType]); + return new Builder(projectRoot); + } catch (err) { + throw new CordovaError('Failed to instantiate ' + knownBuilders[builderType] + ' builder: ' + err); + } +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/check_reqs.js b/asciiblaster-cordoba/platforms/android/cordova/lib/check_reqs.js new file mode 100644 index 0000000..d9c5f99 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/check_reqs.js @@ -0,0 +1,424 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 sub:true */ + +var shelljs = require('shelljs'); +var child_process = require('child_process'); +var Q = require('q'); +var path = require('path'); +var fs = require('fs'); +var os = require('os'); +var REPO_ROOT = path.join(__dirname, '..', '..', '..', '..'); +var PROJECT_ROOT = path.join(__dirname, '..', '..'); +var CordovaError = require('cordova-common').CordovaError; +var superspawn = require('cordova-common').superspawn; +var android_sdk = require('./android_sdk'); + +function forgivingWhichSync (cmd) { + try { + return fs.realpathSync(shelljs.which(cmd)); + } catch (e) { + return ''; + } +} + +module.exports.isWindows = function () { + return (os.platform() === 'win32'); +}; + +module.exports.isDarwin = function () { + return (os.platform() === 'darwin'); +}; + +// Get valid target from framework/project.properties if run from this repo +// Otherwise get target from project.properties file within a generated cordova-android project +module.exports.get_target = function () { + function extractFromFile (filePath) { + var target = shelljs.grep(/\btarget=/, filePath); + if (!target) { + throw new Error('Could not find android target within: ' + filePath); + } + return target.split('=')[1].trim(); + } + var repo_file = path.join(REPO_ROOT, 'framework', 'project.properties'); + if (fs.existsSync(repo_file)) { + return extractFromFile(repo_file); + } + var project_file = path.join(PROJECT_ROOT, 'project.properties'); + if (fs.existsSync(project_file)) { + // if no target found, we're probably in a project and project.properties is in PROJECT_ROOT. + return extractFromFile(project_file); + } + throw new Error('Could not find android target in either ' + repo_file + ' nor ' + project_file); +}; + +// Returns a promise. Called only by build and clean commands. +module.exports.check_ant = function () { + return superspawn.spawn('ant', ['-version']).then(function (output) { + // Parse Ant version from command output + return /version ((?:\d+\.)+(?:\d+))/i.exec(output)[1]; + }).catch(function (err) { + if (err) { + throw new CordovaError('Failed to run `ant -version`. Make sure you have `ant` on your $PATH.'); + } + }); +}; + +module.exports.get_gradle_wrapper = function () { + var androidStudioPath; + var i = 0; + var foundStudio = false; + var program_dir; + // OK, This hack only works on Windows, not on Mac OS or Linux. We will be deleting this eventually! + if (module.exports.isWindows()) { + + var result = child_process.spawnSync(path.join(__dirname, 'getASPath.bat')); + // console.log('result.stdout =' + result.stdout.toString()); + // console.log('result.stderr =' + result.stderr.toString()); + + if (result.stderr.toString().length > 0) { + var androidPath = path.join(process.env['ProgramFiles'], 'Android') + '/'; + if (fs.existsSync(androidPath)) { + program_dir = fs.readdirSync(androidPath); + while (i < program_dir.length && !foundStudio) { + if (program_dir[i].startsWith('Android Studio')) { + foundStudio = true; + androidStudioPath = path.join(process.env['ProgramFiles'], 'Android', program_dir[i], 'gradle'); + } else { ++i; } + } + } + } else { + // console.log('got android studio path from registry'); + // remove the (os independent) new line char at the end of stdout + // add gradle to match the above. + androidStudioPath = path.join(result.stdout.toString().split('\r\n')[0], 'gradle'); + } + } + + if (androidStudioPath !== null && fs.existsSync(androidStudioPath)) { + var dirs = fs.readdirSync(androidStudioPath); + if (dirs[0].split('-')[0] === 'gradle') { + return path.join(androidStudioPath, dirs[0], 'bin', 'gradle'); + } + } else { + // OK, let's try to check for Gradle! + return forgivingWhichSync('gradle'); + } +}; + +// Returns a promise. Called only by build and clean commands. +module.exports.check_gradle = function () { + var sdkDir = process.env['ANDROID_HOME']; + var d = Q.defer(); + if (!sdkDir) { + return Q.reject(new CordovaError('Could not find gradle wrapper within Android SDK. Could not find Android SDK directory.\n' + + 'Might need to install Android SDK or set up \'ANDROID_HOME\' env variable.')); + } + + var gradlePath = module.exports.get_gradle_wrapper(); + if (gradlePath.length !== 0) { d.resolve(gradlePath); } else { + d.reject(new CordovaError('Could not find an installed version of Gradle either in Android Studio,\n' + + 'or on your system to install the gradle wrapper. Please include gradle \n' + + 'in your path, or install Android Studio')); + } + return d.promise; +}; + +// Returns a promise. +module.exports.check_java = function () { + var javacPath = forgivingWhichSync('javac'); + var hasJavaHome = !!process.env['JAVA_HOME']; + return Q().then(function () { + if (hasJavaHome) { + // Windows java installer doesn't add javac to PATH, nor set JAVA_HOME (ugh). + if (!javacPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['JAVA_HOME'], 'bin'); + } + } else { + if (javacPath) { + // OS X has a command for finding JAVA_HOME. + var find_java = '/usr/libexec/java_home'; + var default_java_error_msg = 'Failed to find \'JAVA_HOME\' environment variable. Try setting it manually.'; + if (fs.existsSync(find_java)) { + return superspawn.spawn(find_java).then(function (stdout) { + process.env['JAVA_HOME'] = stdout.trim(); + }).catch(function (err) { + if (err) { + throw new CordovaError(default_java_error_msg); + } + }); + } else { + // See if we can derive it from javac's location. + // fs.realpathSync is require on Ubuntu, which symplinks from /usr/bin -> JDK + var maybeJavaHome = path.dirname(path.dirname(javacPath)); + if (fs.existsSync(path.join(maybeJavaHome, 'lib', 'tools.jar'))) { + process.env['JAVA_HOME'] = maybeJavaHome; + } else { + throw new CordovaError(default_java_error_msg); + } + } + } else if (module.exports.isWindows()) { + // Try to auto-detect java in the default install paths. + var oldSilent = shelljs.config.silent; + shelljs.config.silent = true; + var firstJdkDir = + shelljs.ls(process.env['ProgramFiles'] + '\\java\\jdk*')[0] || + shelljs.ls('C:\\Program Files\\java\\jdk*')[0] || + shelljs.ls('C:\\Program Files (x86)\\java\\jdk*')[0]; + shelljs.config.silent = oldSilent; + if (firstJdkDir) { + // shelljs always uses / in paths. + firstJdkDir = firstJdkDir.replace(/\//g, path.sep); + if (!javacPath) { + process.env['PATH'] += path.delimiter + path.join(firstJdkDir, 'bin'); + } + process.env['JAVA_HOME'] = firstJdkDir; + } + } + } + }).then(function () { + return Q.denodeify(child_process.exec)('javac -version') + .then(outputs => { + // outputs contains two entries: stdout and stderr + // Java <= 8 writes version info to stderr, Java >= 9 to stdout + const output = outputs.join('').trim(); + const match = /javac\s+([\d.]+)/i.exec(output); + return match && match[1]; + }, () => { + var msg = + 'Failed to run "javac -version", make sure that you have a JDK installed.\n' + + 'You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.\n'; + if (process.env['JAVA_HOME']) { + msg += 'Your JAVA_HOME is invalid: ' + process.env['JAVA_HOME'] + '\n'; + } + throw new CordovaError(msg); + }); + }); +}; + +// Returns a promise. +module.exports.check_android = function () { + return Q().then(function () { + var androidCmdPath = forgivingWhichSync('android'); + var adbInPath = forgivingWhichSync('adb'); + var avdmanagerInPath = forgivingWhichSync('avdmanager'); + var hasAndroidHome = !!process.env['ANDROID_HOME'] && fs.existsSync(process.env['ANDROID_HOME']); + function maybeSetAndroidHome (value) { + if (!hasAndroidHome && fs.existsSync(value)) { + hasAndroidHome = true; + process.env['ANDROID_HOME'] = value; + } + } + // First ensure ANDROID_HOME is set + // If we have no hints (nothing in PATH), try a few default locations + if (!hasAndroidHome && !androidCmdPath && !adbInPath && !avdmanagerInPath) { + if (module.exports.isWindows()) { + // Android Studio 1.0 installer + maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'sdk')); + maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'sdk')); + // Android Studio pre-1.0 installer + maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'android-studio', 'sdk')); + maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'android-studio', 'sdk')); + // Stand-alone installer + maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'android-sdk')); + maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'android-sdk')); + } else if (module.exports.isDarwin()) { + // Android Studio 1.0 installer + maybeSetAndroidHome(path.join(process.env['HOME'], 'Library', 'Android', 'sdk')); + // Android Studio pre-1.0 installer + maybeSetAndroidHome('/Applications/Android Studio.app/sdk'); + // Stand-alone zip file that user might think to put under /Applications + maybeSetAndroidHome('/Applications/android-sdk-macosx'); + maybeSetAndroidHome('/Applications/android-sdk'); + } + if (process.env['HOME']) { + // Stand-alone zip file that user might think to put under their home directory + maybeSetAndroidHome(path.join(process.env['HOME'], 'android-sdk-macosx')); + maybeSetAndroidHome(path.join(process.env['HOME'], 'android-sdk')); + } + } + if (!hasAndroidHome) { + // If we dont have ANDROID_HOME, but we do have some tools on the PATH, try to infer from the tooling PATH. + var parentDir, grandParentDir; + if (androidCmdPath) { + parentDir = path.dirname(androidCmdPath); + grandParentDir = path.dirname(parentDir); + if (path.basename(parentDir) === 'tools' || fs.existsSync(path.join(grandParentDir, 'tools', 'android'))) { + maybeSetAndroidHome(grandParentDir); + } else { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Detected \'android\' command at ' + parentDir + ' but no \'tools\' directory found near.\n' + + 'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'tools directory.'); + } + } + if (adbInPath) { + parentDir = path.dirname(adbInPath); + grandParentDir = path.dirname(parentDir); + if (path.basename(parentDir) === 'platform-tools') { + maybeSetAndroidHome(grandParentDir); + } else { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Detected \'adb\' command at ' + parentDir + ' but no \'platform-tools\' directory found near.\n' + + 'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'platform-tools directory.'); + } + } + if (avdmanagerInPath) { + parentDir = path.dirname(avdmanagerInPath); + grandParentDir = path.dirname(parentDir); + if (path.basename(parentDir) === 'bin' && path.basename(grandParentDir) === 'tools') { + maybeSetAndroidHome(path.dirname(grandParentDir)); + } else { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Detected \'avdmanager\' command at ' + parentDir + ' but no \'tools' + path.sep + 'bin\' directory found near.\n' + + 'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'tools' + path.sep + 'bin directory.'); + } + } + } + if (!process.env['ANDROID_HOME']) { + throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting it manually.\n' + + 'Failed to find \'android\' command in your \'PATH\'. Try update your \'PATH\' to include path to valid SDK directory.'); + } + if (!fs.existsSync(process.env['ANDROID_HOME'])) { + throw new CordovaError('\'ANDROID_HOME\' environment variable is set to non-existent path: ' + process.env['ANDROID_HOME'] + + '\nTry update it manually to point to valid SDK directory.'); + } + // Next let's make sure relevant parts of the SDK tooling is in our PATH + if (hasAndroidHome && !androidCmdPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools'); + } + if (hasAndroidHome && !adbInPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'platform-tools'); + } + if (hasAndroidHome && !avdmanagerInPath) { + process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools', 'bin'); + } + return hasAndroidHome; + }); +}; + +// TODO: is this actually needed? +module.exports.getAbsoluteAndroidCmd = function () { + var cmd = forgivingWhichSync('android'); + if (cmd.length === 0) { + cmd = forgivingWhichSync('sdkmanager'); + } + if (module.exports.isWindows()) { + return '"' + cmd + '"'; + } + return cmd.replace(/(\s)/g, '\\$1'); +}; + +module.exports.check_android_target = function (originalError) { + // valid_target can look like: + // android-19 + // android-L + // Google Inc.:Google APIs:20 + // Google Inc.:Glass Development Kit Preview:20 + var desired_api_level = module.exports.get_target(); + return android_sdk.list_targets().then(function (targets) { + if (targets.indexOf(desired_api_level) >= 0) { + return targets; + } + var androidCmd = module.exports.getAbsoluteAndroidCmd(); + var msg = 'Please install Android target / API level: "' + desired_api_level + '".\n\n' + + 'Hint: Open the SDK manager by running: ' + androidCmd + '\n' + + 'You will require:\n' + + '1. "SDK Platform" for API level ' + desired_api_level + '\n' + + '2. "Android SDK Platform-tools (latest)\n' + + '3. "Android SDK Build-tools" (latest)'; + if (originalError) { + msg = originalError + '\n' + msg; + } + throw new CordovaError(msg); + }); +}; + +// Returns a promise. +module.exports.run = function () { + return Q.all([this.check_java(), this.check_android()]).then(function (values) { + console.log('ANDROID_HOME=' + process.env['ANDROID_HOME']); + console.log('JAVA_HOME=' + process.env['JAVA_HOME']); + + if (!String(values[0]).startsWith('1.8.')) { + throw new CordovaError('Requirements check failed for JDK 1.8'); + } + + if (!values[1]) { + throw new CordovaError('Requirements check failed for Android SDK'); + } + }); +}; + +/** + * Object thar represents one of requirements for current platform. + * @param {String} id The unique identifier for this requirements. + * @param {String} name The name of requirements. Human-readable field. + * @param {String} version The version of requirement installed. In some cases could be an array of strings + * (for example, check_android_target returns an array of android targets installed) + * @param {Boolean} installed Indicates whether the requirement is installed or not + */ +var Requirement = function (id, name, version, installed) { + this.id = id; + this.name = name; + this.installed = installed || false; + this.metadata = { + version: version + }; +}; + +/** + * Methods that runs all checks one by one and returns a result of checks + * as an array of Requirement objects. This method intended to be used by cordova-lib check_reqs method + * + * @return Promise Array of requirements. Due to implementation, promise is always fulfilled. + */ +module.exports.check_all = function () { + + var requirements = [ + new Requirement('java', 'Java JDK'), + new Requirement('androidSdk', 'Android SDK'), + new Requirement('androidTarget', 'Android target'), + new Requirement('gradle', 'Gradle') + ]; + + var checkFns = [ + this.check_java, + this.check_android, + this.check_android_target, + this.check_gradle + ]; + + // Then execute requirement checks one-by-one + return checkFns.reduce(function (promise, checkFn, idx) { + // Update each requirement with results + var requirement = requirements[idx]; + return promise.then(checkFn).then(function (version) { + requirement.installed = true; + requirement.metadata.version = version; + }, function (err) { + requirement.metadata.reason = err instanceof Error ? err.message : err; + }); + }, Q()).then(function () { + // When chain is completed, return requirements array to upstream API + return requirements; + }); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/device.js b/asciiblaster-cordoba/platforms/android/cordova/lib/device.js new file mode 100644 index 0000000..84b5094 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/device.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var build = require('./build'); +var path = require('path'); +var Adb = require('./Adb'); +var AndroidManifest = require('./AndroidManifest'); +var spawn = require('cordova-common').superspawn.spawn; +var CordovaError = require('cordova-common').CordovaError; +var events = require('cordova-common').events; + +/** + * Returns a promise for the list of the device ID's found + * @param lookHarder When true, try restarting adb if no devices are found. + */ +module.exports.list = function (lookHarder) { + return Adb.devices().then(function (list) { + if (list.length === 0 && lookHarder) { + // adb kill-server doesn't seem to do the trick. + // Could probably find a x-platform version of killall, but I'm not actually + // sure that this scenario even happens on non-OSX machines. + return spawn('killall', ['adb']).then(function () { + events.emit('verbose', 'Restarting adb to see if more devices are detected.'); + return Adb.devices(); + }, function () { + // For non-killall OS's. + return list; + }); + } + return list; + }); +}; + +module.exports.resolveTarget = function (target) { + return this.list(true).then(function (device_list) { + if (!device_list || !device_list.length) { + return Q.reject(new CordovaError('Failed to deploy to device, no devices found.')); + } + // default device + target = target || device_list[0]; + + if (device_list.indexOf(target) < 0) { + return Q.reject('ERROR: Unable to find target \'' + target + '\'.'); + } + + return build.detectArchitecture(target).then(function (arch) { + return { target: target, arch: arch, isEmulator: false }; + }); + }); +}; + +/* + * Installs a previously built application on the device + * and launches it. + * Returns a promise. + */ +module.exports.install = function (target, buildResults) { + return Q().then(function () { + if (target && typeof target === 'object') { + return target; + } + return module.exports.resolveTarget(target); + }).then(function (resolvedTarget) { + var apk_path = build.findBestApkForArchitecture(buildResults, resolvedTarget.arch); + var manifest = new AndroidManifest(path.join(__dirname, '../../app/src/main/AndroidManifest.xml')); + var pkgName = manifest.getPackageId(); + var launchName = pkgName + '/.' + manifest.getActivity().getName(); + events.emit('log', 'Using apk: ' + apk_path); + events.emit('log', 'Package name: ' + pkgName); + + return Adb.install(resolvedTarget.target, apk_path, {replace: true}).catch(function (error) { + // CB-9557 CB-10157 only uninstall and reinstall app if the one that + // is already installed on device was signed w/different certificate + if (!/INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES/.test(error.toString())) { throw error; } + + events.emit('warn', 'Uninstalling app from device and reinstalling it again because the ' + + 'installed app already signed with different key'); + + // This promise is always resolved, even if 'adb uninstall' fails to uninstall app + // or the app doesn't installed at all, so no error catching needed. + return Adb.uninstall(resolvedTarget.target, pkgName).then(function () { + return Adb.install(resolvedTarget.target, apk_path, {replace: true}); + }); + }).then(function () { + // unlock screen + return Adb.shell(resolvedTarget.target, 'input keyevent 82'); + }).then(function () { + return Adb.start(resolvedTarget.target, launchName); + }).then(function () { + events.emit('log', 'LAUNCH SUCCESS'); + }); + }); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/emulator.js b/asciiblaster-cordoba/platforms/android/cordova/lib/emulator.js new file mode 100644 index 0000000..63ed302 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/emulator.js @@ -0,0 +1,534 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 sub:true */ + +var android_versions = require('android-versions'); +var retry = require('./retry'); +var build = require('./build'); +var path = require('path'); +var Adb = require('./Adb'); +var AndroidManifest = require('./AndroidManifest'); +var events = require('cordova-common').events; +var superspawn = require('cordova-common').superspawn; +var CordovaError = require('cordova-common').CordovaError; +var shelljs = require('shelljs'); +var android_sdk = require('./android_sdk'); +var check_reqs = require('./check_reqs'); + +var Q = require('q'); +var os = require('os'); +var fs = require('fs'); +var child_process = require('child_process'); + +// constants +var ONE_SECOND = 1000; // in milliseconds +var ONE_MINUTE = 60 * ONE_SECOND; // in milliseconds +var INSTALL_COMMAND_TIMEOUT = 5 * ONE_MINUTE; // in milliseconds +var NUM_INSTALL_RETRIES = 3; +var CHECK_BOOTED_INTERVAL = 3 * ONE_SECOND; // in milliseconds +var EXEC_KILL_SIGNAL = 'SIGKILL'; + +function forgivingWhichSync (cmd) { + try { + return fs.realpathSync(shelljs.which(cmd)); + } catch (e) { + return ''; + } +} + +module.exports.list_images_using_avdmanager = function () { + return superspawn.spawn('avdmanager', ['list', 'avd']).then(function (output) { + var response = output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Device:\s/)) { + i++; + img_obj['device'] = response[i].split('Device: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Target:\s/)) { + i++; + if (response[i + 1].match(/ABI:\s/)) { + img_obj['abi'] = response[i + 1].split('ABI: ')[1].replace('\r', ''); + } + // This next conditional just aims to match the old output of `android list avd` + // We do so so that we don't have to change the logic when parsing for the + // best emulator target to spawn (see below in `best_image`) + // This allows us to transitionally support both `android` and `avdmanager` binaries, + // depending on what SDK version the user has + if (response[i + 1].match(/Based\son:\s/)) { + img_obj['target'] = response[i + 1].split('Based on:')[1]; + if (img_obj['target'].match(/Tag\/ABI:\s/)) { + img_obj['target'] = img_obj['target'].split('Tag/ABI:')[0].replace('\r', '').trim(); + if (img_obj['target'].indexOf('(') > -1) { + img_obj['target'] = img_obj['target'].substr(0, img_obj['target'].indexOf('(') - 1).trim(); + } + } + var version_string = img_obj['target'].replace(/Android\s+/, ''); + + var api_level = android_sdk.version_string_to_api_level[version_string]; + if (api_level) { + img_obj['target'] += ' (API level ' + api_level + ')'; + } + } + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + } */ + + } + return emulator_list; + }); +}; + +module.exports.list_images_using_android = function () { + return superspawn.spawn('android', ['list', 'avd']).then(function (output) { + var response = output.split('\n'); + var emulator_list = []; + for (var i = 1; i < response.length; i++) { + // To return more detailed information use img_obj + var img_obj = {}; + if (response[i].match(/Name:\s/)) { + img_obj['name'] = response[i].split('Name: ')[1].replace('\r', ''); + if (response[i + 1].match(/Device:\s/)) { + i++; + img_obj['device'] = response[i].split('Device: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Path:\s/)) { + i++; + img_obj['path'] = response[i].split('Path: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/\(API\slevel\s/) || (response[i + 2] && response[i + 2].match(/\(API\slevel\s/))) { + i++; + var secondLine = response[i + 1].match(/\(API\slevel\s/) ? response[i + 1] : ''; + img_obj['target'] = (response[i] + secondLine).split('Target: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/ABI:\s/)) { + i++; + img_obj['abi'] = response[i].split('ABI: ')[1].replace('\r', ''); + } + if (response[i + 1].match(/Skin:\s/)) { + i++; + img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', ''); + } + + emulator_list.push(img_obj); + } + /* To just return a list of names use this + if (response[i].match(/Name:\s/)) { + emulator_list.push(response[i].split('Name: ')[1].replace('\r', ''); + } */ + + } + return emulator_list; + }); +}; + +/** + * Returns a Promise for a list of emulator images in the form of objects + * { + name : , + device : , + path : , + target : , + abi : , + skin : + } + */ +module.exports.list_images = function () { + return Q.fcall(function () { + if (forgivingWhichSync('avdmanager')) { + return module.exports.list_images_using_avdmanager(); + } else if (forgivingWhichSync('android')) { + return module.exports.list_images_using_android(); + } else { + return Q().then(function () { + throw new CordovaError('Could not find either `android` or `avdmanager` on your $PATH! Are you sure the Android SDK is installed and available?'); + }); + } + }).then(function (avds) { + // In case we're missing the Android OS version string from the target description, add it. + return avds.map(function (avd) { + if (avd.target && avd.target.indexOf('Android API') > -1 && avd.target.indexOf('API level') < 0) { + var api_level = avd.target.match(/\d+/); + if (api_level) { + var level = android_versions.get(api_level); + if (level) { + avd.target = 'Android ' + level.semver + ' (API level ' + api_level + ')'; + } + } + } + return avd; + }); + }); +}; + +/** + * Will return the closest avd to the projects target + * or undefined if no avds exist. + * Returns a promise. + */ +module.exports.best_image = function () { + return this.list_images().then(function (images) { + // Just return undefined if there is no images + if (images.length === 0) return; + + var closest = 9999; + var best = images[0]; + var project_target = parseInt(check_reqs.get_target().replace('android-', '')); + for (var i in images) { + var target = images[i].target; + if (target && target.indexOf('API level') > -1) { + var num = parseInt(target.split('(API level ')[1].replace(')', '')); + if (num === project_target) { + return images[i]; + } else if (project_target - num < closest && project_target > num) { + closest = project_target - num; + best = images[i]; + } + } + } + return best; + }); +}; + +// Returns a promise. +module.exports.list_started = function () { + return Adb.devices({emulators: true}); +}; + +// Returns a promise. +// TODO: we should remove this, there's a more robust method under android_sdk.js +module.exports.list_targets = function () { + return superspawn.spawn('android', ['list', 'targets'], {cwd: os.tmpdir()}).then(function (output) { + var target_out = output.split('\n'); + var targets = []; + for (var i = target_out.length; i >= 0; i--) { + if (target_out[i].match(/id:/)) { + targets.push(targets[i].split(' ')[1]); + } + } + return targets; + }); +}; + +/* + * Gets unused port for android emulator, between 5554 and 5584 + * Returns a promise. + */ +module.exports.get_available_port = function () { + var self = this; + + return self.list_started().then(function (emulators) { + for (var p = 5584; p >= 5554; p -= 2) { + if (emulators.indexOf('emulator-' + p) === -1) { + events.emit('verbose', 'Found available port: ' + p); + return p; + } + } + throw new CordovaError('Could not find an available avd port'); + }); +}; + +/* + * Starts an emulator with the given ID, + * and returns the started ID of that emulator. + * If no ID is given it will use the first image available, + * if no image is available it will error out (maybe create one?). + * If no boot timeout is given or the value is negative it will wait forever for + * the emulator to boot + * + * Returns a promise. + */ +module.exports.start = function (emulator_ID, boot_timeout) { + var self = this; + + return Q().then(function () { + if (emulator_ID) return Q(emulator_ID); + + return self.best_image().then(function (best) { + if (best && best.name) { + events.emit('warn', 'No emulator specified, defaulting to ' + best.name); + return best.name; + } + + var androidCmd = check_reqs.getAbsoluteAndroidCmd(); + return Q.reject(new CordovaError('No emulator images (avds) found.\n' + + '1. Download desired System Image by running: ' + androidCmd + ' sdk\n' + + '2. Create an AVD by running: ' + androidCmd + ' avd\n' + + 'HINT: For a faster emulator, use an Intel System Image and install the HAXM device driver\n')); + }); + }).then(function (emulatorId) { + return self.get_available_port().then(function (port) { + // Figure out the directory the emulator binary runs in, and set the cwd to that directory. + // Workaround for https://code.google.com/p/android/issues/detail?id=235461 + var emulator_dir = path.dirname(shelljs.which('emulator')); + var args = ['-avd', emulatorId, '-port', port]; + // Don't wait for it to finish, since the emulator will probably keep running for a long time. + child_process + .spawn('emulator', args, { stdio: 'inherit', detached: true, cwd: emulator_dir }) + .unref(); + + // wait for emulator to start + events.emit('log', 'Waiting for emulator to start...'); + return self.wait_for_emulator(port); + }); + }).then(function (emulatorId) { + if (!emulatorId) { return Q.reject(new CordovaError('Failed to start emulator')); } + + // wait for emulator to boot up + process.stdout.write('Waiting for emulator to boot (this may take a while)...'); + return self.wait_for_boot(emulatorId, boot_timeout).then(function (success) { + if (success) { + events.emit('log', 'BOOT COMPLETE'); + // unlock screen + return Adb.shell(emulatorId, 'input keyevent 82').then(function () { + // return the new emulator id for the started emulators + return emulatorId; + }); + } else { + // We timed out waiting for the boot to happen + return null; + } + }); + }); +}; + +/* + * Waits for an emulator to boot on a given port. + * Returns this emulator's ID in a promise. + */ +module.exports.wait_for_emulator = function (port) { + var self = this; + return Q().then(function () { + var emulator_id = 'emulator-' + port; + return Adb.shell(emulator_id, 'getprop dev.bootcomplete').then(function (output) { + if (output.indexOf('1') >= 0) { + return emulator_id; + } + return self.wait_for_emulator(port); + }, function (error) { + if ((error && error.message && + (error.message.indexOf('not found') > -1)) || + (error.message.indexOf('device offline') > -1) || + (error.message.indexOf('device still connecting') > -1)) { + // emulator not yet started, continue waiting + return self.wait_for_emulator(port); + } else { + // something unexpected has happened + throw error; + } + }); + }); +}; + +/* + * Waits for the core android process of the emulator to start. Returns a + * promise that resolves to a boolean indicating success. Not specifying a + * time_remaining or passing a negative value will cause it to wait forever + */ +module.exports.wait_for_boot = function (emulator_id, time_remaining) { + var self = this; + return Adb.shell(emulator_id, 'ps').then(function (output) { + if (output.match(/android\.process\.acore/)) { + return true; + } else if (time_remaining === 0) { + return false; + } else { + process.stdout.write('.'); + + // Check at regular intervals + return Q.delay(time_remaining < CHECK_BOOTED_INTERVAL ? time_remaining : CHECK_BOOTED_INTERVAL).then(function () { + var updated_time = time_remaining >= 0 ? Math.max(time_remaining - CHECK_BOOTED_INTERVAL, 0) : time_remaining; + return self.wait_for_boot(emulator_id, updated_time); + }); + } + }); +}; + +/* + * Create avd + * TODO : Enter the stdin input required to complete the creation of an avd. + * Returns a promise. + */ +module.exports.create_image = function (name, target) { + console.log('Creating new avd named ' + name); + if (target) { + return superspawn.spawn('android', ['create', 'avd', '--name', name, '--target', target]).then(null, function (error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(' Do you have the latest android targets including ' + target + '?'); + console.error(error); + }); + } else { + console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.'); + // TODO: there's a more robust method for finding targets in android_sdk.js + return superspawn.spawn('android', ['create', 'avd', '--name', name, '--target', this.list_targets()[0]]).then(function () { + // TODO: This seems like another error case, even though it always happens. + console.error('ERROR : Unable to create an avd emulator, no targets found.'); + console.error('Ensure you have targets available by running the "android" command'); + return Q.reject(); + }, function (error) { + console.error('ERROR : Failed to create emulator image : '); + console.error(error); + }); + } +}; + +module.exports.resolveTarget = function (target) { + return this.list_started().then(function (emulator_list) { + if (emulator_list.length < 1) { + return Q.reject('No running Android emulators found, please start an emulator before deploying your project.'); + } + + // default emulator + target = target || emulator_list[0]; + if (emulator_list.indexOf(target) < 0) { + return Q.reject('Unable to find target \'' + target + '\'. Failed to deploy to emulator.'); + } + + return build.detectArchitecture(target).then(function (arch) { + return {target: target, arch: arch, isEmulator: true}; + }); + }); +}; + +/* + * Installs a previously built application on the emulator and launches it. + * If no target is specified, then it picks one. + * If no started emulators are found, error out. + * Returns a promise. + */ +module.exports.install = function (givenTarget, buildResults) { + + var target; + // We need to find the proper path to the Android Manifest + var manifestPath = path.join(__dirname, '..', '..', 'app', 'src', 'main', 'AndroidManifest.xml'); + if (buildResults.buildMethod === 'gradle') { + manifestPath = path.join(__dirname, '../../AndroidManifest.xml'); + } + var manifest = new AndroidManifest(manifestPath); + var pkgName = manifest.getPackageId(); + + // resolve the target emulator + return Q().then(function () { + if (givenTarget && typeof givenTarget === 'object') { + return givenTarget; + } else { + return module.exports.resolveTarget(givenTarget); + } + + // set the resolved target + }).then(function (resolvedTarget) { + target = resolvedTarget; + + // install the app + }).then(function () { + // This promise is always resolved, even if 'adb uninstall' fails to uninstall app + // or the app doesn't installed at all, so no error catching needed. + return Q.when().then(function () { + + var apk_path = build.findBestApkForArchitecture(buildResults, target.arch); + var execOptions = { + cwd: os.tmpdir(), + timeout: INSTALL_COMMAND_TIMEOUT, // in milliseconds + killSignal: EXEC_KILL_SIGNAL + }; + + events.emit('log', 'Using apk: ' + apk_path); + events.emit('log', 'Package name: ' + pkgName); + events.emit('verbose', 'Installing app on emulator...'); + + // A special function to call adb install in specific environment w/ specific options. + // Introduced as a part of fix for http://issues.apache.org/jira/browse/CB-9119 + // to workaround sporadic emulator hangs + function adbInstallWithOptions (target, apk, opts) { + events.emit('verbose', 'Installing apk ' + apk + ' on ' + target + '...'); + + var command = 'adb -s ' + target + ' install -r "' + apk + '"'; + return Q.promise(function (resolve, reject) { + child_process.exec(command, opts, function (err, stdout, stderr) { + if (err) reject(new CordovaError('Error executing "' + command + '": ' + stderr)); + // adb does not return an error code even if installation fails. Instead it puts a specific + // message to stdout, so we have to use RegExp matching to detect installation failure. + else if (/Failure/.test(stdout)) { + if (stdout.match(/INSTALL_PARSE_FAILED_NO_CERTIFICATES/)) { + stdout += 'Sign the build using \'-- --keystore\' or \'--buildConfig\'' + + ' or sign and deploy the unsigned apk manually using Android tools.'; + } else if (stdout.match(/INSTALL_FAILED_VERSION_DOWNGRADE/)) { + stdout += 'You\'re trying to install apk with a lower versionCode that is already installed.' + + '\nEither uninstall an app or increment the versionCode.'; + } + + reject(new CordovaError('Failed to install apk to emulator: ' + stdout)); + } else resolve(stdout); + }); + }); + } + + function installPromise () { + return adbInstallWithOptions(target.target, apk_path, execOptions).catch(function (error) { + // CB-9557 CB-10157 only uninstall and reinstall app if the one that + // is already installed on device was signed w/different certificate + if (!/INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES/.test(error.toString())) { throw error; } + + events.emit('warn', 'Uninstalling app from device and reinstalling it because the ' + + 'currently installed app was signed with different key'); + + // This promise is always resolved, even if 'adb uninstall' fails to uninstall app + // or the app doesn't installed at all, so no error catching needed. + return Adb.uninstall(target.target, pkgName).then(function () { + return adbInstallWithOptions(target.target, apk_path, execOptions); + }); + }); + } + + return retry.retryPromise(NUM_INSTALL_RETRIES, installPromise).then(function (output) { + events.emit('log', 'INSTALL SUCCESS'); + }); + }); + // unlock screen + }).then(function () { + + events.emit('verbose', 'Unlocking screen...'); + return Adb.shell(target.target, 'input keyevent 82'); + }).then(function () { + Adb.start(target.target, pkgName + '/.' + manifest.getActivity().getName()); + // report success or failure + }).then(function (output) { + events.emit('log', 'LAUNCH SUCCESS'); + }); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/getASPath.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/getASPath.bat new file mode 100644 index 0000000..14dad43 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/getASPath.bat @@ -0,0 +1,3 @@ +@ECHO OFF +for /f "tokens=2*" %%a in ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Android Studio" /v Path') do set "ASPath=%%~b" +ECHO %ASPath% \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/install-device b/asciiblaster-cordoba/platforms/android/cordova/lib/install-device new file mode 100644 index 0000000..fc4b784 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/install-device @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var device = require('./device'), + args = process.argv; + +if(args.length > 2) { + var install_target; + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + device.install(install_target).done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} else { + device.install().done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/install-device.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/install-device.bat new file mode 100644 index 0000000..109b470 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/install-device.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0install-device" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'install-device' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator b/asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator new file mode 100644 index 0000000..aa2a34f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +var install_target; +if(args.length > 2) { + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} + +emulator.install(install_target).done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator.bat new file mode 100644 index 0000000..a28c23a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/install-emulator.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0install-emulator" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'install-emulator' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/list-devices b/asciiblaster-cordoba/platforms/android/cordova/lib/list-devices new file mode 100644 index 0000000..8e22c7f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/list-devices @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var devices = require('./device'); + +// Usage support for when args are given +require('./check_reqs').check_android().then(function() { + devices.list().done(function(device_list) { + device_list && device_list.forEach(function(dev) { + console.log(dev); + }); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/list-devices.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/list-devices.bat new file mode 100644 index 0000000..ad5f03e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/list-devices.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0list-devices" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'list-devices' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images b/asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images new file mode 100644 index 0000000..25e5c81 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +require('./check_reqs').check_android().then(function() { + emulators.list_images().done(function(emulator_list) { + emulator_list && emulator_list.forEach(function(emu) { + console.log(emu.name); + }); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images.bat new file mode 100644 index 0000000..616ffb7 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/list-emulator-images.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0list-emulator-images" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'list-emulator-images' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators b/asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators new file mode 100644 index 0000000..43ebda2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var emulators = require('./emulator'); + +// Usage support for when args are given +require('./check_reqs').check_android().then(function() { + emulators.list_started().done(function(emulator_list) { + emulator_list && emulator_list.forEach(function(emu) { + console.log(emu); + }); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators.bat new file mode 100644 index 0000000..eed02a5 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/list-started-emulators.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0list-started-emulators" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'list-started-emulators' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/log.js b/asciiblaster-cordoba/platforms/android/cordova/lib/log.js new file mode 100644 index 0000000..ef2dd5c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/log.js @@ -0,0 +1,56 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var path = require('path'); +var os = require('os'); +var Q = require('q'); +var child_process = require('child_process'); +var ROOT = path.join(__dirname, '..', '..'); + +/* + * Starts running logcat in the shell. + * Returns a promise. + */ +module.exports.run = function () { + var d = Q.defer(); + var adb = child_process.spawn('adb', ['logcat'], {cwd: os.tmpdir()}); + + adb.stdout.on('data', function (data) { + var lines = data ? data.toString().split('\n') : []; + var out = lines.filter(function (x) { return x.indexOf('nativeGetEnabledTags') < 0; }); + console.log(out.join('\n')); + }); + + adb.stderr.on('data', console.error); + adb.on('close', function (code) { + if (code > 0) { + d.reject('Failed to run logcat command.'); + } else d.resolve(); + }); + + return d.promise; +}; + +module.exports.help = function () { + console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'cordova', 'log'))); + console.log('Gives the logcat output on the command line.'); + process.exit(0); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/plugin-build.gradle b/asciiblaster-cordoba/platforms/android/cordova/lib/plugin-build.gradle new file mode 100644 index 0000000..fdef1f7 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/plugin-build.gradle @@ -0,0 +1,72 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +// GENERATED FILE! DO NOT EDIT! + +buildscript { + repositories { + maven { + url "https://maven.google.com" + } + jcenter() + } + + // Switch the Android Gradle plugin version requirement depending on the + // installed version of Gradle. This dependency is documented at + // http://tools.android.com/tech-docs/new-build-system/version-compatibility + // and https://issues.apache.org/jira/browse/CB-8143 + dependencies { + classpath 'com.android.tools.build:gradle:1.0.0+' + } +} + +apply plugin: 'com.android.library' + +dependencies { + compile fileTree(dir: 'libs', include: '*.jar') + debugCompile project(path: ":CordovaLib", configuration: "debug") + releaseCompile project(path: ":CordovaLib", configuration: "release") +} + +android { + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + publishNonDefault true + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_6 + targetCompatibility JavaVersion.VERSION_1_6 + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } +} + +if (file('build-extras.gradle').exists()) { + apply from: 'build-extras.gradle' +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/pluginHandlers.js b/asciiblaster-cordoba/platforms/android/cordova/lib/pluginHandlers.js new file mode 100644 index 0000000..aaee3b3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/pluginHandlers.js @@ -0,0 +1,345 @@ +/* + * 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 unused: vars */ + +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var events = require('cordova-common').events; +var CordovaError = require('cordova-common').CordovaError; + +var handlers = { + 'source-file': { + install: function (obj, plugin, project, options) { + if (!obj.src) throw new CordovaError(generateAttributeError('src', 'source-file', plugin.id)); + if (!obj.targetDir) throw new CordovaError(generateAttributeError('target-dir', 'source-file', plugin.id)); + + var dest = path.join(obj.targetDir, path.basename(obj.src)); + + // TODO: This code needs to be replaced, since the core plugins need to be re-mapped to a different location in + // a later plugins release. This is for legacy plugins to work with Cordova. + + if (options && options.android_studio === true) { + dest = getInstallDestination(obj); + } + + if (options && options.force) { + copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + } else { + copyNewFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + } + }, + uninstall: function (obj, plugin, project, options) { + var dest = path.join(obj.targetDir, path.basename(obj.src)); + + if (options && options.android_studio === true) { + dest = getInstallDestination(obj); + } + + // TODO: Add Koltin extension to uninstall, since they are handled like Java files + if (obj.src.endsWith('java')) { + deleteJava(project.projectDir, dest); + } else { + // Just remove the file, not the whole parent directory + removeFile(project.projectDir, dest); + } + } + }, + 'lib-file': { + install: function (obj, plugin, project, options) { + var dest = path.join('libs', path.basename(obj.src)); + if (options && options.android_studio === true) { + dest = path.join('app/libs', path.basename(obj.src)); + } + copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + }, + uninstall: function (obj, plugin, project, options) { + var dest = path.join('libs', path.basename(obj.src)); + if (options && options.android_studio === true) { + dest = path.join('app/libs', path.basename(obj.src)); + } + removeFile(project.projectDir, dest); + } + }, + 'resource-file': { + install: function (obj, plugin, project, options) { + var dest = path.normalize(obj.target); + if (options && options.android_studio === true) { + dest = path.join('app/src/main', dest); + } + copyFile(plugin.dir, obj.src, project.projectDir, dest, !!(options && options.link)); + }, + uninstall: function (obj, plugin, project, options) { + var dest = path.normalize(obj.target); + if (options && options.android_studio === true) { + dest = path.join('app/src/main', dest); + } + removeFile(project.projectDir, dest); + } + }, + 'framework': { + install: function (obj, plugin, project, options) { + var src = obj.src; + if (!src) throw new CordovaError(generateAttributeError('src', 'framework', plugin.id)); + + events.emit('verbose', 'Installing Android library: ' + src); + var parentDir = obj.parent ? path.resolve(project.projectDir, obj.parent) : project.projectDir; + var subDir; + + if (obj.custom) { + var subRelativeDir = project.getCustomSubprojectRelativeDir(plugin.id, src); + copyNewFile(plugin.dir, src, project.projectDir, subRelativeDir, !!(options && options.link)); + subDir = path.resolve(project.projectDir, subRelativeDir); + } else { + obj.type = 'sys'; + subDir = src; + } + + if (obj.type === 'gradleReference') { + project.addGradleReference(parentDir, subDir); + } else if (obj.type === 'sys') { + project.addSystemLibrary(parentDir, subDir); + } else { + project.addSubProject(parentDir, subDir); + } + }, + uninstall: function (obj, plugin, project, options) { + var src = obj.src; + if (!src) throw new CordovaError(generateAttributeError('src', 'framework', plugin.id)); + + events.emit('verbose', 'Uninstalling Android library: ' + src); + var parentDir = obj.parent ? path.resolve(project.projectDir, obj.parent) : project.projectDir; + var subDir; + + if (obj.custom) { + var subRelativeDir = project.getCustomSubprojectRelativeDir(plugin.id, src); + removeFile(project.projectDir, subRelativeDir); + subDir = path.resolve(project.projectDir, subRelativeDir); + // If it's the last framework in the plugin, remove the parent directory. + var parDir = path.dirname(subDir); + if (fs.existsSync(parDir) && fs.readdirSync(parDir).length === 0) { + fs.rmdirSync(parDir); + } + } else { + obj.type = 'sys'; + subDir = src; + } + + if (obj.type === 'gradleReference') { + project.removeGradleReference(parentDir, subDir); + } else if (obj.type === 'sys') { + project.removeSystemLibrary(parentDir, subDir); + } else { + project.removeSubProject(parentDir, subDir); + } + } + }, + asset: { + install: function (obj, plugin, project, options) { + if (!obj.src) { + throw new CordovaError(generateAttributeError('src', 'asset', plugin.id)); + } + if (!obj.target) { + throw new CordovaError(generateAttributeError('target', 'asset', plugin.id)); + } + + copyFile(plugin.dir, obj.src, project.www, obj.target); + if (options && options.usePlatformWww) { + // CB-11022 copy file to both directories if usePlatformWww is specified + copyFile(plugin.dir, obj.src, project.platformWww, obj.target); + } + }, + uninstall: function (obj, plugin, project, options) { + var target = obj.target || obj.src; + + if (!target) throw new CordovaError(generateAttributeError('target', 'asset', plugin.id)); + + removeFileF(path.resolve(project.www, target)); + removeFileF(path.resolve(project.www, 'plugins', plugin.id)); + if (options && options.usePlatformWww) { + // CB-11022 remove file from both directories if usePlatformWww is specified + removeFileF(path.resolve(project.platformWww, target)); + removeFileF(path.resolve(project.platformWww, 'plugins', plugin.id)); + } + } + }, + 'js-module': { + install: function (obj, plugin, project, options) { + // Copy the plugin's files into the www directory. + var moduleSource = path.resolve(plugin.dir, obj.src); + var moduleName = plugin.id + '.' + (obj.name || path.basename(obj.src, path.extname(obj.src))); + + // Read in the file, prepend the cordova.define, and write it back out. + var scriptContent = fs.readFileSync(moduleSource, 'utf-8').replace(/^\ufeff/, ''); // Window BOM + if (moduleSource.match(/.*\.json$/)) { + scriptContent = 'module.exports = ' + scriptContent; + } + scriptContent = 'cordova.define("' + moduleName + '", function(require, exports, module) {\n' + scriptContent + '\n});\n'; + + var wwwDest = path.resolve(project.www, 'plugins', plugin.id, obj.src); + shell.mkdir('-p', path.dirname(wwwDest)); + fs.writeFileSync(wwwDest, scriptContent, 'utf-8'); + + if (options && options.usePlatformWww) { + // CB-11022 copy file to both directories if usePlatformWww is specified + var platformWwwDest = path.resolve(project.platformWww, 'plugins', plugin.id, obj.src); + shell.mkdir('-p', path.dirname(platformWwwDest)); + fs.writeFileSync(platformWwwDest, scriptContent, 'utf-8'); + } + }, + uninstall: function (obj, plugin, project, options) { + var pluginRelativePath = path.join('plugins', plugin.id, obj.src); + removeFileAndParents(project.www, pluginRelativePath); + if (options && options.usePlatformWww) { + // CB-11022 remove file from both directories if usePlatformWww is specified + removeFileAndParents(project.platformWww, pluginRelativePath); + } + } + } +}; + +module.exports.getInstaller = function (type) { + if (handlers[type] && handlers[type].install) { + return handlers[type].install; + } + + events.emit('verbose', '<' + type + '> is not supported for android plugins'); +}; + +module.exports.getUninstaller = function (type) { + if (handlers[type] && handlers[type].uninstall) { + return handlers[type].uninstall; + } + + events.emit('verbose', '<' + type + '> is not supported for android plugins'); +}; + +function copyFile (plugin_dir, src, project_dir, dest, link) { + src = path.resolve(plugin_dir, src); + if (!fs.existsSync(src)) throw new CordovaError('"' + src + '" not found!'); + + // check that src path is inside plugin directory + var real_path = fs.realpathSync(src); + var real_plugin_path = fs.realpathSync(plugin_dir); + if (real_path.indexOf(real_plugin_path) !== 0) { throw new CordovaError('File "' + src + '" is located outside the plugin directory "' + plugin_dir + '"'); } + + dest = path.resolve(project_dir, dest); + + // check that dest path is located in project directory + if (dest.indexOf(project_dir) !== 0) { throw new CordovaError('Destination "' + dest + '" for source file "' + src + '" is located outside the project'); } + + shell.mkdir('-p', path.dirname(dest)); + if (link) { + symlinkFileOrDirTree(src, dest); + } else if (fs.statSync(src).isDirectory()) { + // XXX shelljs decides to create a directory when -R|-r is used which sucks. http://goo.gl/nbsjq + shell.cp('-Rf', src + '/*', dest); + } else { + shell.cp('-f', src, dest); + } +} + +// Same as copy file but throws error if target exists +function copyNewFile (plugin_dir, src, project_dir, dest, link) { + var target_path = path.resolve(project_dir, dest); + if (fs.existsSync(target_path)) { throw new CordovaError('"' + target_path + '" already exists!'); } + + copyFile(plugin_dir, src, project_dir, dest, !!link); +} + +function symlinkFileOrDirTree (src, dest) { + if (fs.existsSync(dest)) { + shell.rm('-Rf', dest); + } + + if (fs.statSync(src).isDirectory()) { + shell.mkdir('-p', dest); + fs.readdirSync(src).forEach(function (entry) { + symlinkFileOrDirTree(path.join(src, entry), path.join(dest, entry)); + }); + } else { + fs.symlinkSync(path.relative(fs.realpathSync(path.dirname(dest)), src), dest); + } +} + +// checks if file exists and then deletes. Error if doesn't exist +function removeFile (project_dir, src) { + var file = path.resolve(project_dir, src); + shell.rm('-Rf', file); +} + +// deletes file/directory without checking +function removeFileF (file) { + shell.rm('-Rf', file); +} + +// Sometimes we want to remove some java, and prune any unnecessary empty directories +function deleteJava (project_dir, destFile) { + removeFileAndParents(project_dir, destFile, 'src'); +} + +function removeFileAndParents (baseDir, destFile, stopper) { + stopper = stopper || '.'; + var file = path.resolve(baseDir, destFile); + if (!fs.existsSync(file)) return; + + removeFileF(file); + + // check if directory is empty + var curDir = path.dirname(file); + + while (curDir !== path.resolve(baseDir, stopper)) { + if (fs.existsSync(curDir) && fs.readdirSync(curDir).length === 0) { + fs.rmdirSync(curDir); + curDir = path.resolve(curDir, '..'); + } else { + // directory not empty...do nothing + break; + } + } +} + +function generateAttributeError (attribute, element, id) { + return 'Required attribute "' + attribute + '" not specified in <' + element + '> element from plugin: ' + id; +} + +function getInstallDestination (obj) { + var APP_MAIN_PREFIX = 'app/src/main'; + + if (obj.targetDir.includes('app')) { + // If any source file is using the new app directory structure, + // don't penalize it + return path.join(obj.targetDir, path.basename(obj.src)); + } else if (obj.src.endsWith('.java')) { + return path.join(APP_MAIN_PREFIX, 'java', obj.targetDir.substring(4), path.basename(obj.src)); + } else if (obj.src.endsWith('.aidl')) { + return path.join(APP_MAIN_PREFIX, 'aidl', obj.targetDir.substring(4), path.basename(obj.src)); + } else if (obj.targetDir.includes('libs')) { + if (obj.src.endsWith('.so')) { + return path.join(APP_MAIN_PREFIX, 'jniLibs', obj.targetDir.substring(5), path.basename(obj.src)); + } else { + return path.join('app', obj.targetDir, path.basename(obj.src)); + } + } else if (obj.targetDir.includes('src/main')) { + return path.join('app', obj.targetDir, path.basename(obj.src)); + } else { + // For all other source files not using the new app directory structure, + // add 'app/src/main' to the targetDir + return path.join(APP_MAIN_PREFIX, obj.targetDir, path.basename(obj.src)); + } + +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/prepare.js b/asciiblaster-cordoba/platforms/android/cordova/lib/prepare.js new file mode 100644 index 0000000..ac63f8a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/prepare.js @@ -0,0 +1,480 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +/* eslint no-useless-escape: 0 */ + +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var events = require('cordova-common').events; +var AndroidManifest = require('./AndroidManifest'); +var checkReqs = require('./check_reqs'); +var xmlHelpers = require('cordova-common').xmlHelpers; +var CordovaError = require('cordova-common').CordovaError; +var ConfigParser = require('cordova-common').ConfigParser; +var FileUpdater = require('cordova-common').FileUpdater; +var PlatformJson = require('cordova-common').PlatformJson; +var PlatformMunger = require('cordova-common').ConfigChanges.PlatformMunger; +var PluginInfoProvider = require('cordova-common').PluginInfoProvider; + +module.exports.prepare = function (cordovaProject, options) { + var self = this; + + var platformJson = PlatformJson.load(this.locations.root, this.platform); + var munger = new PlatformMunger(this.platform, this.locations.root, platformJson, new PluginInfoProvider()); + + this._config = updateConfigFilesFrom(cordovaProject.projectConfig, munger, this.locations); + + // Update own www dir with project's www assets and plugins' assets and js-files + return Q.when(updateWww(cordovaProject, this.locations)).then(function () { + // update project according to config.xml changes. + return updateProjectAccordingTo(self._config, self.locations); + }).then(function () { + updateIcons(cordovaProject, path.relative(cordovaProject.root, self.locations.res)); + updateSplashes(cordovaProject, path.relative(cordovaProject.root, self.locations.res)); + updateFileResources(cordovaProject, path.relative(cordovaProject.root, self.locations.root)); + }).then(function () { + events.emit('verbose', 'Prepared android project successfully'); + }); +}; + +module.exports.clean = function (options) { + // A cordovaProject isn't passed into the clean() function, because it might have + // been called from the platform shell script rather than the CLI. Check for the + // noPrepare option passed in by the non-CLI clean script. If that's present, or if + // there's no config.xml found at the project root, then don't clean prepared files. + var projectRoot = path.resolve(this.root, '../..'); + if ((options && options.noPrepare) || !fs.existsSync(this.locations.configXml) || + !fs.existsSync(this.locations.configXml)) { + return Q(); + } + + var projectConfig = new ConfigParser(this.locations.configXml); + + var self = this; + return Q().then(function () { + cleanWww(projectRoot, self.locations); + cleanIcons(projectRoot, projectConfig, path.relative(projectRoot, self.locations.res)); + cleanSplashes(projectRoot, projectConfig, path.relative(projectRoot, self.locations.res)); + cleanFileResources(projectRoot, projectConfig, path.relative(projectRoot, self.locations.root)); + }); +}; + +/** + * Updates config files in project based on app's config.xml and config munge, + * generated by plugins. + * + * @param {ConfigParser} sourceConfig A project's configuration that will + * be merged into platform's config.xml + * @param {ConfigChanges} configMunger An initialized ConfigChanges instance + * for this platform. + * @param {Object} locations A map of locations for this platform + * + * @return {ConfigParser} An instance of ConfigParser, that + * represents current project's configuration. When returned, the + * configuration is already dumped to appropriate config.xml file. + */ +function updateConfigFilesFrom (sourceConfig, configMunger, locations) { + events.emit('verbose', 'Generating platform-specific config.xml from defaults for android at ' + locations.configXml); + + // First cleanup current config and merge project's one into own + // Overwrite platform config.xml with defaults.xml. + shell.cp('-f', locations.defaultConfigXml, locations.configXml); + + // Then apply config changes from global munge to all config files + // in project (including project's config) + configMunger.reapply_global_munge().save_all(); + + events.emit('verbose', 'Merging project\'s config.xml into platform-specific android config.xml'); + // Merge changes from app's config.xml into platform's one + var config = new ConfigParser(locations.configXml); + xmlHelpers.mergeXml(sourceConfig.doc.getroot(), + config.doc.getroot(), 'android', /* clobber= */true); + + config.write(); + return config; +} + +/** + * Logs all file operations via the verbose event stream, indented. + */ +function logFileOp (message) { + events.emit('verbose', ' ' + message); +} + +/** + * Updates platform 'www' directory by replacing it with contents of + * 'platform_www' and app www. Also copies project's overrides' folder into + * the platform 'www' folder + * + * @param {Object} cordovaProject An object which describes cordova project. + * @param {Object} destinations An object that contains destination + * paths for www files. + */ +function updateWww (cordovaProject, destinations) { + var sourceDirs = [ + path.relative(cordovaProject.root, cordovaProject.locations.www), + path.relative(cordovaProject.root, destinations.platformWww) + ]; + + // If project contains 'merges' for our platform, use them as another overrides + var merges_path = path.join(cordovaProject.root, 'merges', 'android'); + if (fs.existsSync(merges_path)) { + events.emit('verbose', 'Found "merges/android" folder. Copying its contents into the android project.'); + sourceDirs.push(path.join('merges', 'android')); + } + + var targetDir = path.relative(cordovaProject.root, destinations.www); + events.emit( + 'verbose', 'Merging and updating files from [' + sourceDirs.join(', ') + '] to ' + targetDir); + FileUpdater.mergeAndUpdateDir( + sourceDirs, targetDir, { rootDir: cordovaProject.root }, logFileOp); +} + +/** + * Cleans all files from the platform 'www' directory. + */ +function cleanWww (projectRoot, locations) { + var targetDir = path.relative(projectRoot, locations.www); + events.emit('verbose', 'Cleaning ' + targetDir); + + // No source paths are specified, so mergeAndUpdateDir() will clear the target directory. + FileUpdater.mergeAndUpdateDir( + [], targetDir, { rootDir: projectRoot, all: true }, logFileOp); +} + +/** + * Updates project structure and AndroidManifest according to project's configuration. + * + * @param {ConfigParser} platformConfig A project's configuration that will + * be used to update project + * @param {Object} locations A map of locations for this platform + */ +function updateProjectAccordingTo (platformConfig, locations) { + // Update app name by editing res/values/strings.xml + var strings = xmlHelpers.parseElementtreeSync(locations.strings); + + var name = platformConfig.name(); + strings.find('string[@name="app_name"]').text = name.replace(/\'/g, '\\\''); + + var shortName = platformConfig.shortName && platformConfig.shortName(); + if (shortName && shortName !== name) { + strings.find('string[@name="launcher_name"]').text = shortName.replace(/\'/g, '\\\''); + } + + fs.writeFileSync(locations.strings, strings.write({indent: 4}), 'utf-8'); + events.emit('verbose', 'Wrote out android application name "' + name + '" to ' + locations.strings); + + // Java packages cannot support dashes + var androidPkgName = (platformConfig.android_packageName() || platformConfig.packageName()).replace(/-/g, '_'); + + var manifest = new AndroidManifest(locations.manifest); + var manifestId = manifest.getPackageId(); + + manifest.getActivity() + .setOrientation(platformConfig.getPreference('orientation')) + .setLaunchMode(findAndroidLaunchModePreference(platformConfig)); + + manifest.setVersionName(platformConfig.version()) + .setVersionCode(platformConfig.android_versionCode() || default_versionCode(platformConfig.version())) + .setPackageId(androidPkgName) + .setMinSdkVersion(platformConfig.getPreference('android-minSdkVersion', 'android')) + .setMaxSdkVersion(platformConfig.getPreference('android-maxSdkVersion', 'android')) + .setTargetSdkVersion(platformConfig.getPreference('android-targetSdkVersion', 'android')) + .write(); + + // Java file paths shouldn't be hard coded + var javaPattern = path.join(locations.javaSrc, manifestId.replace(/\./g, '/'), '*.java'); + var java_files = shell.ls(javaPattern).filter(function (f) { + return shell.grep(/extends\s+CordovaActivity/g, f); + }); + + if (java_files.length === 0) { + throw new CordovaError('No Java files found that extend CordovaActivity.'); + } else if (java_files.length > 1) { + events.emit('log', 'Multiple candidate Java files that extend CordovaActivity found. Guessing at the first one, ' + java_files[0]); + } + + var destFile = path.join(locations.root, 'app', 'src', 'main', 'java', androidPkgName.replace(/\./g, '/'), path.basename(java_files[0])); + shell.mkdir('-p', path.dirname(destFile)); + shell.sed(/package [\w\.]*;/, 'package ' + androidPkgName + ';', java_files[0]).to(destFile); + events.emit('verbose', 'Wrote out Android package name "' + androidPkgName + '" to ' + destFile); + + var removeOrigPkg = checkReqs.isWindows() || checkReqs.isDarwin() ? + manifestId.toUpperCase() !== androidPkgName.toUpperCase() : + manifestId !== androidPkgName; + + if (removeOrigPkg) { + // If package was name changed we need to remove old java with main activity + shell.rm('-Rf', java_files[0]); + // remove any empty directories + var currentDir = path.dirname(java_files[0]); + var sourcesRoot = path.resolve(locations.root, 'src'); + while (currentDir !== sourcesRoot) { + if (fs.existsSync(currentDir) && fs.readdirSync(currentDir).length === 0) { + fs.rmdirSync(currentDir); + currentDir = path.resolve(currentDir, '..'); + } else { + break; + } + } + } +} + +// Consturct the default value for versionCode as +// PATCH + MINOR * 100 + MAJOR * 10000 +// see http://developer.android.com/tools/publishing/versioning.html +function default_versionCode (version) { + var nums = version.split('-')[0].split('.'); + var versionCode = 0; + if (+nums[0]) { + versionCode += +nums[0] * 10000; + } + if (+nums[1]) { + versionCode += +nums[1] * 100; + } + if (+nums[2]) { + versionCode += +nums[2]; + } + + events.emit('verbose', 'android-versionCode not found in config.xml. Generating a code based on version in config.xml (' + version + '): ' + versionCode); + return versionCode; +} + +function getImageResourcePath (resourcesDir, type, density, name, sourceName) { + if (/\.9\.png$/.test(sourceName)) { + name = name.replace(/\.png$/, '.9.png'); + } + var resourcePath = path.join(resourcesDir, (density ? type + '-' + density : type), name); + return resourcePath; +} + +function updateSplashes (cordovaProject, platformResourcesDir) { + var resources = cordovaProject.projectConfig.getSplashScreens('android'); + + // if there are "splash" elements in config.xml + if (resources.length === 0) { + events.emit('verbose', 'This app does not have splash screens defined'); + return; + } + + var resourceMap = mapImageResources(cordovaProject.root, platformResourcesDir, 'drawable', 'screen.png'); + + var hadMdpi = false; + resources.forEach(function (resource) { + if (!resource.density) { + return; + } + if (resource.density === 'mdpi') { + hadMdpi = true; + } + var targetPath = getImageResourcePath( + platformResourcesDir, 'drawable', resource.density, 'screen.png', path.basename(resource.src)); + resourceMap[targetPath] = resource.src; + }); + + // There's no "default" drawable, so assume default == mdpi. + if (!hadMdpi && resources.defaultResource) { + var targetPath = getImageResourcePath( + platformResourcesDir, 'drawable', 'mdpi', 'screen.png', path.basename(resources.defaultResource.src)); + resourceMap[targetPath] = resources.defaultResource.src; + } + + events.emit('verbose', 'Updating splash screens at ' + platformResourcesDir); + FileUpdater.updatePaths( + resourceMap, { rootDir: cordovaProject.root }, logFileOp); +} + +function cleanSplashes (projectRoot, projectConfig, platformResourcesDir) { + var resources = projectConfig.getSplashScreens('android'); + if (resources.length > 0) { + var resourceMap = mapImageResources(projectRoot, platformResourcesDir, 'drawable', 'screen.png'); + events.emit('verbose', 'Cleaning splash screens at ' + platformResourcesDir); + + // No source paths are specified in the map, so updatePaths() will delete the target files. + FileUpdater.updatePaths( + resourceMap, { rootDir: projectRoot, all: true }, logFileOp); + } +} + +function updateIcons (cordovaProject, platformResourcesDir) { + var icons = cordovaProject.projectConfig.getIcons('android'); + + // if there are icon elements in config.xml + if (icons.length === 0) { + events.emit('verbose', 'This app does not have launcher icons defined'); + return; + } + + var resourceMap = mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'icon.png'); + + var android_icons = {}; + var default_icon; + // http://developer.android.com/design/style/iconography.html + var sizeToDensityMap = { + 36: 'ldpi', + 48: 'mdpi', + 72: 'hdpi', + 96: 'xhdpi', + 144: 'xxhdpi', + 192: 'xxxhdpi' + }; + // find the best matching icon for a given density or size + // @output android_icons + var parseIcon = function (icon, icon_size) { + // do I have a platform icon for that density already + var density = icon.density || sizeToDensityMap[icon_size]; + if (!density) { + // invalid icon defition ( or unsupported size) + return; + } + var previous = android_icons[density]; + if (previous && previous.platform) { + return; + } + android_icons[density] = icon; + }; + + // iterate over all icon elements to find the default icon and call parseIcon + for (var i = 0; i < icons.length; i++) { + var icon = icons[i]; + var size = icon.width; + if (!size) { + size = icon.height; + } + if (!size && !icon.density) { + if (default_icon) { + events.emit('verbose', 'Found extra default icon: ' + icon.src + ' (ignoring in favor of ' + default_icon.src + ')'); + } else { + default_icon = icon; + } + } else { + parseIcon(icon, size); + } + } + + // The source paths for icons and splashes are relative to + // project's config.xml location, so we use it as base path. + for (var density in android_icons) { + var targetPath = getImageResourcePath( + platformResourcesDir, 'mipmap', density, 'icon.png', path.basename(android_icons[density].src)); + resourceMap[targetPath] = android_icons[density].src; + } + + // There's no "default" drawable, so assume default == mdpi. + if (default_icon && !android_icons.mdpi) { + var defaultTargetPath = getImageResourcePath( + platformResourcesDir, 'mipmap', 'mdpi', 'icon.png', path.basename(default_icon.src)); + resourceMap[defaultTargetPath] = default_icon.src; + } + + events.emit('verbose', 'Updating icons at ' + platformResourcesDir); + FileUpdater.updatePaths( + resourceMap, { rootDir: cordovaProject.root }, logFileOp); +} + +function cleanIcons (projectRoot, projectConfig, platformResourcesDir) { + var icons = projectConfig.getIcons('android'); + if (icons.length > 0) { + var resourceMap = mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'icon.png'); + events.emit('verbose', 'Cleaning icons at ' + platformResourcesDir); + + // No source paths are specified in the map, so updatePaths() will delete the target files. + FileUpdater.updatePaths( + resourceMap, { rootDir: projectRoot, all: true }, logFileOp); + } +} + +/** + * Gets a map containing resources of a specified name from all drawable folders in a directory. + */ +function mapImageResources (rootDir, subDir, type, resourceName) { + var pathMap = {}; + shell.ls(path.join(rootDir, subDir, type + '-*')).forEach(function (drawableFolder) { + var imagePath = path.join(subDir, path.basename(drawableFolder), resourceName); + pathMap[imagePath] = null; + }); + return pathMap; +} + +function updateFileResources (cordovaProject, platformDir) { + var files = cordovaProject.projectConfig.getFileResources('android'); + + // if there are resource-file elements in config.xml + if (files.length === 0) { + events.emit('verbose', 'This app does not have additional resource files defined'); + return; + } + + var resourceMap = {}; + files.forEach(function (res) { + var targetPath = path.join(platformDir, res.target); + resourceMap[targetPath] = res.src; + }); + + events.emit('verbose', 'Updating resource files at ' + platformDir); + FileUpdater.updatePaths( + resourceMap, { rootDir: cordovaProject.root }, logFileOp); +} + +function cleanFileResources (projectRoot, projectConfig, platformDir) { + var files = projectConfig.getFileResources('android', true); + if (files.length > 0) { + events.emit('verbose', 'Cleaning resource files at ' + platformDir); + + var resourceMap = {}; + files.forEach(function (res) { + var filePath = path.join(platformDir, res.target); + resourceMap[filePath] = null; + }); + + FileUpdater.updatePaths( + resourceMap, { + rootDir: projectRoot, all: true}, logFileOp); + } +} + +/** + * Gets and validates 'AndroidLaunchMode' prepference from config.xml. Returns + * preference value and warns if it doesn't seems to be valid + * + * @param {ConfigParser} platformConfig A configParser instance for + * platform. + * + * @return {String} Preference's value from config.xml or + * default value, if there is no such preference. The default value is + * 'singleTop' + */ +function findAndroidLaunchModePreference (platformConfig) { + var launchMode = platformConfig.getPreference('AndroidLaunchMode'); + if (!launchMode) { + // Return a default value + return 'singleTop'; + } + + var expectedValues = ['standard', 'singleTop', 'singleTask', 'singleInstance']; + var valid = expectedValues.indexOf(launchMode) >= 0; + if (!valid) { + // Note: warn, but leave the launch mode as developer wanted, in case the list of options changes in the future + events.emit('warn', 'Unrecognized value for AndroidLaunchMode preference: ' + + launchMode + '. Expected values are: ' + expectedValues.join(', ')); + } + + return launchMode; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/retry.js b/asciiblaster-cordoba/platforms/android/cordova/lib/retry.js new file mode 100644 index 0000000..c464b9d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/retry.js @@ -0,0 +1,68 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 node: true */ + +'use strict'; + +var events = require('cordova-common').events; + +/* + * Retry a promise-returning function a number of times, propagating its + * results on success or throwing its error on a failed final attempt. + * + * @arg {Number} attemts_left - The number of times to retry the passed call. + * @arg {Function} promiseFunction - A function that returns a promise. + * @arg {...} - Arguments to pass to promiseFunction. + * + * @returns {Promise} + */ +module.exports.retryPromise = function (attemts_left, promiseFunction) { + + // NOTE: + // get all trailing arguments, by skipping the first two (attemts_left and + // promiseFunction) because they shouldn't get passed to promiseFunction + var promiseFunctionArguments = Array.prototype.slice.call(arguments, 2); + + return promiseFunction.apply(undefined, promiseFunctionArguments).then( + + // on success pass results through + function onFulfilled (value) { + return value; + }, + + // on rejection either retry, or throw the error + function onRejected (error) { + + attemts_left -= 1; + + if (attemts_left < 1) { + throw error; + } + + events.emit('verbose', 'A retried call failed. Retrying ' + attemts_left + ' more time(s).'); + + // retry call self again with the same arguments, except attemts_left is now lower + var fullArguments = [attemts_left, promiseFunction].concat(promiseFunctionArguments); + return module.exports.retryPromise.apply(undefined, fullArguments); + } + ); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/run.js b/asciiblaster-cordoba/platforms/android/cordova/lib/run.js new file mode 100644 index 0000000..4d7927c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/run.js @@ -0,0 +1,132 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 loopfunc:true */ + +var path = require('path'); +var build = require('./build'); +var emulator = require('./emulator'); +var device = require('./device'); +var Q = require('q'); +var events = require('cordova-common').events; + +function getInstallTarget (runOptions) { + var install_target; + if (runOptions.target) { + install_target = runOptions.target; + } else if (runOptions.device) { + install_target = '--device'; + } else if (runOptions.emulator) { + install_target = '--emulator'; + } + + return install_target; +} + +/** + * Runs the application on a device if available. If no device is found, it will + * use a started emulator. If no started emulators are found it will attempt + * to start an avd. If no avds are found it will error out. + * + * @param {Object} runOptions various run/build options. See Api.js build/run + * methods for reference. + * + * @return {Promise} + */ +module.exports.run = function (runOptions) { + + var self = this; + var install_target = getInstallTarget(runOptions); + + return Q().then(function () { + if (!install_target) { + // no target given, deploy to device if available, otherwise use the emulator. + return device.list().then(function (device_list) { + if (device_list.length > 0) { + events.emit('warn', 'No target specified, deploying to device \'' + device_list[0] + '\'.'); + install_target = device_list[0]; + } else { + events.emit('warn', 'No target specified and no devices found, deploying to emulator'); + install_target = '--emulator'; + } + }); + } + }).then(function () { + if (install_target === '--device') { + return device.resolveTarget(null); + } else if (install_target === '--emulator') { + // Give preference to any already started emulators. Else, start one. + return emulator.list_started().then(function (started) { + return started && started.length > 0 ? started[0] : emulator.start(); + }).then(function (emulatorId) { + return emulator.resolveTarget(emulatorId); + }); + } + // They specified a specific device/emulator ID. + return device.list().then(function (devices) { + if (devices.indexOf(install_target) > -1) { + return device.resolveTarget(install_target); + } + return emulator.list_started().then(function (started_emulators) { + if (started_emulators.indexOf(install_target) > -1) { + return emulator.resolveTarget(install_target); + } + return emulator.list_images().then(function (avds) { + // if target emulator isn't started, then start it. + for (var avd in avds) { + if (avds[avd].name === install_target) { + return emulator.start(install_target).then(function (emulatorId) { + return emulator.resolveTarget(emulatorId); + }); + } + } + return Q.reject('Target \'' + install_target + '\' not found, unable to run project'); + }); + }); + }); + }).then(function (resolvedTarget) { + // Better just call self.build, but we're doing some processing of + // build results (according to platformApi spec) so they are in different + // format than emulator.install expects. + // TODO: Update emulator/device.install to handle this change + return build.run.call(self, runOptions, resolvedTarget).then(function (buildResults) { + if (resolvedTarget && resolvedTarget.isEmulator) { + return emulator.wait_for_boot(resolvedTarget.target).then(function () { + return emulator.install(resolvedTarget, buildResults); + }); + } + return device.install(resolvedTarget, buildResults); + }); + }); +}; + +module.exports.help = function () { + console.log('Usage: ' + path.relative(process.cwd(), process.argv[1]) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target= : Installs to the target with the specified id.'); + process.exit(0); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator b/asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator new file mode 100644 index 0000000..f96bdc3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var emulator = require('./emulator'), + args = process.argv; + +var install_target; +if(args.length > 2) { + if (args[2].substring(0, 9) == '--target=') { + install_target = args[2].substring(9, args[2].length); + } else { + console.error('ERROR : argument \'' + args[2] + '\' not recognized.'); + process.exit(2); + } +} + +emulator.start(install_target).done(null, function(err) { + console.error('ERROR: ' + err); + process.exit(2); +}); + diff --git a/asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator.bat b/asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator.bat new file mode 100644 index 0000000..6c237ea --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/lib/start-emulator.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0start-emulator" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'start-emulator' script in 'cordova\lib' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/log b/asciiblaster-cordoba/platforms/android/cordova/log new file mode 100644 index 0000000..47f0605 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/log @@ -0,0 +1,36 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var log = require('./lib/log'), + reqs = require('./lib/check_reqs'), + args = process.argv; + +// Usage support for when args are given +if(args.length > 2) { + log.help(); +} else { + reqs.run().done(function() { + return log.run(); + }, function(err) { + console.error('ERROR: ' + err); + process.exit(2); + }); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/log.bat b/asciiblaster-cordoba/platforms/android/cordova/log.bat new file mode 100644 index 0000000..4b2b434 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/log.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script_path="%~dp0log" +IF EXIST %script_path% ( + node %script_path% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'log' script in 'cordova' folder, aborting...>&2 + EXIT /B 1 +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/loggingHelper.js b/asciiblaster-cordoba/platforms/android/cordova/loggingHelper.js new file mode 100644 index 0000000..32b2ee0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/loggingHelper.js @@ -0,0 +1,18 @@ +var CordovaLogger = require('cordova-common').CordovaLogger; + +module.exports = { + adjustLoggerLevel: function (opts) { + if (opts instanceof Array) { + opts.silent = opts.indexOf('--silent') !== -1; + opts.verbose = opts.indexOf('--verbose') !== -1; + } + + if (opts.silent) { + CordovaLogger.get().setLevel('error'); + } + + if (opts.verbose) { + CordovaLogger.get().setLevel('verbose'); + } + } +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt new file mode 100644 index 0000000..714334e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt @@ -0,0 +1,15 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../nopt/bin/nopt.js" "$@" + ret=$? +else + node "$basedir/../nopt/bin/nopt.js" "$@" + ret=$? +fi +exit $ret diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt.cmd b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt.cmd new file mode 100644 index 0000000..64d5f3e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/nopt.cmd @@ -0,0 +1,7 @@ +@IF EXIST "%~dp0\node.exe" ( + "%~dp0\node.exe" "%~dp0\..\nopt\bin\nopt.js" %* +) ELSE ( + @SETLOCAL + @SET PATHEXT=%PATHEXT:;.JS;=;% + node "%~dp0\..\nopt\bin\nopt.js" %* +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver new file mode 100644 index 0000000..d592e69 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver @@ -0,0 +1,15 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../semver/bin/semver" "$@" + ret=$? +else + node "$basedir/../semver/bin/semver" "$@" + ret=$? +fi +exit $ret diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver.cmd b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver.cmd new file mode 100644 index 0000000..eabc737 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/semver.cmd @@ -0,0 +1,7 @@ +@IF EXIST "%~dp0\node.exe" ( + "%~dp0\node.exe" "%~dp0\..\semver\bin\semver" %* +) ELSE ( + @SETLOCAL + @SET PATHEXT=%PATHEXT:;.JS;=;% + node "%~dp0\..\semver\bin\semver" %* +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs new file mode 100644 index 0000000..1d45691 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs @@ -0,0 +1,15 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../shelljs/bin/shjs" "$@" + ret=$? +else + node "$basedir/../shelljs/bin/shjs" "$@" + ret=$? +fi +exit $ret diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs.cmd b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs.cmd new file mode 100644 index 0000000..1289168 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/.bin/shjs.cmd @@ -0,0 +1,7 @@ +@IF EXIST "%~dp0\node.exe" ( + "%~dp0\node.exe" "%~dp0\..\shelljs\bin\shjs" %* +) ELSE ( + @SETLOCAL + @SET PATHEXT=%PATHEXT:;.JS;=;% + node "%~dp0\..\shelljs\bin\shjs" %* +) \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/LICENSE new file mode 100644 index 0000000..9bcfa9d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/LICENSE @@ -0,0 +1,46 @@ +This software is dual-licensed under the ISC and MIT licenses. +You may use this software under EITHER of the following licenses. + +---------- + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------- + +Copyright Isaac Z. Schlueter and Contributors +All rights reserved. + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/README.md new file mode 100644 index 0000000..99746fe --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/README.md @@ -0,0 +1,23 @@ +# abbrev-js + +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev). + +Usage: + + var abbrev = require("abbrev"); + abbrev("foo", "fool", "folding", "flop"); + + // returns: + { fl: 'flop' + , flo: 'flop' + , flop: 'flop' + , fol: 'folding' + , fold: 'folding' + , foldi: 'folding' + , foldin: 'folding' + , folding: 'folding' + , foo: 'foo' + , fool: 'fool' + } + +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/abbrev.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/abbrev.js new file mode 100644 index 0000000..7b1dc5d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/abbrev.js @@ -0,0 +1,61 @@ +module.exports = exports = abbrev.abbrev = abbrev + +abbrev.monkeyPatch = monkeyPatch + +function monkeyPatch () { + Object.defineProperty(Array.prototype, 'abbrev', { + value: function () { return abbrev(this) }, + enumerable: false, configurable: true, writable: true + }) + + Object.defineProperty(Object.prototype, 'abbrev', { + value: function () { return abbrev(Object.keys(this)) }, + enumerable: false, configurable: true, writable: true + }) +} + +function abbrev (list) { + if (arguments.length !== 1 || !Array.isArray(list)) { + list = Array.prototype.slice.call(arguments, 0) + } + for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { + args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) + } + + // sort them lexicographically, so that they're next to their nearest kin + args = args.sort(lexSort) + + // walk through each, seeing how much it has in common with the next and previous + var abbrevs = {} + , prev = "" + for (var i = 0, l = args.length ; i < l ; i ++) { + var current = args[i] + , next = args[i + 1] || "" + , nextMatches = true + , prevMatches = true + if (current === next) continue + for (var j = 0, cl = current.length ; j < cl ; j ++) { + var curChar = current.charAt(j) + nextMatches = nextMatches && curChar === next.charAt(j) + prevMatches = prevMatches && curChar === prev.charAt(j) + if (!nextMatches && !prevMatches) { + j ++ + break + } + } + prev = current + if (j === cl) { + abbrevs[current] = current + continue + } + for (var a = current.substr(0, j) ; j <= cl ; j ++) { + abbrevs[a] = current + a += current.charAt(j) + } + } + return abbrevs +} + +function lexSort (a, b) { + return a === b ? 0 : a > b ? 1 : -1 +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/package.json new file mode 100644 index 0000000..0033da1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/abbrev/package.json @@ -0,0 +1,57 @@ +{ + "_from": "abbrev@1", + "_id": "abbrev@1.1.1", + "_inBundle": true, + "_integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "_location": "/cordova-android/abbrev", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "abbrev@1", + "name": "abbrev", + "escapedName": "abbrev", + "rawSpec": "1", + "saveSpec": null, + "fetchSpec": "1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/nopt" + ], + "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "_shasum": "f8f2c887ad10bf67f634f005b6987fed3179aac8", + "_spec": "abbrev@1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/nopt", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "bugs": { + "url": "https://github.com/isaacs/abbrev-js/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Like ruby's abbrev module, but in js", + "devDependencies": { + "tap": "^10.1" + }, + "files": [ + "abbrev.js" + ], + "homepage": "https://github.com/isaacs/abbrev-js#readme", + "license": "ISC", + "main": "abbrev.js", + "name": "abbrev", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test.js --100" + }, + "version": "1.1.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintignore new file mode 100644 index 0000000..2e98972 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintignore @@ -0,0 +1,8 @@ +.git/ +node_modules/ +coverage/ +build/ +assets/ +dist/ +docs/ +tests/ \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintrc b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintrc new file mode 100644 index 0000000..e19b383 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.jshintrc @@ -0,0 +1,28 @@ +{ + "indent": 2, + "forin": true, + "noarg": true, + "bitwise": true, + "nonew": true, + "strict": true, + + "browser": true, + "devel": true, + "node": false, + "jquery": false, + "esnext": false, + "moz": false, + "es3": false, + + "asi": true, + + "eqnull": true, + "debug": true, + "boss": true, + "evil": true, + "loopfunc": true, + "laxbreak": true, + + "unused": true, + "undef": true +} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.travis.yml new file mode 100644 index 0000000..4c19fbe --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "6.1.0" \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/README.md new file mode 100644 index 0000000..79d63bc --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/README.md @@ -0,0 +1,87 @@ +Android Versions +================ + +A node module to get Android versions by API level, NDK level, semantic version, or version name. + +Versions are referenced from [source.android.com/source/build-numbers.html](https://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases). The version for "Current Development Build" (`"CUR_DEVELOPMENT"`) is not included in the list of `VERSIONS`. + +[![NPM version][npm-image]][npm-url] +[![build status][travis-image]][travis-url] + +[npm-image]: https://img.shields.io/npm/v/android-versions.svg?style=flat-square +[npm-url]: https://npmjs.org/package/android-versions +[travis-image]: https://img.shields.io/travis/dvoiss/android-versions.svg?style=flat-square +[travis-url]: https://travis-ci.org/dvoiss/android-versions + +## Install + +```bash +# NPM +npm install android-versions --save +# YARN +yarn add android-versions +``` + +## Usage + +View the tests for more advanced usage. + +```javascript +const android = require('android-versions') +``` + +#### Get by API level: +```javascript +console.log(android.get(23)) + +=> { api: 23, ndk: 8, semver: "6.0", name: "Marshmallow", versionCode: "M" } +``` + +#### Get by version: + +```javascript +console.log(android.get("2.3.3")) + +=> { api: 10, ndk: 5, semver: "2.3.3", name: "Gingerbread", versionCode: "GINGERBREAD_MR1" } +``` + +#### Get all by predicate: + +``` +android.getAll((version) => { + return version.ndk > 5 && version.api < 15 +}).map((version) => version.versionCode) + +=> [ "HONEYCOMB_MR1", "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH" ] +``` + +#### Access a specific version with all info: + +``` +android.LOLLIPOP + +=> { api: 21, ndk: 8, semver: "5.0", name: "Lollipop", versionCode: "LOLLIPOP" } +``` + +#### Access the complete reference of Android versions with all info: + +```javascript +android.VERSIONS + +=> { + BASE: { api: 1, ndk: 0, semver: "1.0", name: "(no code name)", versionCode: "BASE" }, + ... + N: { api: 24, ndk: 8, semver: "7.0", name: "Nougat", versionCode: "N" } + ... +} +``` + +## Test + +```bash +npm run test +``` + +## License + +MIT \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/index.js new file mode 100644 index 0000000..6592926 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/index.js @@ -0,0 +1,154 @@ +/** + * Copyright (c) 2016, David Voiss + * + * Permission to use, copy, modify, and/or distribute this software for any purpose + * with or without fee is hereby granted, provided that the above copyright notice + * and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + * THIS SOFTWARE. +*/ + +/* jshint node: true */ +"use strict"; + +/** + * A module to get Android versions by API level, NDK level, semantic version, or version name. + * + * Versions are referenced from here: + * {@link https://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases} + * {@link https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/Build.java} + * + * The version for "Current Development Build" ("CUR_DEVELOPMENT") is not included. + * + * @module android-versions + */ + +var VERSIONS = { + BASE: { api: 1, ndk: 0, semver: "1.0", name: "(no code name)", versionCode: "BASE" }, + BASE_1_1: { api: 2, ndk: 0, semver: "1.1", name: "(no code name)", versionCode: "BASE_1_1" }, + CUPCAKE: { api: 3, ndk: 1, semver: "1.5", name: "Cupcake", versionCode: "CUPCAKE" }, + DONUT: { api: 4, ndk: 2, semver: "1.6", name: "Donut", versionCode: "DONUT" }, + ECLAIR: { api: 5, ndk: 2, semver: "2.0", name: "Eclair", versionCode: "ECLAIR" }, + ECLAIR_0_1: { api: 6, ndk: 2, semver: "2.0.1", name: "Eclair", versionCode: "ECLAIR_0_1" }, + ECLAIR_MR1: { api: 7, ndk: 3, semver: "2.1", name: "Eclair", versionCode: "ECLAIR_MR1" }, + FROYO: { api: 8, ndk: 4, semver: "2.2.x", name: "Froyo", versionCode: "FROYO" }, + GINGERBREAD: { api: 9, ndk: 5, semver: "2.3.0 - 2.3.2", name: "Gingerbread", versionCode: "GINGERBREAD" }, + GINGERBREAD_MR1: { api: 10, ndk: 5, semver: "2.3.3 - 2.3.7", name: "Gingerbread", versionCode: "GINGERBREAD_MR1" }, + HONEYCOMB: { api: 11, ndk: 5, semver: "3.0", name: "Honeycomb", versionCode: "HONEYCOMB" }, + HONEYCOMB_MR1: { api: 12, ndk: 6, semver: "3.1", name: "Honeycomb", versionCode: "HONEYCOMB_MR1" }, + HONEYCOMB_MR2: { api: 13, ndk: 6, semver: "3.2.x", name: "Honeycomb", versionCode: "HONEYCOMB_MR2" }, + ICE_CREAM_SANDWICH: { api: 14, ndk: 7, semver: "4.0.1 - 4.0.2", name: "Ice Cream Sandwich", versionCode: "ICE_CREAM_SANDWICH" }, + ICE_CREAM_SANDWICH_MR1: { api: 15, ndk: 8, semver: "4.0.3 - 4.0.4", name: "Ice Cream Sandwich", versionCode: "ICE_CREAM_SANDWICH_MR1" }, + JELLY_BEAN: { api: 16, ndk: 8, semver: "4.1.x", name: "Jellybean", versionCode: "JELLY_BEAN" }, + JELLY_BEAN_MR1: { api: 17, ndk: 8, semver: "4.2.x", name: "Jellybean", versionCode: "JELLY_BEAN_MR1" }, + JELLY_BEAN_MR2: { api: 18, ndk: 8, semver: "4.3.x", name: "Jellybean", versionCode: "JELLY_BEAN_MR2" }, + KITKAT: { api: 19, ndk: 8, semver: "4.4.0 - 4.4.4", name: "KitKat", versionCode: "KITKAT" }, + KITKAT_WATCH: { api: 20, ndk: 8, semver: "4.4", name: "KitKat Watch", versionCode: "KITKAT_WATCH" }, + LOLLIPOP: { api: 21, ndk: 8, semver: "5.0", name: "Lollipop", versionCode: "LOLLIPOP" }, + LOLLIPOP_MR1: { api: 22, ndk: 8, semver: "5.1", name: "Lollipop", versionCode: "LOLLIPOP_MR1" }, + M: { api: 23, ndk: 8, semver: "6.0", name: "Marshmallow", versionCode: "M" }, + N: { api: 24, ndk: 8, semver: "7.0", name: "Nougat", versionCode: "N" }, + N_MR1: { api: 25, ndk: 8, semver: "7.1", name: "Nougat", versionCode: "N_MR1" }, + O: { api: 26, ndk: 8, semver: "8.0.0", name: "Oreo", versionCode: "O" }, + O_MR1: { api: 27, ndk: 8, semver: "8.1.0", name: "Oreo", versionCode: "O_MR1" } +} + +var semver = require('semver'); + +// semver format requires .. but we allow just . format. +// Coerce . to ..0 +function formatSemver(semver) { + if (semver.match(/^\d+.\d+$/)) { + return semver + '.0' + } else { + return semver + } +} + +// The default predicate compares against API level, semver, name, or code. +function getFromDefaultPredicate(arg) { + // Coerce arg to string for comparisons below. + arg = arg.toString() + + return getFromPredicate(function(version) { + // Check API level before all else. + if (arg === version.api.toString()) { + return true + } + + let argSemver = formatSemver(arg); + let versionSemver = formatSemver(version.semver); + + if (semver.valid(argSemver) && semver.satisfies(argSemver, versionSemver)) { + return true + } + + // Compare version name and code. + return arg === version.name || arg === version.versionCode + }) +} + +// The function to allow passing a predicate. +function getFromPredicate(predicate) { + if (predicate === null) { + return null + } + + return Object.keys(VERSIONS).filter(function(version) { + return predicate(VERSIONS[version]) + }).map(function(key) { return VERSIONS[key] }) +} + +/** + * The Android version codes available as keys for easier look-up. + */ +Object.keys(VERSIONS).forEach(function(name) { + exports[name] = VERSIONS[name] +}) + +/** + * The complete reference of Android versions for easier look-up. + */ +exports.VERSIONS = VERSIONS + +/** + * Retrieve a single Android version. + * + * @param {object | Function} arg - The value or predicate to use to retrieve values. + * + * @return {object} An object representing the version found or null if none found. + */ +exports.get = function(arg) { + var result = exports.getAll(arg) + + if (result === null || result.length === 0) { + return null + } + + return result[0] +} + +/** + * Retrieve all Android versions that meet the criteria of the argument. + * + * @param {object | Function} arg - The value or predicate to use to retrieve values. + * + * @return {object} An object representing the version found or null if none found. + */ +exports.getAll = function(arg) { + if (arg === null) { + return null + } + + if (typeof arg === "function") { + return getFromPredicate(arg) + } else { + return getFromDefaultPredicate(arg) + } +} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/package.json new file mode 100644 index 0000000..1eb06d9 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/package.json @@ -0,0 +1,67 @@ +{ + "_from": "android-versions@1.3.0", + "_id": "android-versions@1.3.0", + "_inBundle": true, + "_integrity": "sha512-d/i1G16Oaw/T1EvskUA7Oo1vIQVK/0ZlpQgZfYVBwg6v/9FBE3QV66g5N1/bTHpRml8tFLxh+KoTw5DokK9c+A==", + "_location": "/cordova-android/android-versions", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "android-versions@1.3.0", + "name": "android-versions", + "escapedName": "android-versions", + "rawSpec": "1.3.0", + "saveSpec": null, + "fetchSpec": "1.3.0" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.3.0.tgz", + "_shasum": "ce6f3eae2e165ce4ed49b89beb68014741093044", + "_spec": "android-versions@1.3.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "dvoiss" + }, + "bugs": { + "url": "https://github.com/dvoiss/android-versions/issues" + }, + "bundleDependencies": false, + "dependencies": { + "semver": "^5.4.1" + }, + "deprecated": false, + "description": "Get the name, API level, version level, NDK level, or version code from any version of Android.", + "devDependencies": { + "jshint": "^2.9.2", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/dvoiss/android-versions#readme", + "keywords": [ + "android", + "version", + "versions", + "ndk", + "nougat", + "marshmallow", + "api", + "level" + ], + "license": "MIT", + "main": "index.js", + "name": "android-versions", + "pre-commit": [ + "jshint" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/dvoiss/android-versions.git" + }, + "scripts": { + "jshint": "jshint .", + "test": "tape tests/**/*.js" + }, + "version": "1.3.0" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/tests/index.test.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/tests/index.test.js new file mode 100644 index 0000000..0dbdcb6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/android-versions/tests/index.test.js @@ -0,0 +1,118 @@ +"use strict"; + +var test = require('tape') +var android = require('..') + +test('get specific version by API level', (t) => { + t.plan(1) + t.equal(android.get(24).name, "Nougat") +}) + +test('getAll versions by API level', (t) => { + t.plan(1) + t.equal(android.getAll(24)[0].name, "Nougat") +}) + +test('get specific version by predicate', (t) => { + t.plan(2) + + var actual = android.get((version) => { + return version.name.indexOf("on") !== -1 + }) + t.equal(actual.name, "Donut") + + actual = android.get((version) => { + return version.ndk > 5 && version.api < 15 + }) + t.equal(actual.versionCode, "HONEYCOMB_MR1") +}) + +test('getAll versions by predicate', (t) => { + t.plan(3) + + var actual = android.getAll((version) => { + return version.name.indexOf("on") !== -1 + }).map((version) => version.name) + t.deepEqual(actual, ["Donut", "Honeycomb", "Honeycomb", "Honeycomb"]) + + actual = android.getAll((version) => { + return version.ndk > 5 && version.api < 15 + }).map((version) => version.versionCode) + t.deepEqual(actual, ["HONEYCOMB_MR1", "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH"]) + + actual = android.getAll((version) => { + return version.api > 22 + }).map((version) => version.versionCode) + t.deepEqual(actual, ["M", "N", "N_MR1", "O", "O_MR1"]) +}) + +test('get version by semantic version', (t) => { + t.plan(4) + t.equal(android.get("6.0").versionCode, android.M.versionCode) + t.equal(android.get("6.0.0").versionCode, android.M.versionCode) + t.equal(android.get("2.3").versionCode, android.GINGERBREAD.versionCode) + t.equal(android.get("2.3.3").versionCode, android.GINGERBREAD_MR1.versionCode) +}) + +test('support version ranges', (t) => { + t.plan(7); + t.equal(android.get("4.4").versionCode, android.KITKAT.versionCode); + t.equal(android.get("4.4.0").versionCode, android.KITKAT.versionCode); + t.equal(android.get("4.4.1").versionCode, android.KITKAT.versionCode); + t.equal(android.get("4.4.2").versionCode, android.KITKAT.versionCode); + t.equal(android.get("4.4.3").versionCode, android.KITKAT.versionCode); + t.equal(android.get("4.4.4").versionCode, android.KITKAT.versionCode); + t.equal(android.get("4.4.5"), null); +}) + +test('support x-ranges', (t) => { + t.plan(12); + t.equal(android.get("4.1").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.0").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.1").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.2").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.3").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.4").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.5").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.6").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.7").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.8").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.9").versionCode, android.JELLY_BEAN.versionCode); + t.equal(android.get("4.1.10").versionCode, android.JELLY_BEAN.versionCode); +}); + +test('access version codes object', (t) => { + t.plan(1) + t.ok(android.VERSIONS) +}) + +test('access specific versions directly', (t) => { + t.plan(27) + t.ok(android.BASE) + t.ok(android.BASE_1_1) + t.ok(android.CUPCAKE) + t.ok(android.DONUT) + t.ok(android.ECLAIR) + t.ok(android.ECLAIR_0_1) + t.ok(android.ECLAIR_MR1) + t.ok(android.FROYO) + t.ok(android.GINGERBREAD) + t.ok(android.GINGERBREAD_MR1) + t.ok(android.HONEYCOMB) + t.ok(android.HONEYCOMB_MR1) + t.ok(android.HONEYCOMB_MR2) + t.ok(android.ICE_CREAM_SANDWICH) + t.ok(android.ICE_CREAM_SANDWICH_MR1) + t.ok(android.JELLY_BEAN) + t.ok(android.JELLY_BEAN_MR1) + t.ok(android.JELLY_BEAN_MR2) + t.ok(android.KITKAT) + t.ok(android.KITKAT_WATCH) + t.ok(android.LOLLIPOP) + t.ok(android.LOLLIPOP_MR1) + t.ok(android.M) + t.ok(android.N) + t.ok(android.N_MR1) + t.ok(android.O) + t.ok(android.O_MR1) +}) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.jshintrc b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.jshintrc new file mode 100644 index 0000000..248c542 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.jshintrc @@ -0,0 +1,4 @@ +{ + "laxcomma": true, + "asi": true +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/History.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/History.md new file mode 100644 index 0000000..aea8aaf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/History.md @@ -0,0 +1,23 @@ + +0.3.1 / 2016-01-14 +================== + + * add MIT LICENSE file (#23, @kasicka) + * preserve chaining after redundant style-method calls (#19, @drewblaisdell) + * package: add "license" field (#16, @BenjaminTsai) + +0.3.0 / 2014-05-09 +================== + + * package: remove "test" script and "devDependencies" + * package: remove "engines" section + * pacakge: remove "bin" section + * package: beautify + * examples: remove `starwars` example (#15) + * Documented goto, horizontalAbsolute, and eraseLine methods in README.md (#12, @Jammerwoch) + * add `.jshintrc` file + +< 0.3.0 +======= + + * Prehistoric diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/LICENSE new file mode 100644 index 0000000..2ea4dc5 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/README.md new file mode 100644 index 0000000..6ce1940 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/README.md @@ -0,0 +1,98 @@ +ansi.js +========= +### Advanced ANSI formatting tool for Node.js + +`ansi.js` is a module for Node.js that provides an easy-to-use API for +writing ANSI escape codes to `Stream` instances. ANSI escape codes are used to do +fancy things in a terminal window, like render text in colors, delete characters, +lines, the entire window, or hide and show the cursor, and lots more! + +#### Features: + + * 256 color support for the terminal! + * Make a beep sound from your terminal! + * Works with *any* writable `Stream` instance. + * Allows you to move the cursor anywhere on the terminal window. + * Allows you to delete existing contents from the terminal window. + * Allows you to hide and show the cursor. + * Converts CSS color codes and RGB values into ANSI escape codes. + * Low-level; you are in control of when escape codes are used, it's not abstracted. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install ansi +``` + + +Example +------- + +``` js +var ansi = require('ansi') + , cursor = ansi(process.stdout) + +// You can chain your calls forever: +cursor + .red() // Set font color to red + .bg.grey() // Set background color to grey + .write('Hello World!') // Write 'Hello World!' to stdout + .bg.reset() // Reset the bgcolor before writing the trailing \n, + // to avoid Terminal glitches + .write('\n') // And a final \n to wrap things up + +// Rendering modes are persistent: +cursor.hex('#660000').bold().underline() + +// You can use the regular logging functions, text will be green: +console.log('This is blood red, bold text') + +// To reset just the foreground color: +cursor.fg.reset() + +console.log('This will still be bold') + +// to go to a location (x,y) on the console +// note: 1-indexed, not 0-indexed: +cursor.goto(10, 5).write('Five down, ten over') + +// to clear the current line: +cursor.horizontalAbsolute(0).eraseLine().write('Starting again') + +// to go to a different column on the current line: +cursor.horizontalAbsolute(5).write('column five') + +// Clean up after yourself! +cursor.reset() +``` + + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/beep/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/beep/index.js new file mode 100644 index 0000000..c1ec929 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/beep/index.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +/** + * Invokes the terminal "beep" sound once per second on every exact second. + */ + +process.title = 'beep' + +var cursor = require('../../')(process.stdout) + +function beep () { + cursor.beep() + setTimeout(beep, 1000 - (new Date()).getMilliseconds()) +} + +setTimeout(beep, 1000 - (new Date()).getMilliseconds()) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/clear/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/clear/index.js new file mode 100644 index 0000000..6ac21ff --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/clear/index.js @@ -0,0 +1,15 @@ +#!/usr/bin/env node + +/** + * Like GNU ncurses "clear" command. + * https://github.com/mscdex/node-ncurses/blob/master/deps/ncurses/progs/clear.c + */ + +process.title = 'clear' + +function lf () { return '\n' } + +require('../../')(process.stdout) + .write(Array.apply(null, Array(process.stdout.getWindowSize()[1])).map(lf).join('')) + .eraseData(2) + .goto(1, 1) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/cursorPosition.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/cursorPosition.js new file mode 100644 index 0000000..50f9644 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/cursorPosition.js @@ -0,0 +1,32 @@ +#!/usr/bin/env node + +var tty = require('tty') +var cursor = require('../')(process.stdout) + +// listen for the queryPosition report on stdin +process.stdin.resume() +raw(true) + +process.stdin.once('data', function (b) { + var match = /\[(\d+)\;(\d+)R$/.exec(b.toString()) + if (match) { + var xy = match.slice(1, 3).reverse().map(Number) + console.error(xy) + } + + // cleanup and close stdin + raw(false) + process.stdin.pause() +}) + + +// send the query position request code to stdout +cursor.queryPosition() + +function raw (mode) { + if (process.stdin.setRawMode) { + process.stdin.setRawMode(mode) + } else { + tty.setRawMode(mode) + } +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/progress/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/progress/index.js new file mode 100644 index 0000000..d28dbda --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/examples/progress/index.js @@ -0,0 +1,87 @@ +#!/usr/bin/env node + +var assert = require('assert') + , ansi = require('../../') + +function Progress (stream, width) { + this.cursor = ansi(stream) + this.delta = this.cursor.newlines + this.width = width | 0 || 10 + this.open = '[' + this.close = ']' + this.complete = '█' + this.incomplete = '_' + + // initial render + this.progress = 0 +} + +Object.defineProperty(Progress.prototype, 'progress', { + get: get + , set: set + , configurable: true + , enumerable: true +}) + +function get () { + return this._progress +} + +function set (v) { + this._progress = Math.max(0, Math.min(v, 100)) + + var w = this.width - this.complete.length - this.incomplete.length + , n = w * (this._progress / 100) | 0 + , i = w - n + , com = c(this.complete, n) + , inc = c(this.incomplete, i) + , delta = this.cursor.newlines - this.delta + + assert.equal(com.length + inc.length, w) + + if (delta > 0) { + this.cursor.up(delta) + this.delta = this.cursor.newlines + } + + this.cursor + .horizontalAbsolute(0) + .eraseLine(2) + .fg.white() + .write(this.open) + .fg.grey() + .bold() + .write(com) + .resetBold() + .write(inc) + .fg.white() + .write(this.close) + .fg.reset() + .write('\n') +} + +function c (char, length) { + return Array.apply(null, Array(length)).map(function () { + return char + }).join('') +} + + + + +// Usage +var width = parseInt(process.argv[2], 10) || process.stdout.getWindowSize()[0] / 2 + , p = new Progress(process.stdout, width) + +;(function tick () { + p.progress += Math.random() * 5 + p.cursor + .eraseLine(2) + .write('Progress: ') + .bold().write(p.progress.toFixed(2)) + .write('%') + .resetBold() + .write('\n') + if (p.progress < 100) + setTimeout(tick, 100) +})() diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/lib/ansi.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/lib/ansi.js new file mode 100644 index 0000000..b1714e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/ansi/lib/ansi.js @@ -0,0 +1,405 @@ + +/** + * References: + * + * - http://en.wikipedia.org/wiki/ANSI_escape_code + * - http://www.termsys.demon.co.uk/vtansi.htm + * + */ + +/** + * Module dependencies. + */ + +var emitNewlineEvents = require('./newlines') + , prefix = '\x1b[' // For all escape codes + , suffix = 'm' // Only for color codes + +/** + * The ANSI escape sequences. + */ + +var codes = { + up: 'A' + , down: 'B' + , forward: 'C' + , back: 'D' + , nextLine: 'E' + , previousLine: 'F' + , horizontalAbsolute: 'G' + , eraseData: 'J' + , eraseLine: 'K' + , scrollUp: 'S' + , scrollDown: 'T' + , savePosition: 's' + , restorePosition: 'u' + , queryPosition: '6n' + , hide: '?25l' + , show: '?25h' +} + +/** + * Rendering ANSI codes. + */ + +var styles = { + bold: 1 + , italic: 3 + , underline: 4 + , inverse: 7 +} + +/** + * The negating ANSI code for the rendering modes. + */ + +var reset = { + bold: 22 + , italic: 23 + , underline: 24 + , inverse: 27 +} + +/** + * The standard, styleable ANSI colors. + */ + +var colors = { + white: 37 + , black: 30 + , blue: 34 + , cyan: 36 + , green: 32 + , magenta: 35 + , red: 31 + , yellow: 33 + , grey: 90 + , brightBlack: 90 + , brightRed: 91 + , brightGreen: 92 + , brightYellow: 93 + , brightBlue: 94 + , brightMagenta: 95 + , brightCyan: 96 + , brightWhite: 97 +} + + +/** + * Creates a Cursor instance based off the given `writable stream` instance. + */ + +function ansi (stream, options) { + if (stream._ansicursor) { + return stream._ansicursor + } else { + return stream._ansicursor = new Cursor(stream, options) + } +} +module.exports = exports = ansi + +/** + * The `Cursor` class. + */ + +function Cursor (stream, options) { + if (!(this instanceof Cursor)) { + return new Cursor(stream, options) + } + if (typeof stream != 'object' || typeof stream.write != 'function') { + throw new Error('a valid Stream instance must be passed in') + } + + // the stream to use + this.stream = stream + + // when 'enabled' is false then all the functions are no-ops except for write() + this.enabled = options && options.enabled + if (typeof this.enabled === 'undefined') { + this.enabled = stream.isTTY + } + this.enabled = !!this.enabled + + // then `buffering` is true, then `write()` calls are buffered in + // memory until `flush()` is invoked + this.buffering = !!(options && options.buffering) + this._buffer = [] + + // controls the foreground and background colors + this.fg = this.foreground = new Colorer(this, 0) + this.bg = this.background = new Colorer(this, 10) + + // defaults + this.Bold = false + this.Italic = false + this.Underline = false + this.Inverse = false + + // keep track of the number of "newlines" that get encountered + this.newlines = 0 + emitNewlineEvents(stream) + stream.on('newline', function () { + this.newlines++ + }.bind(this)) +} +exports.Cursor = Cursor + +/** + * Helper function that calls `write()` on the underlying Stream. + * Returns `this` instead of the write() return value to keep + * the chaining going. + */ + +Cursor.prototype.write = function (data) { + if (this.buffering) { + this._buffer.push(arguments) + } else { + this.stream.write.apply(this.stream, arguments) + } + return this +} + +/** + * Buffer `write()` calls into memory. + * + * @api public + */ + +Cursor.prototype.buffer = function () { + this.buffering = true + return this +} + +/** + * Write out the in-memory buffer. + * + * @api public + */ + +Cursor.prototype.flush = function () { + this.buffering = false + var str = this._buffer.map(function (args) { + if (args.length != 1) throw new Error('unexpected args length! ' + args.length); + return args[0]; + }).join(''); + this._buffer.splice(0); // empty + this.write(str); + return this +} + + +/** + * The `Colorer` class manages both the background and foreground colors. + */ + +function Colorer (cursor, base) { + this.current = null + this.cursor = cursor + this.base = base +} +exports.Colorer = Colorer + +/** + * Write an ANSI color code, ensuring that the same code doesn't get rewritten. + */ + +Colorer.prototype._setColorCode = function setColorCode (code) { + var c = String(code) + if (this.current === c) return + this.cursor.enabled && this.cursor.write(prefix + c + suffix) + this.current = c + return this +} + + +/** + * Set up the positional ANSI codes. + */ + +Object.keys(codes).forEach(function (name) { + var code = String(codes[name]) + Cursor.prototype[name] = function () { + var c = code + if (arguments.length > 0) { + c = toArray(arguments).map(Math.round).join(';') + code + } + this.enabled && this.write(prefix + c) + return this + } +}) + +/** + * Set up the functions for the rendering ANSI codes. + */ + +Object.keys(styles).forEach(function (style) { + var name = style[0].toUpperCase() + style.substring(1) + , c = styles[style] + , r = reset[style] + + Cursor.prototype[style] = function () { + if (this[name]) return this + this.enabled && this.write(prefix + c + suffix) + this[name] = true + return this + } + + Cursor.prototype['reset' + name] = function () { + if (!this[name]) return this + this.enabled && this.write(prefix + r + suffix) + this[name] = false + return this + } +}) + +/** + * Setup the functions for the standard colors. + */ + +Object.keys(colors).forEach(function (color) { + var code = colors[color] + + Colorer.prototype[color] = function () { + this._setColorCode(this.base + code) + return this.cursor + } + + Cursor.prototype[color] = function () { + return this.foreground[color]() + } +}) + +/** + * Makes a beep sound! + */ + +Cursor.prototype.beep = function () { + this.enabled && this.write('\x07') + return this +} + +/** + * Moves cursor to specific position + */ + +Cursor.prototype.goto = function (x, y) { + x = x | 0 + y = y | 0 + this.enabled && this.write(prefix + y + ';' + x + 'H') + return this +} + +/** + * Resets the color. + */ + +Colorer.prototype.reset = function () { + this._setColorCode(this.base + 39) + return this.cursor +} + +/** + * Resets all ANSI formatting on the stream. + */ + +Cursor.prototype.reset = function () { + this.enabled && this.write(prefix + '0' + suffix) + this.Bold = false + this.Italic = false + this.Underline = false + this.Inverse = false + this.foreground.current = null + this.background.current = null + return this +} + +/** + * Sets the foreground color with the given RGB values. + * The closest match out of the 216 colors is picked. + */ + +Colorer.prototype.rgb = function (r, g, b) { + var base = this.base + 38 + , code = rgb(r, g, b) + this._setColorCode(base + ';5;' + code) + return this.cursor +} + +/** + * Same as `cursor.fg.rgb(r, g, b)`. + */ + +Cursor.prototype.rgb = function (r, g, b) { + return this.foreground.rgb(r, g, b) +} + +/** + * Accepts CSS color codes for use with ANSI escape codes. + * For example: `#FF000` would be bright red. + */ + +Colorer.prototype.hex = function (color) { + return this.rgb.apply(this, hex(color)) +} + +/** + * Same as `cursor.fg.hex(color)`. + */ + +Cursor.prototype.hex = function (color) { + return this.foreground.hex(color) +} + + +// UTIL FUNCTIONS // + +/** + * Translates a 255 RGB value to a 0-5 ANSI RGV value, + * then returns the single ANSI color code to use. + */ + +function rgb (r, g, b) { + var red = r / 255 * 5 + , green = g / 255 * 5 + , blue = b / 255 * 5 + return rgb5(red, green, blue) +} + +/** + * Turns rgb 0-5 values into a single ANSI color code to use. + */ + +function rgb5 (r, g, b) { + var red = Math.round(r) + , green = Math.round(g) + , blue = Math.round(b) + return 16 + (red*36) + (green*6) + blue +} + +/** + * Accepts a hex CSS color code string (# is optional) and + * translates it into an Array of 3 RGB 0-255 values, which + * can then be used with rgb(). + */ + +function hex (color) { + var c = color[0] === '#' ? color.substring(1) : color + , r = c.substring(0, 2) + , g = c.substring(2, 4) + , b = c.substring(4, 6) + return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)] +} + +/** + * Turns an array-like object into a real array. + */ + +function toArray (a) { + var i = 0 + , l = a.length + , rtn = [] + for (; i 0) { + var len = data.length + , i = 0 + // now try to calculate any deltas + if (typeof data == 'string') { + for (; i` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/index.js new file mode 100644 index 0000000..1685a76 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/index.js @@ -0,0 +1,59 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/package.json new file mode 100644 index 0000000..d7f8fab --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/balanced-match/package.json @@ -0,0 +1,78 @@ +{ + "_from": "balanced-match@^1.0.0", + "_id": "balanced-match@1.0.0", + "_inBundle": true, + "_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "_location": "/cordova-android/balanced-match", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "balanced-match@^1.0.0", + "name": "balanced-match", + "escapedName": "balanced-match", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/brace-expansion" + ], + "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "_shasum": "89b4d199ab2bee49de164ea02b89ce462d71b767", + "_spec": "balanced-match@^1.0.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/brace-expansion", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/balanced-match/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "license": "MIT", + "main": "index.js", + "name": "balanced-match", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "scripts": { + "bench": "make bench", + "test": "make test" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.0.0" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/LICENSE new file mode 100644 index 0000000..96d3f68 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/README.md new file mode 100644 index 0000000..e546d86 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/README.md @@ -0,0 +1,32 @@ +base64-js +========= + +`base64-js` does basic base64 encoding/decoding in pure JS. + +[![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js) + +[![testling badge](https://ci.testling.com/beatgammit/base64-js.png)](https://ci.testling.com/beatgammit/base64-js) + +Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data. + +Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does. + +## install + +With [npm](https://npmjs.org) do: + +`npm install base64-js` + +## methods + +`var base64 = require('base64-js')` + +`base64` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument. + +* `byteLength` - Takes a base64 string and returns length of byte array +* `toByteArray` - Takes a base64 string and returns a byte array +* `fromByteArray` - Takes a byte array and returns a base64 string + +## license + +MIT diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/base64js.min.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/base64js.min.js new file mode 100644 index 0000000..22ad807 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/base64js.min.js @@ -0,0 +1 @@ +(function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,t;return function r(e,t,n){function o(i,a){if(!t[i]){if(!e[i]){var u=typeof require=="function"&&require;if(!a&&u)return u(i,!0);if(f)return f(i,!0);var d=new Error("Cannot find module '"+i+"'");throw d.code="MODULE_NOT_FOUND",d}var c=t[i]={exports:{}};e[i][0].call(c.exports,function(r){var t=e[i][1][r];return o(t?t:r)},c,c.exports,r,e,t,n)}return t[i].exports}var f=typeof require=="function"&&require;for(var i=0;i0){throw new Error("Invalid string. Length must be a multiple of 4")}return r[e-2]==="="?2:r[e-1]==="="?1:0}function c(r){return r.length*3/4-d(r)}function v(r){var e,t,n,i,a,u;var c=r.length;a=d(r);u=new f(c*3/4-a);n=a>0?c-4:c;var v=0;for(e=0,t=0;e>16&255;u[v++]=i>>8&255;u[v++]=i&255}if(a===2){i=o[r.charCodeAt(e)]<<2|o[r.charCodeAt(e+1)]>>4;u[v++]=i&255}else if(a===1){i=o[r.charCodeAt(e)]<<10|o[r.charCodeAt(e+1)]<<4|o[r.charCodeAt(e+2)]>>2;u[v++]=i>>8&255;u[v++]=i&255}return u}function l(r){return n[r>>18&63]+n[r>>12&63]+n[r>>6&63]+n[r&63]}function h(r,e,t){var n;var o=[];for(var f=e;fd?d:u+a))}if(o===1){e=r[t-1];f+=n[e>>2];f+=n[e<<4&63];f+="=="}else if(o===2){e=(r[t-2]<<8)+r[t-1];f+=n[e>>10];f+=n[e>>4&63];f+=n[e<<2&63];f+="="}i.push(f);return i.join("")}},{}]},{},[])("/")}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/index.js new file mode 100644 index 0000000..8e806ac --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/index.js @@ -0,0 +1,114 @@ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 +} + +function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return b64.length * 3 / 4 - placeHoldersCount(b64) +} + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) + + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/package.json new file mode 100644 index 0000000..ac0b810 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/package.json @@ -0,0 +1,66 @@ +{ + "_from": "base64-js@1.2.0", + "_id": "base64-js@1.2.0", + "_inBundle": true, + "_integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "_location": "/cordova-android/base64-js", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "base64-js@1.2.0", + "name": "base64-js", + "escapedName": "base64-js", + "rawSpec": "1.2.0", + "saveSpec": null, + "fetchSpec": "1.2.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/plist" + ], + "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "_shasum": "a39992d723584811982be5e290bb6a53d86700f1", + "_spec": "base64-js@1.2.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/plist", + "author": { + "name": "T. Jameson Little", + "email": "t.jameson.little@gmail.com" + }, + "bugs": { + "url": "https://github.com/beatgammit/base64-js/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Base64 encoding/decoding in pure JS", + "devDependencies": { + "benchmark": "^2.1.0", + "browserify": "^13.0.0", + "standard": "*", + "tape": "4.x", + "uglify-js": "^2.6.2" + }, + "files": [ + "test", + "index.js", + "base64js.min.js" + ], + "homepage": "https://github.com/beatgammit/base64-js", + "keywords": [ + "base64" + ], + "license": "MIT", + "main": "index.js", + "name": "base64-js", + "repository": { + "type": "git", + "url": "git://github.com/beatgammit/base64-js.git" + }, + "scripts": { + "build": "browserify -s base64js -r ./ | uglifyjs -m > base64js.min.js", + "lint": "standard", + "test": "npm run lint && npm run unit", + "unit": "tape test/*.js" + }, + "version": "1.2.0" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/big-data.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/big-data.js new file mode 100644 index 0000000..be16ebe --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/big-data.js @@ -0,0 +1,24 @@ +var test = require('tape') +var b64 = require('../') + +test('convert big data to base64', function (t) { + var b64str, arr, i, length + var big = new Uint8Array(64 * 1024 * 1024) + for (i = 0, length = big.length; i < length; ++i) { + big[i] = i % 256 + } + b64str = b64.fromByteArray(big) + arr = b64.toByteArray(b64str) + t.ok(equal(arr, big)) + t.end() +}) + +function equal (a, b) { + var i + var length = a.length + if (length !== b.length) return false + for (i = 0; i < length; ++i) { + if (a[i] !== b[i]) return false + } + return true +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/convert.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/convert.js new file mode 100644 index 0000000..d68e105 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/convert.js @@ -0,0 +1,48 @@ +var test = require('tape') +var b64 = require('../') +var checks = [ + 'a', + 'aa', + 'aaa', + 'hi', + 'hi!', + 'hi!!', + 'sup', + 'sup?', + 'sup?!' +] + +test('convert to base64 and back', function (t) { + t.plan(checks.length * 2) + + for (var i = 0; i < checks.length; i++) { + var check = checks[i] + var b64Str, arr, str + + b64Str = b64.fromByteArray(map(check, function (char) { return char.charCodeAt(0) })) + + arr = b64.toByteArray(b64Str) + str = map(arr, function (byte) { return String.fromCharCode(byte) }).join('') + + t.equal(check, str, 'Checked ' + check) + t.equal(b64.byteLength(b64Str), arr.length, 'Checked length for ' + check) + } +}) + +function map (arr, callback) { + var res = [] + var kValue, mappedValue + + for (var k = 0, len = arr.length; k < len; k++) { + if ((typeof arr === 'string' && !!arr.charAt(k))) { + kValue = arr.charAt(k) + mappedValue = callback(kValue, k, arr) + res[k] = mappedValue + } else if (typeof arr !== 'string' && k in arr) { + kValue = arr[k] + mappedValue = callback(kValue, k, arr) + res[k] = mappedValue + } + } + return res +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/url-safe.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/url-safe.js new file mode 100644 index 0000000..3203b33 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/base64-js/test/url-safe.js @@ -0,0 +1,18 @@ +var test = require('tape') +var b64 = require('../') + +test('decode url-safe style base64 strings', function (t) { + var expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff] + + var actual = b64.toByteArray('//++/++/++//') + for (var i = 0; i < actual.length; i++) { + t.equal(actual[i], expected[i]) + } + + actual = b64.toByteArray('__--_--_--__') + for (i = 0; i < actual.length; i++) { + t.equal(actual[i], expected[i]) + } + + t.end() +}) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.d.ts b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.d.ts new file mode 100644 index 0000000..a367aa1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.d.ts @@ -0,0 +1,2385 @@ +/** + * Type definitions for BigInteger.js + * Definitions by: Tommy Frazier + */ +export = bigInt; +export as namespace bigInt; + +declare var bigInt: bigInt.BigIntegerStatic; + +declare namespace bigInt { + type BigNumber = number | string | BigInteger; + + interface BigIntegerStatic { + /** + * Equivalent to bigInt(0). + */ + (): BigInteger; + + /** + * Parse a Javascript number into a bigInt. + */ + (number: number): BigInteger; + + /** + * Parse a string into a bigInt. + */ + (string: string, base?: BigNumber): BigInteger; + + /** + * no-op. + */ + (bigInt: BigInteger): BigInteger; + + /** + * Constructs a bigInt from an array of digits in specified base. + * The optional isNegative flag will make the number negative. + */ + fromArray: (digits: BigNumber[], base?: BigNumber, isNegative?: boolean) => BigInteger; + + /** + * Finds the greatest common denominator of a and b. + */ + gcd: (a: BigNumber, b: BigNumber) => BigInteger; + + + /** + * Returns true if x is a BigInteger, false otherwise. + */ + isInstance: (x: any) => boolean; + + /** + * Finds the least common multiple of a and b. + */ + lcm: (a: BigNumber, b: BigNumber) => BigInteger; + + /** + * Returns the largest of a and b. + */ + max: (a: BigNumber, b: BigNumber) => BigInteger; + + /** + * Returns the smallest of a and b. + */ + min: (a: BigNumber, b: BigNumber) => BigInteger; + + /** + * Equivalent to bigInt(-1). + */ + minusOne: BigInteger; + + /** + * Equivalent to bigInt(1). + */ + one: BigInteger; + + /** + * Returns a random number between min and max. + */ + randBetween: (min: BigNumber, max: BigNumber) => BigInteger; + + /** + * Equivalent to bigInt(0). + */ + zero: BigInteger; + } + + interface BigInteger { + /** + * Returns the absolute value of a bigInt. + */ + abs(): BigInteger; + + /** + * Performs addition. + */ + add(number: BigNumber): BigInteger; + + /** + * Performs the bitwise AND operation. + */ + and(number: BigNumber): BigInteger; + + /** + * Returns the number of digits required to represent a bigInt in binary. + */ + bitLength(): BigInteger; + + /** + * Performs a comparison between two numbers. If the numbers are equal, it returns 0. + * If the first number is greater, it returns 1. If the first number is lesser, it returns -1. + */ + compare(number: BigNumber): number; + + /** + * Performs a comparison between the absolute value of two numbers. + */ + compareAbs(number: BigNumber): number; + + /** + * Alias for the compare method. + */ + compareTo(number: BigNumber): number; + + /** + * Performs integer division, disregarding the remainder. + */ + divide(number: BigNumber): BigInteger; + + /** + * Performs division and returns an object with two properties: quotient and remainder. + * The sign of the remainder will match the sign of the dividend. + */ + divmod(number: BigNumber): {quotient: BigInteger, remainder: BigInteger}; + + /** + * Alias for the equals method. + */ + eq(number: BigNumber): boolean; + + /** + * Checks if two numbers are equal. + */ + equals(number: BigNumber): boolean; + + /** + * Alias for the greaterOrEquals method. + */ + geq(number: BigNumber): boolean; + + /** + * Checks if the first number is greater than the second. + */ + greater(number: BigNumber): boolean; + + /** + * Checks if the first number is greater than or equal to the second. + */ + greaterOrEquals(number: BigNumber): boolean; + + /** + * Alias for the greater method. + */ + gt(number: BigNumber): boolean; + + /** + * Returns true if the first number is divisible by the second number, false otherwise. + */ + isDivisibleBy(number: BigNumber): boolean; + + /** + * Returns true if the number is even, false otherwise. + */ + isEven(): boolean; + + /** + * Returns true if the number is negative, false otherwise. + * Returns false for 0 and true for -0. + */ + isNegative(): boolean; + + /** + * Returns true if the number is odd, false otherwise. + */ + isOdd(): boolean; + + /** + * Return true if the number is positive, false otherwise. + * Returns true for 0 and false for -0. + */ + isPositive(): boolean; + + /** + * Returns true if the number is prime, false otherwise. + */ + isPrime(): boolean; + + /** + * Returns true if the number is very likely to be prime, false otherwise. + */ + isProbablePrime(iterations?: number): boolean; + + /** + * Returns true if the number is 1 or -1, false otherwise. + */ + isUnit(): boolean; + + /** + * Return true if the number is 0 or -0, false otherwise. + */ + isZero(): boolean; + + /** + * Alias for the lesserOrEquals method. + */ + leq(number: BigNumber): boolean; + + /** + * Checks if the first number is lesser than the second. + */ + lesser(number: BigNumber): boolean; + + /** + * Checks if the first number is less than or equal to the second. + */ + lesserOrEquals(number: BigNumber): boolean; + + /** + * Alias for the lesser method. + */ + lt(number: BigNumber): boolean; + + /** + * Alias for the subtract method. + */ + minus(number: BigNumber): BigInteger; + + /** + * Performs division and returns the remainder, disregarding the quotient. + * The sign of the remainder will match the sign of the dividend. + */ + mod(number: BigNumber): BigInteger; + + /** + * Finds the multiplicative inverse of the number modulo mod. + */ + modInv(number: BigNumber): BigInteger; + + /** + * Takes the number to the power exp modulo mod. + */ + modPow(exp: BigNumber, mod: BigNumber): BigInteger; + + /** + * Performs multiplication. + */ + multiply(number: BigNumber): BigInteger; + + /** + * Reverses the sign of the number. + */ + negate(): BigInteger; + + /** + * Alias for the notEquals method. + */ + neq(number: BigNumber): boolean; + + /** + * Adds one to the number. + */ + next(): BigInteger; + + /** + * Performs the bitwise NOT operation. + */ + not(): BigInteger; + + /** + * Checks if two numbers are not equal. + */ + notEquals(number: BigNumber): boolean; + + /** + * Performs the bitwise OR operation. + */ + or(number: BigNumber): BigInteger; + + /** + * Alias for the divide method. + */ + over(number: BigNumber): BigInteger; + + /** + * Alias for the add method. + */ + plus(number: BigNumber): BigInteger; + + /** + * Performs exponentiation. If the exponent is less than 0, pow returns 0. + * bigInt.zero.pow(0) returns 1. + */ + pow(number: BigNumber): BigInteger; + + /** + * Subtracts one from the number. + */ + prev(): BigInteger; + + /** + * Alias for the mod method. + */ + remainder(number: BigNumber): BigInteger; + + /** + * Shifts the number left by n places in its binary representation. + * If a negative number is provided, it will shift right. + * + * Throws an error if number is outside of the range [-9007199254740992, 9007199254740992]. + */ + shiftLeft(number: BigNumber): BigInteger; + + /** + * Shifts the number right by n places in its binary representation. + * If a negative number is provided, it will shift left. + * + * Throws an error if number is outside of the range [-9007199254740992, 9007199254740992]. + */ + shiftRight(number: BigNumber): BigInteger; + + /** + * Squares the number. + */ + square(): BigInteger; + + /** + * Performs subtraction. + */ + subtract(number: BigNumber): BigInteger; + + /** + * Alias for the multiply method. + */ + times(number: BigNumber): BigInteger; + + /** + * + * Converts a bigInt to an object representing it as an array of integers module the given radix. + */ + toArray(radix: number): BaseArray; + + /** + * Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range. + */ + toJSNumber(): number; + + /** + * Converts a bigInt to a string. + */ + toString(radix?: number): string; + + /** + * Converts a bigInt to a string. This method is called behind the scenes in JSON.stringify. + */ + toJSON(): string; + + /** + * Converts a bigInt to a native Javascript number. This override allows you to use native + * arithmetic operators without explicit conversion. + */ + valueOf(): number; + + /** + * Performs the bitwise XOR operation. + */ + xor(number: BigNumber): BigInteger; + } + + // Array constant accessors + interface BigIntegerStatic { + '-999': BigInteger; + '-998': BigInteger; + '-997': BigInteger; + '-996': BigInteger; + '-995': BigInteger; + '-994': BigInteger; + '-993': BigInteger; + '-992': BigInteger; + '-991': BigInteger; + '-990': BigInteger; + '-989': BigInteger; + '-988': BigInteger; + '-987': BigInteger; + '-986': BigInteger; + '-985': BigInteger; + '-984': BigInteger; + '-983': BigInteger; + '-982': BigInteger; + '-981': BigInteger; + '-980': BigInteger; + '-979': BigInteger; + '-978': BigInteger; + '-977': BigInteger; + '-976': BigInteger; + '-975': BigInteger; + '-974': BigInteger; + '-973': BigInteger; + '-972': BigInteger; + '-971': BigInteger; + '-970': BigInteger; + '-969': BigInteger; + '-968': BigInteger; + '-967': BigInteger; + '-966': BigInteger; + '-965': BigInteger; + '-964': BigInteger; + '-963': BigInteger; + '-962': BigInteger; + '-961': BigInteger; + '-960': BigInteger; + '-959': BigInteger; + '-958': BigInteger; + '-957': BigInteger; + '-956': BigInteger; + '-955': BigInteger; + '-954': BigInteger; + '-953': BigInteger; + '-952': BigInteger; + '-951': BigInteger; + '-950': BigInteger; + '-949': BigInteger; + '-948': BigInteger; + '-947': BigInteger; + '-946': BigInteger; + '-945': BigInteger; + '-944': BigInteger; + '-943': BigInteger; + '-942': BigInteger; + '-941': BigInteger; + '-940': BigInteger; + '-939': BigInteger; + '-938': BigInteger; + '-937': BigInteger; + '-936': BigInteger; + '-935': BigInteger; + '-934': BigInteger; + '-933': BigInteger; + '-932': BigInteger; + '-931': BigInteger; + '-930': BigInteger; + '-929': BigInteger; + '-928': BigInteger; + '-927': BigInteger; + '-926': BigInteger; + '-925': BigInteger; + '-924': BigInteger; + '-923': BigInteger; + '-922': BigInteger; + '-921': BigInteger; + '-920': BigInteger; + '-919': BigInteger; + '-918': BigInteger; + '-917': BigInteger; + '-916': BigInteger; + '-915': BigInteger; + '-914': BigInteger; + '-913': BigInteger; + '-912': BigInteger; + '-911': BigInteger; + '-910': BigInteger; + '-909': BigInteger; + '-908': BigInteger; + '-907': BigInteger; + '-906': BigInteger; + '-905': BigInteger; + '-904': BigInteger; + '-903': BigInteger; + '-902': BigInteger; + '-901': BigInteger; + '-900': BigInteger; + '-899': BigInteger; + '-898': BigInteger; + '-897': BigInteger; + '-896': BigInteger; + '-895': BigInteger; + '-894': BigInteger; + '-893': BigInteger; + '-892': BigInteger; + '-891': BigInteger; + '-890': BigInteger; + '-889': BigInteger; + '-888': BigInteger; + '-887': BigInteger; + '-886': BigInteger; + '-885': BigInteger; + '-884': BigInteger; + '-883': BigInteger; + '-882': BigInteger; + '-881': BigInteger; + '-880': BigInteger; + '-879': BigInteger; + '-878': BigInteger; + '-877': BigInteger; + '-876': BigInteger; + '-875': BigInteger; + '-874': BigInteger; + '-873': BigInteger; + '-872': BigInteger; + '-871': BigInteger; + '-870': BigInteger; + '-869': BigInteger; + '-868': BigInteger; + '-867': BigInteger; + '-866': BigInteger; + '-865': BigInteger; + '-864': BigInteger; + '-863': BigInteger; + '-862': BigInteger; + '-861': BigInteger; + '-860': BigInteger; + '-859': BigInteger; + '-858': BigInteger; + '-857': BigInteger; + '-856': BigInteger; + '-855': BigInteger; + '-854': BigInteger; + '-853': BigInteger; + '-852': BigInteger; + '-851': BigInteger; + '-850': BigInteger; + '-849': BigInteger; + '-848': BigInteger; + '-847': BigInteger; + '-846': BigInteger; + '-845': BigInteger; + '-844': BigInteger; + '-843': BigInteger; + '-842': BigInteger; + '-841': BigInteger; + '-840': BigInteger; + '-839': BigInteger; + '-838': BigInteger; + '-837': BigInteger; + '-836': BigInteger; + '-835': BigInteger; + '-834': BigInteger; + '-833': BigInteger; + '-832': BigInteger; + '-831': BigInteger; + '-830': BigInteger; + '-829': BigInteger; + '-828': BigInteger; + '-827': BigInteger; + '-826': BigInteger; + '-825': BigInteger; + '-824': BigInteger; + '-823': BigInteger; + '-822': BigInteger; + '-821': BigInteger; + '-820': BigInteger; + '-819': BigInteger; + '-818': BigInteger; + '-817': BigInteger; + '-816': BigInteger; + '-815': BigInteger; + '-814': BigInteger; + '-813': BigInteger; + '-812': BigInteger; + '-811': BigInteger; + '-810': BigInteger; + '-809': BigInteger; + '-808': BigInteger; + '-807': BigInteger; + '-806': BigInteger; + '-805': BigInteger; + '-804': BigInteger; + '-803': BigInteger; + '-802': BigInteger; + '-801': BigInteger; + '-800': BigInteger; + '-799': BigInteger; + '-798': BigInteger; + '-797': BigInteger; + '-796': BigInteger; + '-795': BigInteger; + '-794': BigInteger; + '-793': BigInteger; + '-792': BigInteger; + '-791': BigInteger; + '-790': BigInteger; + '-789': BigInteger; + '-788': BigInteger; + '-787': BigInteger; + '-786': BigInteger; + '-785': BigInteger; + '-784': BigInteger; + '-783': BigInteger; + '-782': BigInteger; + '-781': BigInteger; + '-780': BigInteger; + '-779': BigInteger; + '-778': BigInteger; + '-777': BigInteger; + '-776': BigInteger; + '-775': BigInteger; + '-774': BigInteger; + '-773': BigInteger; + '-772': BigInteger; + '-771': BigInteger; + '-770': BigInteger; + '-769': BigInteger; + '-768': BigInteger; + '-767': BigInteger; + '-766': BigInteger; + '-765': BigInteger; + '-764': BigInteger; + '-763': BigInteger; + '-762': BigInteger; + '-761': BigInteger; + '-760': BigInteger; + '-759': BigInteger; + '-758': BigInteger; + '-757': BigInteger; + '-756': BigInteger; + '-755': BigInteger; + '-754': BigInteger; + '-753': BigInteger; + '-752': BigInteger; + '-751': BigInteger; + '-750': BigInteger; + '-749': BigInteger; + '-748': BigInteger; + '-747': BigInteger; + '-746': BigInteger; + '-745': BigInteger; + '-744': BigInteger; + '-743': BigInteger; + '-742': BigInteger; + '-741': BigInteger; + '-740': BigInteger; + '-739': BigInteger; + '-738': BigInteger; + '-737': BigInteger; + '-736': BigInteger; + '-735': BigInteger; + '-734': BigInteger; + '-733': BigInteger; + '-732': BigInteger; + '-731': BigInteger; + '-730': BigInteger; + '-729': BigInteger; + '-728': BigInteger; + '-727': BigInteger; + '-726': BigInteger; + '-725': BigInteger; + '-724': BigInteger; + '-723': BigInteger; + '-722': BigInteger; + '-721': BigInteger; + '-720': BigInteger; + '-719': BigInteger; + '-718': BigInteger; + '-717': BigInteger; + '-716': BigInteger; + '-715': BigInteger; + '-714': BigInteger; + '-713': BigInteger; + '-712': BigInteger; + '-711': BigInteger; + '-710': BigInteger; + '-709': BigInteger; + '-708': BigInteger; + '-707': BigInteger; + '-706': BigInteger; + '-705': BigInteger; + '-704': BigInteger; + '-703': BigInteger; + '-702': BigInteger; + '-701': BigInteger; + '-700': BigInteger; + '-699': BigInteger; + '-698': BigInteger; + '-697': BigInteger; + '-696': BigInteger; + '-695': BigInteger; + '-694': BigInteger; + '-693': BigInteger; + '-692': BigInteger; + '-691': BigInteger; + '-690': BigInteger; + '-689': BigInteger; + '-688': BigInteger; + '-687': BigInteger; + '-686': BigInteger; + '-685': BigInteger; + '-684': BigInteger; + '-683': BigInteger; + '-682': BigInteger; + '-681': BigInteger; + '-680': BigInteger; + '-679': BigInteger; + '-678': BigInteger; + '-677': BigInteger; + '-676': BigInteger; + '-675': BigInteger; + '-674': BigInteger; + '-673': BigInteger; + '-672': BigInteger; + '-671': BigInteger; + '-670': BigInteger; + '-669': BigInteger; + '-668': BigInteger; + '-667': BigInteger; + '-666': BigInteger; + '-665': BigInteger; + '-664': BigInteger; + '-663': BigInteger; + '-662': BigInteger; + '-661': BigInteger; + '-660': BigInteger; + '-659': BigInteger; + '-658': BigInteger; + '-657': BigInteger; + '-656': BigInteger; + '-655': BigInteger; + '-654': BigInteger; + '-653': BigInteger; + '-652': BigInteger; + '-651': BigInteger; + '-650': BigInteger; + '-649': BigInteger; + '-648': BigInteger; + '-647': BigInteger; + '-646': BigInteger; + '-645': BigInteger; + '-644': BigInteger; + '-643': BigInteger; + '-642': BigInteger; + '-641': BigInteger; + '-640': BigInteger; + '-639': BigInteger; + '-638': BigInteger; + '-637': BigInteger; + '-636': BigInteger; + '-635': BigInteger; + '-634': BigInteger; + '-633': BigInteger; + '-632': BigInteger; + '-631': BigInteger; + '-630': BigInteger; + '-629': BigInteger; + '-628': BigInteger; + '-627': BigInteger; + '-626': BigInteger; + '-625': BigInteger; + '-624': BigInteger; + '-623': BigInteger; + '-622': BigInteger; + '-621': BigInteger; + '-620': BigInteger; + '-619': BigInteger; + '-618': BigInteger; + '-617': BigInteger; + '-616': BigInteger; + '-615': BigInteger; + '-614': BigInteger; + '-613': BigInteger; + '-612': BigInteger; + '-611': BigInteger; + '-610': BigInteger; + '-609': BigInteger; + '-608': BigInteger; + '-607': BigInteger; + '-606': BigInteger; + '-605': BigInteger; + '-604': BigInteger; + '-603': BigInteger; + '-602': BigInteger; + '-601': BigInteger; + '-600': BigInteger; + '-599': BigInteger; + '-598': BigInteger; + '-597': BigInteger; + '-596': BigInteger; + '-595': BigInteger; + '-594': BigInteger; + '-593': BigInteger; + '-592': BigInteger; + '-591': BigInteger; + '-590': BigInteger; + '-589': BigInteger; + '-588': BigInteger; + '-587': BigInteger; + '-586': BigInteger; + '-585': BigInteger; + '-584': BigInteger; + '-583': BigInteger; + '-582': BigInteger; + '-581': BigInteger; + '-580': BigInteger; + '-579': BigInteger; + '-578': BigInteger; + '-577': BigInteger; + '-576': BigInteger; + '-575': BigInteger; + '-574': BigInteger; + '-573': BigInteger; + '-572': BigInteger; + '-571': BigInteger; + '-570': BigInteger; + '-569': BigInteger; + '-568': BigInteger; + '-567': BigInteger; + '-566': BigInteger; + '-565': BigInteger; + '-564': BigInteger; + '-563': BigInteger; + '-562': BigInteger; + '-561': BigInteger; + '-560': BigInteger; + '-559': BigInteger; + '-558': BigInteger; + '-557': BigInteger; + '-556': BigInteger; + '-555': BigInteger; + '-554': BigInteger; + '-553': BigInteger; + '-552': BigInteger; + '-551': BigInteger; + '-550': BigInteger; + '-549': BigInteger; + '-548': BigInteger; + '-547': BigInteger; + '-546': BigInteger; + '-545': BigInteger; + '-544': BigInteger; + '-543': BigInteger; + '-542': BigInteger; + '-541': BigInteger; + '-540': BigInteger; + '-539': BigInteger; + '-538': BigInteger; + '-537': BigInteger; + '-536': BigInteger; + '-535': BigInteger; + '-534': BigInteger; + '-533': BigInteger; + '-532': BigInteger; + '-531': BigInteger; + '-530': BigInteger; + '-529': BigInteger; + '-528': BigInteger; + '-527': BigInteger; + '-526': BigInteger; + '-525': BigInteger; + '-524': BigInteger; + '-523': BigInteger; + '-522': BigInteger; + '-521': BigInteger; + '-520': BigInteger; + '-519': BigInteger; + '-518': BigInteger; + '-517': BigInteger; + '-516': BigInteger; + '-515': BigInteger; + '-514': BigInteger; + '-513': BigInteger; + '-512': BigInteger; + '-511': BigInteger; + '-510': BigInteger; + '-509': BigInteger; + '-508': BigInteger; + '-507': BigInteger; + '-506': BigInteger; + '-505': BigInteger; + '-504': BigInteger; + '-503': BigInteger; + '-502': BigInteger; + '-501': BigInteger; + '-500': BigInteger; + '-499': BigInteger; + '-498': BigInteger; + '-497': BigInteger; + '-496': BigInteger; + '-495': BigInteger; + '-494': BigInteger; + '-493': BigInteger; + '-492': BigInteger; + '-491': BigInteger; + '-490': BigInteger; + '-489': BigInteger; + '-488': BigInteger; + '-487': BigInteger; + '-486': BigInteger; + '-485': BigInteger; + '-484': BigInteger; + '-483': BigInteger; + '-482': BigInteger; + '-481': BigInteger; + '-480': BigInteger; + '-479': BigInteger; + '-478': BigInteger; + '-477': BigInteger; + '-476': BigInteger; + '-475': BigInteger; + '-474': BigInteger; + '-473': BigInteger; + '-472': BigInteger; + '-471': BigInteger; + '-470': BigInteger; + '-469': BigInteger; + '-468': BigInteger; + '-467': BigInteger; + '-466': BigInteger; + '-465': BigInteger; + '-464': BigInteger; + '-463': BigInteger; + '-462': BigInteger; + '-461': BigInteger; + '-460': BigInteger; + '-459': BigInteger; + '-458': BigInteger; + '-457': BigInteger; + '-456': BigInteger; + '-455': BigInteger; + '-454': BigInteger; + '-453': BigInteger; + '-452': BigInteger; + '-451': BigInteger; + '-450': BigInteger; + '-449': BigInteger; + '-448': BigInteger; + '-447': BigInteger; + '-446': BigInteger; + '-445': BigInteger; + '-444': BigInteger; + '-443': BigInteger; + '-442': BigInteger; + '-441': BigInteger; + '-440': BigInteger; + '-439': BigInteger; + '-438': BigInteger; + '-437': BigInteger; + '-436': BigInteger; + '-435': BigInteger; + '-434': BigInteger; + '-433': BigInteger; + '-432': BigInteger; + '-431': BigInteger; + '-430': BigInteger; + '-429': BigInteger; + '-428': BigInteger; + '-427': BigInteger; + '-426': BigInteger; + '-425': BigInteger; + '-424': BigInteger; + '-423': BigInteger; + '-422': BigInteger; + '-421': BigInteger; + '-420': BigInteger; + '-419': BigInteger; + '-418': BigInteger; + '-417': BigInteger; + '-416': BigInteger; + '-415': BigInteger; + '-414': BigInteger; + '-413': BigInteger; + '-412': BigInteger; + '-411': BigInteger; + '-410': BigInteger; + '-409': BigInteger; + '-408': BigInteger; + '-407': BigInteger; + '-406': BigInteger; + '-405': BigInteger; + '-404': BigInteger; + '-403': BigInteger; + '-402': BigInteger; + '-401': BigInteger; + '-400': BigInteger; + '-399': BigInteger; + '-398': BigInteger; + '-397': BigInteger; + '-396': BigInteger; + '-395': BigInteger; + '-394': BigInteger; + '-393': BigInteger; + '-392': BigInteger; + '-391': BigInteger; + '-390': BigInteger; + '-389': BigInteger; + '-388': BigInteger; + '-387': BigInteger; + '-386': BigInteger; + '-385': BigInteger; + '-384': BigInteger; + '-383': BigInteger; + '-382': BigInteger; + '-381': BigInteger; + '-380': BigInteger; + '-379': BigInteger; + '-378': BigInteger; + '-377': BigInteger; + '-376': BigInteger; + '-375': BigInteger; + '-374': BigInteger; + '-373': BigInteger; + '-372': BigInteger; + '-371': BigInteger; + '-370': BigInteger; + '-369': BigInteger; + '-368': BigInteger; + '-367': BigInteger; + '-366': BigInteger; + '-365': BigInteger; + '-364': BigInteger; + '-363': BigInteger; + '-362': BigInteger; + '-361': BigInteger; + '-360': BigInteger; + '-359': BigInteger; + '-358': BigInteger; + '-357': BigInteger; + '-356': BigInteger; + '-355': BigInteger; + '-354': BigInteger; + '-353': BigInteger; + '-352': BigInteger; + '-351': BigInteger; + '-350': BigInteger; + '-349': BigInteger; + '-348': BigInteger; + '-347': BigInteger; + '-346': BigInteger; + '-345': BigInteger; + '-344': BigInteger; + '-343': BigInteger; + '-342': BigInteger; + '-341': BigInteger; + '-340': BigInteger; + '-339': BigInteger; + '-338': BigInteger; + '-337': BigInteger; + '-336': BigInteger; + '-335': BigInteger; + '-334': BigInteger; + '-333': BigInteger; + '-332': BigInteger; + '-331': BigInteger; + '-330': BigInteger; + '-329': BigInteger; + '-328': BigInteger; + '-327': BigInteger; + '-326': BigInteger; + '-325': BigInteger; + '-324': BigInteger; + '-323': BigInteger; + '-322': BigInteger; + '-321': BigInteger; + '-320': BigInteger; + '-319': BigInteger; + '-318': BigInteger; + '-317': BigInteger; + '-316': BigInteger; + '-315': BigInteger; + '-314': BigInteger; + '-313': BigInteger; + '-312': BigInteger; + '-311': BigInteger; + '-310': BigInteger; + '-309': BigInteger; + '-308': BigInteger; + '-307': BigInteger; + '-306': BigInteger; + '-305': BigInteger; + '-304': BigInteger; + '-303': BigInteger; + '-302': BigInteger; + '-301': BigInteger; + '-300': BigInteger; + '-299': BigInteger; + '-298': BigInteger; + '-297': BigInteger; + '-296': BigInteger; + '-295': BigInteger; + '-294': BigInteger; + '-293': BigInteger; + '-292': BigInteger; + '-291': BigInteger; + '-290': BigInteger; + '-289': BigInteger; + '-288': BigInteger; + '-287': BigInteger; + '-286': BigInteger; + '-285': BigInteger; + '-284': BigInteger; + '-283': BigInteger; + '-282': BigInteger; + '-281': BigInteger; + '-280': BigInteger; + '-279': BigInteger; + '-278': BigInteger; + '-277': BigInteger; + '-276': BigInteger; + '-275': BigInteger; + '-274': BigInteger; + '-273': BigInteger; + '-272': BigInteger; + '-271': BigInteger; + '-270': BigInteger; + '-269': BigInteger; + '-268': BigInteger; + '-267': BigInteger; + '-266': BigInteger; + '-265': BigInteger; + '-264': BigInteger; + '-263': BigInteger; + '-262': BigInteger; + '-261': BigInteger; + '-260': BigInteger; + '-259': BigInteger; + '-258': BigInteger; + '-257': BigInteger; + '-256': BigInteger; + '-255': BigInteger; + '-254': BigInteger; + '-253': BigInteger; + '-252': BigInteger; + '-251': BigInteger; + '-250': BigInteger; + '-249': BigInteger; + '-248': BigInteger; + '-247': BigInteger; + '-246': BigInteger; + '-245': BigInteger; + '-244': BigInteger; + '-243': BigInteger; + '-242': BigInteger; + '-241': BigInteger; + '-240': BigInteger; + '-239': BigInteger; + '-238': BigInteger; + '-237': BigInteger; + '-236': BigInteger; + '-235': BigInteger; + '-234': BigInteger; + '-233': BigInteger; + '-232': BigInteger; + '-231': BigInteger; + '-230': BigInteger; + '-229': BigInteger; + '-228': BigInteger; + '-227': BigInteger; + '-226': BigInteger; + '-225': BigInteger; + '-224': BigInteger; + '-223': BigInteger; + '-222': BigInteger; + '-221': BigInteger; + '-220': BigInteger; + '-219': BigInteger; + '-218': BigInteger; + '-217': BigInteger; + '-216': BigInteger; + '-215': BigInteger; + '-214': BigInteger; + '-213': BigInteger; + '-212': BigInteger; + '-211': BigInteger; + '-210': BigInteger; + '-209': BigInteger; + '-208': BigInteger; + '-207': BigInteger; + '-206': BigInteger; + '-205': BigInteger; + '-204': BigInteger; + '-203': BigInteger; + '-202': BigInteger; + '-201': BigInteger; + '-200': BigInteger; + '-199': BigInteger; + '-198': BigInteger; + '-197': BigInteger; + '-196': BigInteger; + '-195': BigInteger; + '-194': BigInteger; + '-193': BigInteger; + '-192': BigInteger; + '-191': BigInteger; + '-190': BigInteger; + '-189': BigInteger; + '-188': BigInteger; + '-187': BigInteger; + '-186': BigInteger; + '-185': BigInteger; + '-184': BigInteger; + '-183': BigInteger; + '-182': BigInteger; + '-181': BigInteger; + '-180': BigInteger; + '-179': BigInteger; + '-178': BigInteger; + '-177': BigInteger; + '-176': BigInteger; + '-175': BigInteger; + '-174': BigInteger; + '-173': BigInteger; + '-172': BigInteger; + '-171': BigInteger; + '-170': BigInteger; + '-169': BigInteger; + '-168': BigInteger; + '-167': BigInteger; + '-166': BigInteger; + '-165': BigInteger; + '-164': BigInteger; + '-163': BigInteger; + '-162': BigInteger; + '-161': BigInteger; + '-160': BigInteger; + '-159': BigInteger; + '-158': BigInteger; + '-157': BigInteger; + '-156': BigInteger; + '-155': BigInteger; + '-154': BigInteger; + '-153': BigInteger; + '-152': BigInteger; + '-151': BigInteger; + '-150': BigInteger; + '-149': BigInteger; + '-148': BigInteger; + '-147': BigInteger; + '-146': BigInteger; + '-145': BigInteger; + '-144': BigInteger; + '-143': BigInteger; + '-142': BigInteger; + '-141': BigInteger; + '-140': BigInteger; + '-139': BigInteger; + '-138': BigInteger; + '-137': BigInteger; + '-136': BigInteger; + '-135': BigInteger; + '-134': BigInteger; + '-133': BigInteger; + '-132': BigInteger; + '-131': BigInteger; + '-130': BigInteger; + '-129': BigInteger; + '-128': BigInteger; + '-127': BigInteger; + '-126': BigInteger; + '-125': BigInteger; + '-124': BigInteger; + '-123': BigInteger; + '-122': BigInteger; + '-121': BigInteger; + '-120': BigInteger; + '-119': BigInteger; + '-118': BigInteger; + '-117': BigInteger; + '-116': BigInteger; + '-115': BigInteger; + '-114': BigInteger; + '-113': BigInteger; + '-112': BigInteger; + '-111': BigInteger; + '-110': BigInteger; + '-109': BigInteger; + '-108': BigInteger; + '-107': BigInteger; + '-106': BigInteger; + '-105': BigInteger; + '-104': BigInteger; + '-103': BigInteger; + '-102': BigInteger; + '-101': BigInteger; + '-100': BigInteger; + '-99': BigInteger; + '-98': BigInteger; + '-97': BigInteger; + '-96': BigInteger; + '-95': BigInteger; + '-94': BigInteger; + '-93': BigInteger; + '-92': BigInteger; + '-91': BigInteger; + '-90': BigInteger; + '-89': BigInteger; + '-88': BigInteger; + '-87': BigInteger; + '-86': BigInteger; + '-85': BigInteger; + '-84': BigInteger; + '-83': BigInteger; + '-82': BigInteger; + '-81': BigInteger; + '-80': BigInteger; + '-79': BigInteger; + '-78': BigInteger; + '-77': BigInteger; + '-76': BigInteger; + '-75': BigInteger; + '-74': BigInteger; + '-73': BigInteger; + '-72': BigInteger; + '-71': BigInteger; + '-70': BigInteger; + '-69': BigInteger; + '-68': BigInteger; + '-67': BigInteger; + '-66': BigInteger; + '-65': BigInteger; + '-64': BigInteger; + '-63': BigInteger; + '-62': BigInteger; + '-61': BigInteger; + '-60': BigInteger; + '-59': BigInteger; + '-58': BigInteger; + '-57': BigInteger; + '-56': BigInteger; + '-55': BigInteger; + '-54': BigInteger; + '-53': BigInteger; + '-52': BigInteger; + '-51': BigInteger; + '-50': BigInteger; + '-49': BigInteger; + '-48': BigInteger; + '-47': BigInteger; + '-46': BigInteger; + '-45': BigInteger; + '-44': BigInteger; + '-43': BigInteger; + '-42': BigInteger; + '-41': BigInteger; + '-40': BigInteger; + '-39': BigInteger; + '-38': BigInteger; + '-37': BigInteger; + '-36': BigInteger; + '-35': BigInteger; + '-34': BigInteger; + '-33': BigInteger; + '-32': BigInteger; + '-31': BigInteger; + '-30': BigInteger; + '-29': BigInteger; + '-28': BigInteger; + '-27': BigInteger; + '-26': BigInteger; + '-25': BigInteger; + '-24': BigInteger; + '-23': BigInteger; + '-22': BigInteger; + '-21': BigInteger; + '-20': BigInteger; + '-19': BigInteger; + '-18': BigInteger; + '-17': BigInteger; + '-16': BigInteger; + '-15': BigInteger; + '-14': BigInteger; + '-13': BigInteger; + '-12': BigInteger; + '-11': BigInteger; + '-10': BigInteger; + '-9': BigInteger; + '-8': BigInteger; + '-7': BigInteger; + '-6': BigInteger; + '-5': BigInteger; + '-4': BigInteger; + '-3': BigInteger; + '-2': BigInteger; + '-1': BigInteger; + '0': BigInteger; + '1': BigInteger; + '2': BigInteger; + '3': BigInteger; + '4': BigInteger; + '5': BigInteger; + '6': BigInteger; + '7': BigInteger; + '8': BigInteger; + '9': BigInteger; + '10': BigInteger; + '11': BigInteger; + '12': BigInteger; + '13': BigInteger; + '14': BigInteger; + '15': BigInteger; + '16': BigInteger; + '17': BigInteger; + '18': BigInteger; + '19': BigInteger; + '20': BigInteger; + '21': BigInteger; + '22': BigInteger; + '23': BigInteger; + '24': BigInteger; + '25': BigInteger; + '26': BigInteger; + '27': BigInteger; + '28': BigInteger; + '29': BigInteger; + '30': BigInteger; + '31': BigInteger; + '32': BigInteger; + '33': BigInteger; + '34': BigInteger; + '35': BigInteger; + '36': BigInteger; + '37': BigInteger; + '38': BigInteger; + '39': BigInteger; + '40': BigInteger; + '41': BigInteger; + '42': BigInteger; + '43': BigInteger; + '44': BigInteger; + '45': BigInteger; + '46': BigInteger; + '47': BigInteger; + '48': BigInteger; + '49': BigInteger; + '50': BigInteger; + '51': BigInteger; + '52': BigInteger; + '53': BigInteger; + '54': BigInteger; + '55': BigInteger; + '56': BigInteger; + '57': BigInteger; + '58': BigInteger; + '59': BigInteger; + '60': BigInteger; + '61': BigInteger; + '62': BigInteger; + '63': BigInteger; + '64': BigInteger; + '65': BigInteger; + '66': BigInteger; + '67': BigInteger; + '68': BigInteger; + '69': BigInteger; + '70': BigInteger; + '71': BigInteger; + '72': BigInteger; + '73': BigInteger; + '74': BigInteger; + '75': BigInteger; + '76': BigInteger; + '77': BigInteger; + '78': BigInteger; + '79': BigInteger; + '80': BigInteger; + '81': BigInteger; + '82': BigInteger; + '83': BigInteger; + '84': BigInteger; + '85': BigInteger; + '86': BigInteger; + '87': BigInteger; + '88': BigInteger; + '89': BigInteger; + '90': BigInteger; + '91': BigInteger; + '92': BigInteger; + '93': BigInteger; + '94': BigInteger; + '95': BigInteger; + '96': BigInteger; + '97': BigInteger; + '98': BigInteger; + '99': BigInteger; + '100': BigInteger; + '101': BigInteger; + '102': BigInteger; + '103': BigInteger; + '104': BigInteger; + '105': BigInteger; + '106': BigInteger; + '107': BigInteger; + '108': BigInteger; + '109': BigInteger; + '110': BigInteger; + '111': BigInteger; + '112': BigInteger; + '113': BigInteger; + '114': BigInteger; + '115': BigInteger; + '116': BigInteger; + '117': BigInteger; + '118': BigInteger; + '119': BigInteger; + '120': BigInteger; + '121': BigInteger; + '122': BigInteger; + '123': BigInteger; + '124': BigInteger; + '125': BigInteger; + '126': BigInteger; + '127': BigInteger; + '128': BigInteger; + '129': BigInteger; + '130': BigInteger; + '131': BigInteger; + '132': BigInteger; + '133': BigInteger; + '134': BigInteger; + '135': BigInteger; + '136': BigInteger; + '137': BigInteger; + '138': BigInteger; + '139': BigInteger; + '140': BigInteger; + '141': BigInteger; + '142': BigInteger; + '143': BigInteger; + '144': BigInteger; + '145': BigInteger; + '146': BigInteger; + '147': BigInteger; + '148': BigInteger; + '149': BigInteger; + '150': BigInteger; + '151': BigInteger; + '152': BigInteger; + '153': BigInteger; + '154': BigInteger; + '155': BigInteger; + '156': BigInteger; + '157': BigInteger; + '158': BigInteger; + '159': BigInteger; + '160': BigInteger; + '161': BigInteger; + '162': BigInteger; + '163': BigInteger; + '164': BigInteger; + '165': BigInteger; + '166': BigInteger; + '167': BigInteger; + '168': BigInteger; + '169': BigInteger; + '170': BigInteger; + '171': BigInteger; + '172': BigInteger; + '173': BigInteger; + '174': BigInteger; + '175': BigInteger; + '176': BigInteger; + '177': BigInteger; + '178': BigInteger; + '179': BigInteger; + '180': BigInteger; + '181': BigInteger; + '182': BigInteger; + '183': BigInteger; + '184': BigInteger; + '185': BigInteger; + '186': BigInteger; + '187': BigInteger; + '188': BigInteger; + '189': BigInteger; + '190': BigInteger; + '191': BigInteger; + '192': BigInteger; + '193': BigInteger; + '194': BigInteger; + '195': BigInteger; + '196': BigInteger; + '197': BigInteger; + '198': BigInteger; + '199': BigInteger; + '200': BigInteger; + '201': BigInteger; + '202': BigInteger; + '203': BigInteger; + '204': BigInteger; + '205': BigInteger; + '206': BigInteger; + '207': BigInteger; + '208': BigInteger; + '209': BigInteger; + '210': BigInteger; + '211': BigInteger; + '212': BigInteger; + '213': BigInteger; + '214': BigInteger; + '215': BigInteger; + '216': BigInteger; + '217': BigInteger; + '218': BigInteger; + '219': BigInteger; + '220': BigInteger; + '221': BigInteger; + '222': BigInteger; + '223': BigInteger; + '224': BigInteger; + '225': BigInteger; + '226': BigInteger; + '227': BigInteger; + '228': BigInteger; + '229': BigInteger; + '230': BigInteger; + '231': BigInteger; + '232': BigInteger; + '233': BigInteger; + '234': BigInteger; + '235': BigInteger; + '236': BigInteger; + '237': BigInteger; + '238': BigInteger; + '239': BigInteger; + '240': BigInteger; + '241': BigInteger; + '242': BigInteger; + '243': BigInteger; + '244': BigInteger; + '245': BigInteger; + '246': BigInteger; + '247': BigInteger; + '248': BigInteger; + '249': BigInteger; + '250': BigInteger; + '251': BigInteger; + '252': BigInteger; + '253': BigInteger; + '254': BigInteger; + '255': BigInteger; + '256': BigInteger; + '257': BigInteger; + '258': BigInteger; + '259': BigInteger; + '260': BigInteger; + '261': BigInteger; + '262': BigInteger; + '263': BigInteger; + '264': BigInteger; + '265': BigInteger; + '266': BigInteger; + '267': BigInteger; + '268': BigInteger; + '269': BigInteger; + '270': BigInteger; + '271': BigInteger; + '272': BigInteger; + '273': BigInteger; + '274': BigInteger; + '275': BigInteger; + '276': BigInteger; + '277': BigInteger; + '278': BigInteger; + '279': BigInteger; + '280': BigInteger; + '281': BigInteger; + '282': BigInteger; + '283': BigInteger; + '284': BigInteger; + '285': BigInteger; + '286': BigInteger; + '287': BigInteger; + '288': BigInteger; + '289': BigInteger; + '290': BigInteger; + '291': BigInteger; + '292': BigInteger; + '293': BigInteger; + '294': BigInteger; + '295': BigInteger; + '296': BigInteger; + '297': BigInteger; + '298': BigInteger; + '299': BigInteger; + '300': BigInteger; + '301': BigInteger; + '302': BigInteger; + '303': BigInteger; + '304': BigInteger; + '305': BigInteger; + '306': BigInteger; + '307': BigInteger; + '308': BigInteger; + '309': BigInteger; + '310': BigInteger; + '311': BigInteger; + '312': BigInteger; + '313': BigInteger; + '314': BigInteger; + '315': BigInteger; + '316': BigInteger; + '317': BigInteger; + '318': BigInteger; + '319': BigInteger; + '320': BigInteger; + '321': BigInteger; + '322': BigInteger; + '323': BigInteger; + '324': BigInteger; + '325': BigInteger; + '326': BigInteger; + '327': BigInteger; + '328': BigInteger; + '329': BigInteger; + '330': BigInteger; + '331': BigInteger; + '332': BigInteger; + '333': BigInteger; + '334': BigInteger; + '335': BigInteger; + '336': BigInteger; + '337': BigInteger; + '338': BigInteger; + '339': BigInteger; + '340': BigInteger; + '341': BigInteger; + '342': BigInteger; + '343': BigInteger; + '344': BigInteger; + '345': BigInteger; + '346': BigInteger; + '347': BigInteger; + '348': BigInteger; + '349': BigInteger; + '350': BigInteger; + '351': BigInteger; + '352': BigInteger; + '353': BigInteger; + '354': BigInteger; + '355': BigInteger; + '356': BigInteger; + '357': BigInteger; + '358': BigInteger; + '359': BigInteger; + '360': BigInteger; + '361': BigInteger; + '362': BigInteger; + '363': BigInteger; + '364': BigInteger; + '365': BigInteger; + '366': BigInteger; + '367': BigInteger; + '368': BigInteger; + '369': BigInteger; + '370': BigInteger; + '371': BigInteger; + '372': BigInteger; + '373': BigInteger; + '374': BigInteger; + '375': BigInteger; + '376': BigInteger; + '377': BigInteger; + '378': BigInteger; + '379': BigInteger; + '380': BigInteger; + '381': BigInteger; + '382': BigInteger; + '383': BigInteger; + '384': BigInteger; + '385': BigInteger; + '386': BigInteger; + '387': BigInteger; + '388': BigInteger; + '389': BigInteger; + '390': BigInteger; + '391': BigInteger; + '392': BigInteger; + '393': BigInteger; + '394': BigInteger; + '395': BigInteger; + '396': BigInteger; + '397': BigInteger; + '398': BigInteger; + '399': BigInteger; + '400': BigInteger; + '401': BigInteger; + '402': BigInteger; + '403': BigInteger; + '404': BigInteger; + '405': BigInteger; + '406': BigInteger; + '407': BigInteger; + '408': BigInteger; + '409': BigInteger; + '410': BigInteger; + '411': BigInteger; + '412': BigInteger; + '413': BigInteger; + '414': BigInteger; + '415': BigInteger; + '416': BigInteger; + '417': BigInteger; + '418': BigInteger; + '419': BigInteger; + '420': BigInteger; + '421': BigInteger; + '422': BigInteger; + '423': BigInteger; + '424': BigInteger; + '425': BigInteger; + '426': BigInteger; + '427': BigInteger; + '428': BigInteger; + '429': BigInteger; + '430': BigInteger; + '431': BigInteger; + '432': BigInteger; + '433': BigInteger; + '434': BigInteger; + '435': BigInteger; + '436': BigInteger; + '437': BigInteger; + '438': BigInteger; + '439': BigInteger; + '440': BigInteger; + '441': BigInteger; + '442': BigInteger; + '443': BigInteger; + '444': BigInteger; + '445': BigInteger; + '446': BigInteger; + '447': BigInteger; + '448': BigInteger; + '449': BigInteger; + '450': BigInteger; + '451': BigInteger; + '452': BigInteger; + '453': BigInteger; + '454': BigInteger; + '455': BigInteger; + '456': BigInteger; + '457': BigInteger; + '458': BigInteger; + '459': BigInteger; + '460': BigInteger; + '461': BigInteger; + '462': BigInteger; + '463': BigInteger; + '464': BigInteger; + '465': BigInteger; + '466': BigInteger; + '467': BigInteger; + '468': BigInteger; + '469': BigInteger; + '470': BigInteger; + '471': BigInteger; + '472': BigInteger; + '473': BigInteger; + '474': BigInteger; + '475': BigInteger; + '476': BigInteger; + '477': BigInteger; + '478': BigInteger; + '479': BigInteger; + '480': BigInteger; + '481': BigInteger; + '482': BigInteger; + '483': BigInteger; + '484': BigInteger; + '485': BigInteger; + '486': BigInteger; + '487': BigInteger; + '488': BigInteger; + '489': BigInteger; + '490': BigInteger; + '491': BigInteger; + '492': BigInteger; + '493': BigInteger; + '494': BigInteger; + '495': BigInteger; + '496': BigInteger; + '497': BigInteger; + '498': BigInteger; + '499': BigInteger; + '500': BigInteger; + '501': BigInteger; + '502': BigInteger; + '503': BigInteger; + '504': BigInteger; + '505': BigInteger; + '506': BigInteger; + '507': BigInteger; + '508': BigInteger; + '509': BigInteger; + '510': BigInteger; + '511': BigInteger; + '512': BigInteger; + '513': BigInteger; + '514': BigInteger; + '515': BigInteger; + '516': BigInteger; + '517': BigInteger; + '518': BigInteger; + '519': BigInteger; + '520': BigInteger; + '521': BigInteger; + '522': BigInteger; + '523': BigInteger; + '524': BigInteger; + '525': BigInteger; + '526': BigInteger; + '527': BigInteger; + '528': BigInteger; + '529': BigInteger; + '530': BigInteger; + '531': BigInteger; + '532': BigInteger; + '533': BigInteger; + '534': BigInteger; + '535': BigInteger; + '536': BigInteger; + '537': BigInteger; + '538': BigInteger; + '539': BigInteger; + '540': BigInteger; + '541': BigInteger; + '542': BigInteger; + '543': BigInteger; + '544': BigInteger; + '545': BigInteger; + '546': BigInteger; + '547': BigInteger; + '548': BigInteger; + '549': BigInteger; + '550': BigInteger; + '551': BigInteger; + '552': BigInteger; + '553': BigInteger; + '554': BigInteger; + '555': BigInteger; + '556': BigInteger; + '557': BigInteger; + '558': BigInteger; + '559': BigInteger; + '560': BigInteger; + '561': BigInteger; + '562': BigInteger; + '563': BigInteger; + '564': BigInteger; + '565': BigInteger; + '566': BigInteger; + '567': BigInteger; + '568': BigInteger; + '569': BigInteger; + '570': BigInteger; + '571': BigInteger; + '572': BigInteger; + '573': BigInteger; + '574': BigInteger; + '575': BigInteger; + '576': BigInteger; + '577': BigInteger; + '578': BigInteger; + '579': BigInteger; + '580': BigInteger; + '581': BigInteger; + '582': BigInteger; + '583': BigInteger; + '584': BigInteger; + '585': BigInteger; + '586': BigInteger; + '587': BigInteger; + '588': BigInteger; + '589': BigInteger; + '590': BigInteger; + '591': BigInteger; + '592': BigInteger; + '593': BigInteger; + '594': BigInteger; + '595': BigInteger; + '596': BigInteger; + '597': BigInteger; + '598': BigInteger; + '599': BigInteger; + '600': BigInteger; + '601': BigInteger; + '602': BigInteger; + '603': BigInteger; + '604': BigInteger; + '605': BigInteger; + '606': BigInteger; + '607': BigInteger; + '608': BigInteger; + '609': BigInteger; + '610': BigInteger; + '611': BigInteger; + '612': BigInteger; + '613': BigInteger; + '614': BigInteger; + '615': BigInteger; + '616': BigInteger; + '617': BigInteger; + '618': BigInteger; + '619': BigInteger; + '620': BigInteger; + '621': BigInteger; + '622': BigInteger; + '623': BigInteger; + '624': BigInteger; + '625': BigInteger; + '626': BigInteger; + '627': BigInteger; + '628': BigInteger; + '629': BigInteger; + '630': BigInteger; + '631': BigInteger; + '632': BigInteger; + '633': BigInteger; + '634': BigInteger; + '635': BigInteger; + '636': BigInteger; + '637': BigInteger; + '638': BigInteger; + '639': BigInteger; + '640': BigInteger; + '641': BigInteger; + '642': BigInteger; + '643': BigInteger; + '644': BigInteger; + '645': BigInteger; + '646': BigInteger; + '647': BigInteger; + '648': BigInteger; + '649': BigInteger; + '650': BigInteger; + '651': BigInteger; + '652': BigInteger; + '653': BigInteger; + '654': BigInteger; + '655': BigInteger; + '656': BigInteger; + '657': BigInteger; + '658': BigInteger; + '659': BigInteger; + '660': BigInteger; + '661': BigInteger; + '662': BigInteger; + '663': BigInteger; + '664': BigInteger; + '665': BigInteger; + '666': BigInteger; + '667': BigInteger; + '668': BigInteger; + '669': BigInteger; + '670': BigInteger; + '671': BigInteger; + '672': BigInteger; + '673': BigInteger; + '674': BigInteger; + '675': BigInteger; + '676': BigInteger; + '677': BigInteger; + '678': BigInteger; + '679': BigInteger; + '680': BigInteger; + '681': BigInteger; + '682': BigInteger; + '683': BigInteger; + '684': BigInteger; + '685': BigInteger; + '686': BigInteger; + '687': BigInteger; + '688': BigInteger; + '689': BigInteger; + '690': BigInteger; + '691': BigInteger; + '692': BigInteger; + '693': BigInteger; + '694': BigInteger; + '695': BigInteger; + '696': BigInteger; + '697': BigInteger; + '698': BigInteger; + '699': BigInteger; + '700': BigInteger; + '701': BigInteger; + '702': BigInteger; + '703': BigInteger; + '704': BigInteger; + '705': BigInteger; + '706': BigInteger; + '707': BigInteger; + '708': BigInteger; + '709': BigInteger; + '710': BigInteger; + '711': BigInteger; + '712': BigInteger; + '713': BigInteger; + '714': BigInteger; + '715': BigInteger; + '716': BigInteger; + '717': BigInteger; + '718': BigInteger; + '719': BigInteger; + '720': BigInteger; + '721': BigInteger; + '722': BigInteger; + '723': BigInteger; + '724': BigInteger; + '725': BigInteger; + '726': BigInteger; + '727': BigInteger; + '728': BigInteger; + '729': BigInteger; + '730': BigInteger; + '731': BigInteger; + '732': BigInteger; + '733': BigInteger; + '734': BigInteger; + '735': BigInteger; + '736': BigInteger; + '737': BigInteger; + '738': BigInteger; + '739': BigInteger; + '740': BigInteger; + '741': BigInteger; + '742': BigInteger; + '743': BigInteger; + '744': BigInteger; + '745': BigInteger; + '746': BigInteger; + '747': BigInteger; + '748': BigInteger; + '749': BigInteger; + '750': BigInteger; + '751': BigInteger; + '752': BigInteger; + '753': BigInteger; + '754': BigInteger; + '755': BigInteger; + '756': BigInteger; + '757': BigInteger; + '758': BigInteger; + '759': BigInteger; + '760': BigInteger; + '761': BigInteger; + '762': BigInteger; + '763': BigInteger; + '764': BigInteger; + '765': BigInteger; + '766': BigInteger; + '767': BigInteger; + '768': BigInteger; + '769': BigInteger; + '770': BigInteger; + '771': BigInteger; + '772': BigInteger; + '773': BigInteger; + '774': BigInteger; + '775': BigInteger; + '776': BigInteger; + '777': BigInteger; + '778': BigInteger; + '779': BigInteger; + '780': BigInteger; + '781': BigInteger; + '782': BigInteger; + '783': BigInteger; + '784': BigInteger; + '785': BigInteger; + '786': BigInteger; + '787': BigInteger; + '788': BigInteger; + '789': BigInteger; + '790': BigInteger; + '791': BigInteger; + '792': BigInteger; + '793': BigInteger; + '794': BigInteger; + '795': BigInteger; + '796': BigInteger; + '797': BigInteger; + '798': BigInteger; + '799': BigInteger; + '800': BigInteger; + '801': BigInteger; + '802': BigInteger; + '803': BigInteger; + '804': BigInteger; + '805': BigInteger; + '806': BigInteger; + '807': BigInteger; + '808': BigInteger; + '809': BigInteger; + '810': BigInteger; + '811': BigInteger; + '812': BigInteger; + '813': BigInteger; + '814': BigInteger; + '815': BigInteger; + '816': BigInteger; + '817': BigInteger; + '818': BigInteger; + '819': BigInteger; + '820': BigInteger; + '821': BigInteger; + '822': BigInteger; + '823': BigInteger; + '824': BigInteger; + '825': BigInteger; + '826': BigInteger; + '827': BigInteger; + '828': BigInteger; + '829': BigInteger; + '830': BigInteger; + '831': BigInteger; + '832': BigInteger; + '833': BigInteger; + '834': BigInteger; + '835': BigInteger; + '836': BigInteger; + '837': BigInteger; + '838': BigInteger; + '839': BigInteger; + '840': BigInteger; + '841': BigInteger; + '842': BigInteger; + '843': BigInteger; + '844': BigInteger; + '845': BigInteger; + '846': BigInteger; + '847': BigInteger; + '848': BigInteger; + '849': BigInteger; + '850': BigInteger; + '851': BigInteger; + '852': BigInteger; + '853': BigInteger; + '854': BigInteger; + '855': BigInteger; + '856': BigInteger; + '857': BigInteger; + '858': BigInteger; + '859': BigInteger; + '860': BigInteger; + '861': BigInteger; + '862': BigInteger; + '863': BigInteger; + '864': BigInteger; + '865': BigInteger; + '866': BigInteger; + '867': BigInteger; + '868': BigInteger; + '869': BigInteger; + '870': BigInteger; + '871': BigInteger; + '872': BigInteger; + '873': BigInteger; + '874': BigInteger; + '875': BigInteger; + '876': BigInteger; + '877': BigInteger; + '878': BigInteger; + '879': BigInteger; + '880': BigInteger; + '881': BigInteger; + '882': BigInteger; + '883': BigInteger; + '884': BigInteger; + '885': BigInteger; + '886': BigInteger; + '887': BigInteger; + '888': BigInteger; + '889': BigInteger; + '890': BigInteger; + '891': BigInteger; + '892': BigInteger; + '893': BigInteger; + '894': BigInteger; + '895': BigInteger; + '896': BigInteger; + '897': BigInteger; + '898': BigInteger; + '899': BigInteger; + '900': BigInteger; + '901': BigInteger; + '902': BigInteger; + '903': BigInteger; + '904': BigInteger; + '905': BigInteger; + '906': BigInteger; + '907': BigInteger; + '908': BigInteger; + '909': BigInteger; + '910': BigInteger; + '911': BigInteger; + '912': BigInteger; + '913': BigInteger; + '914': BigInteger; + '915': BigInteger; + '916': BigInteger; + '917': BigInteger; + '918': BigInteger; + '919': BigInteger; + '920': BigInteger; + '921': BigInteger; + '922': BigInteger; + '923': BigInteger; + '924': BigInteger; + '925': BigInteger; + '926': BigInteger; + '927': BigInteger; + '928': BigInteger; + '929': BigInteger; + '930': BigInteger; + '931': BigInteger; + '932': BigInteger; + '933': BigInteger; + '934': BigInteger; + '935': BigInteger; + '936': BigInteger; + '937': BigInteger; + '938': BigInteger; + '939': BigInteger; + '940': BigInteger; + '941': BigInteger; + '942': BigInteger; + '943': BigInteger; + '944': BigInteger; + '945': BigInteger; + '946': BigInteger; + '947': BigInteger; + '948': BigInteger; + '949': BigInteger; + '950': BigInteger; + '951': BigInteger; + '952': BigInteger; + '953': BigInteger; + '954': BigInteger; + '955': BigInteger; + '956': BigInteger; + '957': BigInteger; + '958': BigInteger; + '959': BigInteger; + '960': BigInteger; + '961': BigInteger; + '962': BigInteger; + '963': BigInteger; + '964': BigInteger; + '965': BigInteger; + '966': BigInteger; + '967': BigInteger; + '968': BigInteger; + '969': BigInteger; + '970': BigInteger; + '971': BigInteger; + '972': BigInteger; + '973': BigInteger; + '974': BigInteger; + '975': BigInteger; + '976': BigInteger; + '977': BigInteger; + '978': BigInteger; + '979': BigInteger; + '980': BigInteger; + '981': BigInteger; + '982': BigInteger; + '983': BigInteger; + '984': BigInteger; + '985': BigInteger; + '986': BigInteger; + '987': BigInteger; + '988': BigInteger; + '989': BigInteger; + '990': BigInteger; + '991': BigInteger; + '992': BigInteger; + '993': BigInteger; + '994': BigInteger; + '995': BigInteger; + '996': BigInteger; + '997': BigInteger; + '998': BigInteger; + '999': BigInteger; + } + + interface BaseArray { + value: number[], + isNegative: boolean + } +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.js new file mode 100644 index 0000000..e560954 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.js @@ -0,0 +1,1308 @@ +var bigInt = (function (undefined) { + "use strict"; + + var BASE = 1e7, + LOG_BASE = 7, + MAX_INT = 9007199254740992, + MAX_INT_ARR = smallToArray(MAX_INT), + LOG_MAX_INT = Math.log(MAX_INT); + + function Integer(v, radix) { + if (typeof v === "undefined") return Integer[0]; + if (typeof radix !== "undefined") return +radix === 10 ? parseValue(v) : parseBase(v, radix); + return parseValue(v); + } + + function BigInteger(value, sign) { + this.value = value; + this.sign = sign; + this.isSmall = false; + } + BigInteger.prototype = Object.create(Integer.prototype); + + function SmallInteger(value) { + this.value = value; + this.sign = value < 0; + this.isSmall = true; + } + SmallInteger.prototype = Object.create(Integer.prototype); + + function isPrecise(n) { + return -MAX_INT < n && n < MAX_INT; + } + + function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes + if (n < 1e7) + return [n]; + if (n < 1e14) + return [n % 1e7, Math.floor(n / 1e7)]; + return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)]; + } + + function arrayToSmall(arr) { // If BASE changes this function may need to change + trim(arr); + var length = arr.length; + if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) { + switch (length) { + case 0: return 0; + case 1: return arr[0]; + case 2: return arr[0] + arr[1] * BASE; + default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE; + } + } + return arr; + } + + function trim(v) { + var i = v.length; + while (v[--i] === 0); + v.length = i + 1; + } + + function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger + var x = new Array(length); + var i = -1; + while (++i < length) { + x[i] = 0; + } + return x; + } + + function truncate(n) { + if (n > 0) return Math.floor(n); + return Math.ceil(n); + } + + function add(a, b) { // assumes a and b are arrays with a.length >= b.length + var l_a = a.length, + l_b = b.length, + r = new Array(l_a), + carry = 0, + base = BASE, + sum, i; + for (i = 0; i < l_b; i++) { + sum = a[i] + b[i] + carry; + carry = sum >= base ? 1 : 0; + r[i] = sum - carry * base; + } + while (i < l_a) { + sum = a[i] + carry; + carry = sum === base ? 1 : 0; + r[i++] = sum - carry * base; + } + if (carry > 0) r.push(carry); + return r; + } + + function addAny(a, b) { + if (a.length >= b.length) return add(a, b); + return add(b, a); + } + + function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT + var l = a.length, + r = new Array(l), + base = BASE, + sum, i; + for (i = 0; i < l; i++) { + sum = a[i] - base + carry; + carry = Math.floor(sum / base); + r[i] = sum - carry * base; + carry += 1; + } + while (carry > 0) { + r[i++] = carry % base; + carry = Math.floor(carry / base); + } + return r; + } + + BigInteger.prototype.add = function (v) { + var n = parseValue(v); + if (this.sign !== n.sign) { + return this.subtract(n.negate()); + } + var a = this.value, b = n.value; + if (n.isSmall) { + return new BigInteger(addSmall(a, Math.abs(b)), this.sign); + } + return new BigInteger(addAny(a, b), this.sign); + }; + BigInteger.prototype.plus = BigInteger.prototype.add; + + SmallInteger.prototype.add = function (v) { + var n = parseValue(v); + var a = this.value; + if (a < 0 !== n.sign) { + return this.subtract(n.negate()); + } + var b = n.value; + if (n.isSmall) { + if (isPrecise(a + b)) return new SmallInteger(a + b); + b = smallToArray(Math.abs(b)); + } + return new BigInteger(addSmall(b, Math.abs(a)), a < 0); + }; + SmallInteger.prototype.plus = SmallInteger.prototype.add; + + function subtract(a, b) { // assumes a and b are arrays with a >= b + var a_l = a.length, + b_l = b.length, + r = new Array(a_l), + borrow = 0, + base = BASE, + i, difference; + for (i = 0; i < b_l; i++) { + difference = a[i] - borrow - b[i]; + if (difference < 0) { + difference += base; + borrow = 1; + } else borrow = 0; + r[i] = difference; + } + for (i = b_l; i < a_l; i++) { + difference = a[i] - borrow; + if (difference < 0) difference += base; + else { + r[i++] = difference; + break; + } + r[i] = difference; + } + for (; i < a_l; i++) { + r[i] = a[i]; + } + trim(r); + return r; + } + + function subtractAny(a, b, sign) { + var value; + if (compareAbs(a, b) >= 0) { + value = subtract(a, b); + } else { + value = subtract(b, a); + sign = !sign; + } + value = arrayToSmall(value); + if (typeof value === "number") { + if (sign) value = -value; + return new SmallInteger(value); + } + return new BigInteger(value, sign); + } + + function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT + var l = a.length, + r = new Array(l), + carry = -b, + base = BASE, + i, difference; + for (i = 0; i < l; i++) { + difference = a[i] + carry; + carry = Math.floor(difference / base); + difference %= base; + r[i] = difference < 0 ? difference + base : difference; + } + r = arrayToSmall(r); + if (typeof r === "number") { + if (sign) r = -r; + return new SmallInteger(r); + } return new BigInteger(r, sign); + } + + BigInteger.prototype.subtract = function (v) { + var n = parseValue(v); + if (this.sign !== n.sign) { + return this.add(n.negate()); + } + var a = this.value, b = n.value; + if (n.isSmall) + return subtractSmall(a, Math.abs(b), this.sign); + return subtractAny(a, b, this.sign); + }; + BigInteger.prototype.minus = BigInteger.prototype.subtract; + + SmallInteger.prototype.subtract = function (v) { + var n = parseValue(v); + var a = this.value; + if (a < 0 !== n.sign) { + return this.add(n.negate()); + } + var b = n.value; + if (n.isSmall) { + return new SmallInteger(a - b); + } + return subtractSmall(b, Math.abs(a), a >= 0); + }; + SmallInteger.prototype.minus = SmallInteger.prototype.subtract; + + BigInteger.prototype.negate = function () { + return new BigInteger(this.value, !this.sign); + }; + SmallInteger.prototype.negate = function () { + var sign = this.sign; + var small = new SmallInteger(-this.value); + small.sign = !sign; + return small; + }; + + BigInteger.prototype.abs = function () { + return new BigInteger(this.value, false); + }; + SmallInteger.prototype.abs = function () { + return new SmallInteger(Math.abs(this.value)); + }; + + function multiplyLong(a, b) { + var a_l = a.length, + b_l = b.length, + l = a_l + b_l, + r = createArray(l), + base = BASE, + product, carry, i, a_i, b_j; + for (i = 0; i < a_l; ++i) { + a_i = a[i]; + for (var j = 0; j < b_l; ++j) { + b_j = b[j]; + product = a_i * b_j + r[i + j]; + carry = Math.floor(product / base); + r[i + j] = product - carry * base; + r[i + j + 1] += carry; + } + } + trim(r); + return r; + } + + function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE + var l = a.length, + r = new Array(l), + base = BASE, + carry = 0, + product, i; + for (i = 0; i < l; i++) { + product = a[i] * b + carry; + carry = Math.floor(product / base); + r[i] = product - carry * base; + } + while (carry > 0) { + r[i++] = carry % base; + carry = Math.floor(carry / base); + } + return r; + } + + function shiftLeft(x, n) { + var r = []; + while (n-- > 0) r.push(0); + return r.concat(x); + } + + function multiplyKaratsuba(x, y) { + var n = Math.max(x.length, y.length); + + if (n <= 30) return multiplyLong(x, y); + n = Math.ceil(n / 2); + + var b = x.slice(n), + a = x.slice(0, n), + d = y.slice(n), + c = y.slice(0, n); + + var ac = multiplyKaratsuba(a, c), + bd = multiplyKaratsuba(b, d), + abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d)); + + var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n)); + trim(product); + return product; + } + + // The following function is derived from a surface fit of a graph plotting the performance difference + // between long multiplication and karatsuba multiplication versus the lengths of the two arrays. + function useKaratsuba(l1, l2) { + return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0; + } + + BigInteger.prototype.multiply = function (v) { + var n = parseValue(v), + a = this.value, b = n.value, + sign = this.sign !== n.sign, + abs; + if (n.isSmall) { + if (b === 0) return Integer[0]; + if (b === 1) return this; + if (b === -1) return this.negate(); + abs = Math.abs(b); + if (abs < BASE) { + return new BigInteger(multiplySmall(a, abs), sign); + } + b = smallToArray(abs); + } + if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes + return new BigInteger(multiplyKaratsuba(a, b), sign); + return new BigInteger(multiplyLong(a, b), sign); + }; + + BigInteger.prototype.times = BigInteger.prototype.multiply; + + function multiplySmallAndArray(a, b, sign) { // a >= 0 + if (a < BASE) { + return new BigInteger(multiplySmall(b, a), sign); + } + return new BigInteger(multiplyLong(b, smallToArray(a)), sign); + } + SmallInteger.prototype._multiplyBySmall = function (a) { + if (isPrecise(a.value * this.value)) { + return new SmallInteger(a.value * this.value); + } + return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign); + }; + BigInteger.prototype._multiplyBySmall = function (a) { + if (a.value === 0) return Integer[0]; + if (a.value === 1) return this; + if (a.value === -1) return this.negate(); + return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign); + }; + SmallInteger.prototype.multiply = function (v) { + return parseValue(v)._multiplyBySmall(this); + }; + SmallInteger.prototype.times = SmallInteger.prototype.multiply; + + function square(a) { + //console.assert(2 * BASE * BASE < MAX_INT); + var l = a.length, + r = createArray(l + l), + base = BASE, + product, carry, i, a_i, a_j; + for (i = 0; i < l; i++) { + a_i = a[i]; + carry = 0 - a_i * a_i; + for (var j = i; j < l; j++) { + a_j = a[j]; + product = 2 * (a_i * a_j) + r[i + j] + carry; + carry = Math.floor(product / base); + r[i + j] = product - carry * base; + } + r[i + l] = carry; + } + trim(r); + return r; + } + + BigInteger.prototype.square = function () { + return new BigInteger(square(this.value), false); + }; + + SmallInteger.prototype.square = function () { + var value = this.value * this.value; + if (isPrecise(value)) return new SmallInteger(value); + return new BigInteger(square(smallToArray(Math.abs(this.value))), false); + }; + + function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes. + var a_l = a.length, + b_l = b.length, + base = BASE, + result = createArray(b.length), + divisorMostSignificantDigit = b[b_l - 1], + // normalization + lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)), + remainder = multiplySmall(a, lambda), + divisor = multiplySmall(b, lambda), + quotientDigit, shift, carry, borrow, i, l, q; + if (remainder.length <= a_l) remainder.push(0); + divisor.push(0); + divisorMostSignificantDigit = divisor[b_l - 1]; + for (shift = a_l - b_l; shift >= 0; shift--) { + quotientDigit = base - 1; + if (remainder[shift + b_l] !== divisorMostSignificantDigit) { + quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit); + } + // quotientDigit <= base - 1 + carry = 0; + borrow = 0; + l = divisor.length; + for (i = 0; i < l; i++) { + carry += quotientDigit * divisor[i]; + q = Math.floor(carry / base); + borrow += remainder[shift + i] - (carry - q * base); + carry = q; + if (borrow < 0) { + remainder[shift + i] = borrow + base; + borrow = -1; + } else { + remainder[shift + i] = borrow; + borrow = 0; + } + } + while (borrow !== 0) { + quotientDigit -= 1; + carry = 0; + for (i = 0; i < l; i++) { + carry += remainder[shift + i] - base + divisor[i]; + if (carry < 0) { + remainder[shift + i] = carry + base; + carry = 0; + } else { + remainder[shift + i] = carry; + carry = 1; + } + } + borrow += carry; + } + result[shift] = quotientDigit; + } + // denormalization + remainder = divModSmall(remainder, lambda)[0]; + return [arrayToSmall(result), arrayToSmall(remainder)]; + } + + function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/ + // Performs faster than divMod1 on larger input sizes. + var a_l = a.length, + b_l = b.length, + result = [], + part = [], + base = BASE, + guess, xlen, highx, highy, check; + while (a_l) { + part.unshift(a[--a_l]); + trim(part); + if (compareAbs(part, b) < 0) { + result.push(0); + continue; + } + xlen = part.length; + highx = part[xlen - 1] * base + part[xlen - 2]; + highy = b[b_l - 1] * base + b[b_l - 2]; + if (xlen > b_l) { + highx = (highx + 1) * base; + } + guess = Math.ceil(highx / highy); + do { + check = multiplySmall(b, guess); + if (compareAbs(check, part) <= 0) break; + guess--; + } while (guess); + result.push(guess); + part = subtract(part, check); + } + result.reverse(); + return [arrayToSmall(result), arrayToSmall(part)]; + } + + function divModSmall(value, lambda) { + var length = value.length, + quotient = createArray(length), + base = BASE, + i, q, remainder, divisor; + remainder = 0; + for (i = length - 1; i >= 0; --i) { + divisor = remainder * base + value[i]; + q = truncate(divisor / lambda); + remainder = divisor - q * lambda; + quotient[i] = q | 0; + } + return [quotient, remainder | 0]; + } + + function divModAny(self, v) { + var value, n = parseValue(v); + var a = self.value, b = n.value; + var quotient; + if (b === 0) throw new Error("Cannot divide by zero"); + if (self.isSmall) { + if (n.isSmall) { + return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)]; + } + return [Integer[0], self]; + } + if (n.isSmall) { + if (b === 1) return [self, Integer[0]]; + if (b == -1) return [self.negate(), Integer[0]]; + var abs = Math.abs(b); + if (abs < BASE) { + value = divModSmall(a, abs); + quotient = arrayToSmall(value[0]); + var remainder = value[1]; + if (self.sign) remainder = -remainder; + if (typeof quotient === "number") { + if (self.sign !== n.sign) quotient = -quotient; + return [new SmallInteger(quotient), new SmallInteger(remainder)]; + } + return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)]; + } + b = smallToArray(abs); + } + var comparison = compareAbs(a, b); + if (comparison === -1) return [Integer[0], self]; + if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]]; + + // divMod1 is faster on smaller input sizes + if (a.length + b.length <= 200) + value = divMod1(a, b); + else value = divMod2(a, b); + + quotient = value[0]; + var qSign = self.sign !== n.sign, + mod = value[1], + mSign = self.sign; + if (typeof quotient === "number") { + if (qSign) quotient = -quotient; + quotient = new SmallInteger(quotient); + } else quotient = new BigInteger(quotient, qSign); + if (typeof mod === "number") { + if (mSign) mod = -mod; + mod = new SmallInteger(mod); + } else mod = new BigInteger(mod, mSign); + return [quotient, mod]; + } + + BigInteger.prototype.divmod = function (v) { + var result = divModAny(this, v); + return { + quotient: result[0], + remainder: result[1] + }; + }; + SmallInteger.prototype.divmod = BigInteger.prototype.divmod; + + BigInteger.prototype.divide = function (v) { + return divModAny(this, v)[0]; + }; + SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide; + + BigInteger.prototype.mod = function (v) { + return divModAny(this, v)[1]; + }; + SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod; + + BigInteger.prototype.pow = function (v) { + var n = parseValue(v), + a = this.value, + b = n.value, + value, x, y; + if (b === 0) return Integer[1]; + if (a === 0) return Integer[0]; + if (a === 1) return Integer[1]; + if (a === -1) return n.isEven() ? Integer[1] : Integer[-1]; + if (n.sign) { + return Integer[0]; + } + if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large."); + if (this.isSmall) { + if (isPrecise(value = Math.pow(a, b))) + return new SmallInteger(truncate(value)); + } + x = this; + y = Integer[1]; + while (true) { + if (b & 1 === 1) { + y = y.times(x); + --b; + } + if (b === 0) break; + b /= 2; + x = x.square(); + } + return y; + }; + SmallInteger.prototype.pow = BigInteger.prototype.pow; + + BigInteger.prototype.modPow = function (exp, mod) { + exp = parseValue(exp); + mod = parseValue(mod); + if (mod.isZero()) throw new Error("Cannot take modPow with modulus 0"); + var r = Integer[1], + base = this.mod(mod); + while (exp.isPositive()) { + if (base.isZero()) return Integer[0]; + if (exp.isOdd()) r = r.multiply(base).mod(mod); + exp = exp.divide(2); + base = base.square().mod(mod); + } + return r; + }; + SmallInteger.prototype.modPow = BigInteger.prototype.modPow; + + function compareAbs(a, b) { + if (a.length !== b.length) { + return a.length > b.length ? 1 : -1; + } + for (var i = a.length - 1; i >= 0; i--) { + if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1; + } + return 0; + } + + BigInteger.prototype.compareAbs = function (v) { + var n = parseValue(v), + a = this.value, + b = n.value; + if (n.isSmall) return 1; + return compareAbs(a, b); + }; + SmallInteger.prototype.compareAbs = function (v) { + var n = parseValue(v), + a = Math.abs(this.value), + b = n.value; + if (n.isSmall) { + b = Math.abs(b); + return a === b ? 0 : a > b ? 1 : -1; + } + return -1; + }; + + BigInteger.prototype.compare = function (v) { + // See discussion about comparison with Infinity: + // https://github.com/peterolson/BigInteger.js/issues/61 + if (v === Infinity) { + return -1; + } + if (v === -Infinity) { + return 1; + } + + var n = parseValue(v), + a = this.value, + b = n.value; + if (this.sign !== n.sign) { + return n.sign ? 1 : -1; + } + if (n.isSmall) { + return this.sign ? -1 : 1; + } + return compareAbs(a, b) * (this.sign ? -1 : 1); + }; + BigInteger.prototype.compareTo = BigInteger.prototype.compare; + + SmallInteger.prototype.compare = function (v) { + if (v === Infinity) { + return -1; + } + if (v === -Infinity) { + return 1; + } + + var n = parseValue(v), + a = this.value, + b = n.value; + if (n.isSmall) { + return a == b ? 0 : a > b ? 1 : -1; + } + if (a < 0 !== n.sign) { + return a < 0 ? -1 : 1; + } + return a < 0 ? 1 : -1; + }; + SmallInteger.prototype.compareTo = SmallInteger.prototype.compare; + + BigInteger.prototype.equals = function (v) { + return this.compare(v) === 0; + }; + SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals; + + BigInteger.prototype.notEquals = function (v) { + return this.compare(v) !== 0; + }; + SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals; + + BigInteger.prototype.greater = function (v) { + return this.compare(v) > 0; + }; + SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater; + + BigInteger.prototype.lesser = function (v) { + return this.compare(v) < 0; + }; + SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser; + + BigInteger.prototype.greaterOrEquals = function (v) { + return this.compare(v) >= 0; + }; + SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals; + + BigInteger.prototype.lesserOrEquals = function (v) { + return this.compare(v) <= 0; + }; + SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals; + + BigInteger.prototype.isEven = function () { + return (this.value[0] & 1) === 0; + }; + SmallInteger.prototype.isEven = function () { + return (this.value & 1) === 0; + }; + + BigInteger.prototype.isOdd = function () { + return (this.value[0] & 1) === 1; + }; + SmallInteger.prototype.isOdd = function () { + return (this.value & 1) === 1; + }; + + BigInteger.prototype.isPositive = function () { + return !this.sign; + }; + SmallInteger.prototype.isPositive = function () { + return this.value > 0; + }; + + BigInteger.prototype.isNegative = function () { + return this.sign; + }; + SmallInteger.prototype.isNegative = function () { + return this.value < 0; + }; + + BigInteger.prototype.isUnit = function () { + return false; + }; + SmallInteger.prototype.isUnit = function () { + return Math.abs(this.value) === 1; + }; + + BigInteger.prototype.isZero = function () { + return false; + }; + SmallInteger.prototype.isZero = function () { + return this.value === 0; + }; + BigInteger.prototype.isDivisibleBy = function (v) { + var n = parseValue(v); + var value = n.value; + if (value === 0) return false; + if (value === 1) return true; + if (value === 2) return this.isEven(); + return this.mod(n).equals(Integer[0]); + }; + SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy; + + function isBasicPrime(v) { + var n = v.abs(); + if (n.isUnit()) return false; + if (n.equals(2) || n.equals(3) || n.equals(5)) return true; + if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false; + if (n.lesser(25)) return true; + // we don't know if it's prime: let the other functions figure it out + } + + BigInteger.prototype.isPrime = function () { + var isPrime = isBasicPrime(this); + if (isPrime !== undefined) return isPrime; + var n = this.abs(), + nPrev = n.prev(); + var a = [2, 3, 5, 7, 11, 13, 17, 19], + b = nPrev, + d, t, i, x; + while (b.isEven()) b = b.divide(2); + for (i = 0; i < a.length; i++) { + x = bigInt(a[i]).modPow(b, n); + if (x.equals(Integer[1]) || x.equals(nPrev)) continue; + for (t = true, d = b; t && d.lesser(nPrev); d = d.multiply(2)) { + x = x.square().mod(n); + if (x.equals(nPrev)) t = false; + } + if (t) return false; + } + return true; + }; + SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime; + + BigInteger.prototype.isProbablePrime = function (iterations) { + var isPrime = isBasicPrime(this); + if (isPrime !== undefined) return isPrime; + var n = this.abs(); + var t = iterations === undefined ? 5 : iterations; + // use the Fermat primality test + for (var i = 0; i < t; i++) { + var a = bigInt.randBetween(2, n.minus(2)); + if (!a.modPow(n.prev(), n).isUnit()) return false; // definitely composite + } + return true; // large chance of being prime + }; + SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime; + + BigInteger.prototype.modInv = function (n) { + var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR; + while (!newR.equals(bigInt.zero)) { + q = r.divide(newR); + lastT = t; + lastR = r; + t = newT; + r = newR; + newT = lastT.subtract(q.multiply(newT)); + newR = lastR.subtract(q.multiply(newR)); + } + if (!r.equals(1)) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime"); + if (t.compare(0) === -1) { + t = t.add(n); + } + if (this.isNegative()) { + return t.negate(); + } + return t; + }; + + SmallInteger.prototype.modInv = BigInteger.prototype.modInv; + + BigInteger.prototype.next = function () { + var value = this.value; + if (this.sign) { + return subtractSmall(value, 1, this.sign); + } + return new BigInteger(addSmall(value, 1), this.sign); + }; + SmallInteger.prototype.next = function () { + var value = this.value; + if (value + 1 < MAX_INT) return new SmallInteger(value + 1); + return new BigInteger(MAX_INT_ARR, false); + }; + + BigInteger.prototype.prev = function () { + var value = this.value; + if (this.sign) { + return new BigInteger(addSmall(value, 1), true); + } + return subtractSmall(value, 1, this.sign); + }; + SmallInteger.prototype.prev = function () { + var value = this.value; + if (value - 1 > -MAX_INT) return new SmallInteger(value - 1); + return new BigInteger(MAX_INT_ARR, true); + }; + + var powersOfTwo = [1]; + while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]); + var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1]; + + function shift_isSmall(n) { + return ((typeof n === "number" || typeof n === "string") && +Math.abs(n) <= BASE) || + (n instanceof BigInteger && n.value.length <= 1); + } + + BigInteger.prototype.shiftLeft = function (n) { + if (!shift_isSmall(n)) { + throw new Error(String(n) + " is too large for shifting."); + } + n = +n; + if (n < 0) return this.shiftRight(-n); + var result = this; + if (result.isZero()) return result; + while (n >= powers2Length) { + result = result.multiply(highestPower2); + n -= powers2Length - 1; + } + return result.multiply(powersOfTwo[n]); + }; + SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft; + + BigInteger.prototype.shiftRight = function (n) { + var remQuo; + if (!shift_isSmall(n)) { + throw new Error(String(n) + " is too large for shifting."); + } + n = +n; + if (n < 0) return this.shiftLeft(-n); + var result = this; + while (n >= powers2Length) { + if (result.isZero() || (result.isNegative() && result.isUnit())) return result; + remQuo = divModAny(result, highestPower2); + result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0]; + n -= powers2Length - 1; + } + remQuo = divModAny(result, powersOfTwo[n]); + return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0]; + }; + SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight; + + function bitwise(x, y, fn) { + y = parseValue(y); + var xSign = x.isNegative(), ySign = y.isNegative(); + var xRem = xSign ? x.not() : x, + yRem = ySign ? y.not() : y; + var xDigit = 0, yDigit = 0; + var xDivMod = null, yDivMod = null; + var result = []; + while (!xRem.isZero() || !yRem.isZero()) { + xDivMod = divModAny(xRem, highestPower2); + xDigit = xDivMod[1].toJSNumber(); + if (xSign) { + xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers + } + + yDivMod = divModAny(yRem, highestPower2); + yDigit = yDivMod[1].toJSNumber(); + if (ySign) { + yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers + } + + xRem = xDivMod[0]; + yRem = yDivMod[0]; + result.push(fn(xDigit, yDigit)); + } + var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0); + for (var i = result.length - 1; i >= 0; i -= 1) { + sum = sum.multiply(highestPower2).add(bigInt(result[i])); + } + return sum; + } + + BigInteger.prototype.not = function () { + return this.negate().prev(); + }; + SmallInteger.prototype.not = BigInteger.prototype.not; + + BigInteger.prototype.and = function (n) { + return bitwise(this, n, function (a, b) { return a & b; }); + }; + SmallInteger.prototype.and = BigInteger.prototype.and; + + BigInteger.prototype.or = function (n) { + return bitwise(this, n, function (a, b) { return a | b; }); + }; + SmallInteger.prototype.or = BigInteger.prototype.or; + + BigInteger.prototype.xor = function (n) { + return bitwise(this, n, function (a, b) { return a ^ b; }); + }; + SmallInteger.prototype.xor = BigInteger.prototype.xor; + + var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I; + function roughLOB(n) { // get lowestOneBit (rough) + // SmallInteger: return Min(lowestOneBit(n), 1 << 30) + // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7] + var v = n.value, x = typeof v === "number" ? v | LOBMASK_I : v[0] + v[1] * BASE | LOBMASK_BI; + return x & -x; + } + + function integerLogarithm(value, base) { + if (base.compareTo(value) <= 0) { + var tmp = integerLogarithm(value, base.square(base)); + var p = tmp.p; + var e = tmp.e; + var t = p.multiply(base); + return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 }; + } + return { p: bigInt(1), e: 0 }; + } + + BigInteger.prototype.bitLength = function () { + var n = this; + if (n.compareTo(bigInt(0)) < 0) { + n = n.negate().subtract(bigInt(1)); + } + if (n.compareTo(bigInt(0)) === 0) { + return bigInt(0); + } + return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1)); + } + SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength; + + function max(a, b) { + a = parseValue(a); + b = parseValue(b); + return a.greater(b) ? a : b; + } + function min(a, b) { + a = parseValue(a); + b = parseValue(b); + return a.lesser(b) ? a : b; + } + function gcd(a, b) { + a = parseValue(a).abs(); + b = parseValue(b).abs(); + if (a.equals(b)) return a; + if (a.isZero()) return b; + if (b.isZero()) return a; + var c = Integer[1], d, t; + while (a.isEven() && b.isEven()) { + d = Math.min(roughLOB(a), roughLOB(b)); + a = a.divide(d); + b = b.divide(d); + c = c.multiply(d); + } + while (a.isEven()) { + a = a.divide(roughLOB(a)); + } + do { + while (b.isEven()) { + b = b.divide(roughLOB(b)); + } + if (a.greater(b)) { + t = b; b = a; a = t; + } + b = b.subtract(a); + } while (!b.isZero()); + return c.isUnit() ? a : a.multiply(c); + } + function lcm(a, b) { + a = parseValue(a).abs(); + b = parseValue(b).abs(); + return a.divide(gcd(a, b)).multiply(b); + } + function randBetween(a, b) { + a = parseValue(a); + b = parseValue(b); + var low = min(a, b), high = max(a, b); + var range = high.subtract(low).add(1); + if (range.isSmall) return low.add(Math.floor(Math.random() * range)); + var length = range.value.length - 1; + var result = [], restricted = true; + for (var i = length; i >= 0; i--) { + var top = restricted ? range.value[i] : BASE; + var digit = truncate(Math.random() * top); + result.unshift(digit); + if (digit < top) restricted = false; + } + result = arrayToSmall(result); + return low.add(typeof result === "number" ? new SmallInteger(result) : new BigInteger(result, false)); + } + var parseBase = function (text, base) { + var length = text.length; + var i; + var absBase = Math.abs(base); + for (var i = 0; i < length; i++) { + var c = text[i].toLowerCase(); + if (c === "-") continue; + if (/[a-z0-9]/.test(c)) { + if (/[0-9]/.test(c) && +c >= absBase) { + if (c === "1" && absBase === 1) continue; + throw new Error(c + " is not a valid digit in base " + base + "."); + } else if (c.charCodeAt(0) - 87 >= absBase) { + throw new Error(c + " is not a valid digit in base " + base + "."); + } + } + } + if (2 <= base && base <= 36) { + if (length <= LOG_MAX_INT / Math.log(base)) { + var result = parseInt(text, base); + if (isNaN(result)) { + throw new Error(c + " is not a valid digit in base " + base + "."); + } + return new SmallInteger(parseInt(text, base)); + } + } + base = parseValue(base); + var digits = []; + var isNegative = text[0] === "-"; + for (i = isNegative ? 1 : 0; i < text.length; i++) { + var c = text[i].toLowerCase(), + charCode = c.charCodeAt(0); + if (48 <= charCode && charCode <= 57) digits.push(parseValue(c)); + else if (97 <= charCode && charCode <= 122) digits.push(parseValue(c.charCodeAt(0) - 87)); + else if (c === "<") { + var start = i; + do { i++; } while (text[i] !== ">"); + digits.push(parseValue(text.slice(start + 1, i))); + } + else throw new Error(c + " is not a valid character"); + } + return parseBaseFromArray(digits, base, isNegative); + }; + + function parseBaseFromArray(digits, base, isNegative) { + var val = Integer[0], pow = Integer[1], i; + for (i = digits.length - 1; i >= 0; i--) { + val = val.add(digits[i].times(pow)); + pow = pow.times(base); + } + return isNegative ? val.negate() : val; + } + + function stringify(digit) { + if (digit <= 35) { + return "0123456789abcdefghijklmnopqrstuvwxyz".charAt(digit); + } + return "<" + digit + ">"; + } + + function toBase(n, base) { + base = bigInt(base); + if (base.isZero()) { + if (n.isZero()) return { value: [0], isNegative: false }; + throw new Error("Cannot convert nonzero numbers to base 0."); + } + if (base.equals(-1)) { + if (n.isZero()) return { value: [0], isNegative: false }; + if (n.isNegative()) + return { + value: [].concat.apply([], Array.apply(null, Array(-n)) + .map(Array.prototype.valueOf, [1, 0]) + ), + isNegative: false + }; + + var arr = Array.apply(null, Array(+n - 1)) + .map(Array.prototype.valueOf, [0, 1]); + arr.unshift([1]); + return { + value: [].concat.apply([], arr), + isNegative: false + }; + } + + var neg = false; + if (n.isNegative() && base.isPositive()) { + neg = true; + n = n.abs(); + } + if (base.equals(1)) { + if (n.isZero()) return { value: [0], isNegative: false }; + + return { + value: Array.apply(null, Array(+n)) + .map(Number.prototype.valueOf, 1), + isNegative: neg + }; + } + var out = []; + var left = n, divmod; + while (left.isNegative() || left.compareAbs(base) >= 0) { + divmod = left.divmod(base); + left = divmod.quotient; + var digit = divmod.remainder; + if (digit.isNegative()) { + digit = base.minus(digit).abs(); + left = left.next(); + } + out.push(digit.toJSNumber()); + } + out.push(left.toJSNumber()); + return { value: out.reverse(), isNegative: neg }; + } + + function toBaseString(n, base) { + var arr = toBase(n, base); + return (arr.isNegative ? "-" : "") + arr.value.map(stringify).join(''); + } + + BigInteger.prototype.toArray = function (radix) { + return toBase(this, radix); + }; + + SmallInteger.prototype.toArray = function (radix) { + return toBase(this, radix); + }; + + BigInteger.prototype.toString = function (radix) { + if (radix === undefined) radix = 10; + if (radix !== 10) return toBaseString(this, radix); + var v = this.value, l = v.length, str = String(v[--l]), zeros = "0000000", digit; + while (--l >= 0) { + digit = String(v[l]); + str += zeros.slice(digit.length) + digit; + } + var sign = this.sign ? "-" : ""; + return sign + str; + }; + + SmallInteger.prototype.toString = function (radix) { + if (radix === undefined) radix = 10; + if (radix != 10) return toBaseString(this, radix); + return String(this.value); + }; + BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); } + + BigInteger.prototype.valueOf = function () { + return parseInt(this.toString(), 10); + }; + BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf; + + SmallInteger.prototype.valueOf = function () { + return this.value; + }; + SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf; + + function parseStringValue(v) { + if (isPrecise(+v)) { + var x = +v; + if (x === truncate(x)) + return new SmallInteger(x); + throw new Error("Invalid integer: " + v); + } + var sign = v[0] === "-"; + if (sign) v = v.slice(1); + var split = v.split(/e/i); + if (split.length > 2) throw new Error("Invalid integer: " + split.join("e")); + if (split.length === 2) { + var exp = split[1]; + if (exp[0] === "+") exp = exp.slice(1); + exp = +exp; + if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error("Invalid integer: " + exp + " is not a valid exponent."); + var text = split[0]; + var decimalPlace = text.indexOf("."); + if (decimalPlace >= 0) { + exp -= text.length - decimalPlace - 1; + text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1); + } + if (exp < 0) throw new Error("Cannot include negative exponent part for integers"); + text += (new Array(exp + 1)).join("0"); + v = text; + } + var isValid = /^([0-9][0-9]*)$/.test(v); + if (!isValid) throw new Error("Invalid integer: " + v); + var r = [], max = v.length, l = LOG_BASE, min = max - l; + while (max > 0) { + r.push(+v.slice(min, max)); + min -= l; + if (min < 0) min = 0; + max -= l; + } + trim(r); + return new BigInteger(r, sign); + } + + function parseNumberValue(v) { + if (isPrecise(v)) { + if (v !== truncate(v)) throw new Error(v + " is not an integer."); + return new SmallInteger(v); + } + return parseStringValue(v.toString()); + } + + function parseValue(v) { + if (typeof v === "number") { + return parseNumberValue(v); + } + if (typeof v === "string") { + return parseStringValue(v); + } + return v; + } + // Pre-define numbers in range [-999,999] + for (var i = 0; i < 1000; i++) { + Integer[i] = new SmallInteger(i); + if (i > 0) Integer[-i] = new SmallInteger(-i); + } + // Backwards compatibility + Integer.one = Integer[1]; + Integer.zero = Integer[0]; + Integer.minusOne = Integer[-1]; + Integer.max = max; + Integer.min = min; + Integer.gcd = gcd; + Integer.lcm = lcm; + Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger; }; + Integer.randBetween = randBetween; + + Integer.fromArray = function (digits, base, isNegative) { + return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative); + }; + + return Integer; +})(); + +// Node.js check +if (typeof module !== "undefined" && module.hasOwnProperty("exports")) { + module.exports = bigInt; +} + +//amd check +if (typeof define === "function" && define.amd) { + define("big-integer", [], function () { + return bigInt; + }); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.min.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.min.js new file mode 100644 index 0000000..8ec9160 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/BigInteger.min.js @@ -0,0 +1 @@ +var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i=base?1:0;r[i]=sum-carry*base}while(i0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;ib_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(absb.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n==="number"||typeof n==="string")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;if(result.isZero())return result;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero()||result.isNegative()&&result.isUnit())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function integerLogarithm(value,base){if(base.compareTo(value)<=0){var tmp=integerLogarithm(value,base.square(base));var p=tmp.p;var e=tmp.e;var t=p.multiply(base);return t.compareTo(value)<=0?{p:t,e:e*2+1}:{p:p,e:e*2}}return{p:bigInt(1),e:0}}BigInteger.prototype.bitLength=function(){var n=this;if(n.compareTo(bigInt(0))<0){n=n.negate().subtract(bigInt(1))}if(n.compareTo(bigInt(0))===0){return bigInt(0)}return bigInt(integerLogarithm(n,bigInt(2)).e).add(bigInt(1))};SmallInteger.prototype.bitLength=BigInteger.prototype.bitLength;function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+" is not a valid digit in base "+base+".")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+" is not a valid digit in base "+base+".")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){if(digit<=35){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(digit)}return"<"+digit+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return{value:[0],isNegative:false};throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return{value:[0],isNegative:false};if(n.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-n)).map(Array.prototype.valueOf,[1,0])),isNegative:false};var arr=Array.apply(null,Array(+n-1)).map(Array.prototype.valueOf,[0,1]);arr.unshift([1]);return{value:[].concat.apply([],arr),isNegative:false}}var neg=false;if(n.isNegative()&&base.isPositive()){neg=true;n=n.abs()}if(base.equals(1)){if(n.isZero())return{value:[0],isNegative:false};return{value:Array.apply(null,Array(+n)).map(Number.prototype.valueOf,1),isNegative:neg}}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(digit.toJSNumber())}out.push(left.toJSNumber());return{value:out.reverse(),isNegative:neg}}function toBaseString(n,base){var arr=toBase(n,base);return(arr.isNegative?"-":"")+arr.value.map(stringify).join("")}BigInteger.prototype.toArray=function(radix){return toBase(this,radix)};SmallInteger.prototype.toArray=function(radix){return toBase(this,radix)};BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBaseString(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBaseString(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return parseInt(this.toString(),10)};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw new Error("Invalid integer: "+v)}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define("big-integer",[],function(){return bigInt})} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/README.md new file mode 100644 index 0000000..55ab8d3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/README.md @@ -0,0 +1,570 @@ +# BigInteger.js [![Build Status][travis-img]][travis-url] [![Coverage Status][coveralls-img]][coveralls-url] [![Monthly Downloads][downloads-img]][downloads-url] + +[travis-url]: https://travis-ci.org/peterolson/BigInteger.js +[travis-img]: https://travis-ci.org/peterolson/BigInteger.js.svg?branch=master +[coveralls-url]: https://coveralls.io/github/peterolson/BigInteger.js?branch=master +[coveralls-img]: https://coveralls.io/repos/peterolson/BigInteger.js/badge.svg?branch=master&service=github +[downloads-url]: https://www.npmjs.com/package/big-integer +[downloads-img]: https://img.shields.io/npm/dm/big-integer.svg + +**BigInteger.js** is an arbitrary-length integer library for Javascript, allowing arithmetic operations on integers of unlimited size, notwithstanding memory and time limitations. + +## Installation + +If you are using a browser, you can download [BigInteger.js from GitHub](http://peterolson.github.com/BigInteger.js/BigInteger.min.js) or just hotlink to it: + + + +If you are using node, you can install BigInteger with [npm](https://npmjs.org/). + + npm install big-integer + +Then you can include it in your code: + + var bigInt = require("big-integer"); + + +## Usage +### `bigInt(number, [base])` + +You can create a bigInt by calling the `bigInt` function. You can pass in + + - a string, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails. + - a Javascript number, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails. + - another bigInt. + - nothing, and it will return `bigInt.zero`. + + If you provide a second parameter, then it will parse `number` as a number in base `base`. Note that `base` can be any bigInt (even negative or zero). The letters "a-z" and "A-Z" will be interpreted as the numbers 10 to 35. Higher digits can be specified in angle brackets (`<` and `>`). + +Examples: + + var zero = bigInt(); + var ninetyThree = bigInt(93); + var largeNumber = bigInt("75643564363473453456342378564387956906736546456235345"); + var googol = bigInt("1e100"); + var bigNumber = bigInt(largeNumber); + + var maximumByte = bigInt("FF", 16); + var fiftyFiveGoogol = bigInt("<55>0", googol); + +Note that Javascript numbers larger than `9007199254740992` and smaller than `-9007199254740992` are not precisely represented numbers and will not produce exact results. If you are dealing with numbers outside that range, it is better to pass in strings. + +### Method Chaining + +Note that bigInt operations return bigInts, which allows you to chain methods, for example: + + var salary = bigInt(dollarsPerHour).times(hoursWorked).plus(randomBonuses) + +### Constants + +There are three named constants already stored that you do not have to construct with the `bigInt` function yourself: + + - `bigInt.one`, equivalent to `bigInt(1)` + - `bigInt.zero`, equivalent to `bigInt(0)` + - `bigInt.minusOne`, equivalent to `bigInt(-1)` + +The numbers from -999 to 999 are also already prestored and can be accessed using `bigInt[index]`, for example: + + - `bigInt[-999]`, equivalent to `bigInt(-999)` + - `bigInt[256]`, equivalent to `bigInt(256)` + +### Methods + +#### `abs()` + +Returns the absolute value of a bigInt. + + - `bigInt(-45).abs()` => `45` + - `bigInt(45).abs()` => `45` + +#### `add(number)` + +Performs addition. + + - `bigInt(5).add(7)` => `12` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition) + +#### `and(number)` + +Performs the bitwise AND operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(6).and(3)` => `2` + - `bigInt(6).and(-3)` => `4` + +#### `bitLength()` + +Returns the number of digits required to represent a bigInt in binary. + + - `bigInt(5)` => `3` (since 5 is `101` in binary, which is three digits long) + +#### `compare(number)` + +Performs a comparison between two numbers. If the numbers are equal, it returns `0`. If the first number is greater, it returns `1`. If the first number is lesser, it returns `-1`. + + - `bigInt(5).compare(5)` => `0` + - `bigInt(5).compare(4)` => `1` + - `bigInt(4).compare(5)` => `-1` + +#### `compareAbs(number)` + +Performs a comparison between the absolute value of two numbers. + + - `bigInt(5).compareAbs(-5)` => `0` + - `bigInt(5).compareAbs(4)` => `1` + - `bigInt(4).compareAbs(-5)` => `-1` + +#### `compareTo(number)` + +Alias for the `compare` method. + +#### `divide(number)` + +Performs integer division, disregarding the remainder. + + - `bigInt(59).divide(5)` => `11` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `divmod(number)` + +Performs division and returns an object with two properties: `quotient` and `remainder`. The sign of the remainder will match the sign of the dividend. + + - `bigInt(59).divmod(5)` => `{quotient: bigInt(11), remainder: bigInt(4) }` + - `bigInt(-5).divmod(2)` => `{quotient: bigInt(-2), remainder: bigInt(-1) }` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `eq(number)` + +Alias for the `equals` method. + +#### `equals(number)` + +Checks if two numbers are equal. + + - `bigInt(5).equals(5)` => `true` + - `bigInt(4).equals(7)` => `false` + +#### `geq(number)` + +Alias for the `greaterOrEquals` method. + + +#### `greater(number)` + +Checks if the first number is greater than the second. + + - `bigInt(5).greater(6)` => `false` + - `bigInt(5).greater(5)` => `false` + - `bigInt(5).greater(4)` => `true` + +#### `greaterOrEquals(number)` + +Checks if the first number is greater than or equal to the second. + + - `bigInt(5).greaterOrEquals(6)` => `false` + - `bigInt(5).greaterOrEquals(5)` => `true` + - `bigInt(5).greaterOrEquals(4)` => `true` + +#### `gt(number)` + +Alias for the `greater` method. + +#### `isDivisibleBy(number)` + +Returns `true` if the first number is divisible by the second number, `false` otherwise. + + - `bigInt(999).isDivisibleBy(333)` => `true` + - `bigInt(99).isDivisibleBy(5)` => `false` + +#### `isEven()` + +Returns `true` if the number is even, `false` otherwise. + + - `bigInt(6).isEven()` => `true` + - `bigInt(3).isEven()` => `false` + +#### `isNegative()` + +Returns `true` if the number is negative, `false` otherwise. +Returns `false` for `0` and `-0`. + + - `bigInt(-23).isNegative()` => `true` + - `bigInt(50).isNegative()` => `false` + +#### `isOdd()` + +Returns `true` if the number is odd, `false` otherwise. + + - `bigInt(13).isOdd()` => `true` + - `bigInt(40).isOdd()` => `false` + +#### `isPositive()` + +Return `true` if the number is positive, `false` otherwise. +Returns `false` for `0` and `-0`. + + - `bigInt(54).isPositive()` => `true` + - `bigInt(-1).isPositive()` => `false` + +#### `isPrime()` + +Returns `true` if the number is prime, `false` otherwise. + + - `bigInt(5).isPrime()` => `true` + - `bigInt(6).isPrime()` => `false` + +#### `isProbablePrime([iterations])` + +Returns `true` if the number is very likely to be prime, `false` otherwise. +Argument is optional and determines the amount of iterations of the test (default: `5`). The more iterations, the lower chance of getting a false positive. +This uses the [Fermat primality test](https://en.wikipedia.org/wiki/Fermat_primality_test). + + - `bigInt(5).isProbablePrime()` => `true` + - `bigInt(49).isProbablePrime()` => `false` + - `bigInt(1729).isProbablePrime(50)` => `false` + +Note that this function is not deterministic, since it relies on random sampling of factors, so the result for some numbers is not always the same. [Carmichael numbers](https://en.wikipedia.org/wiki/Carmichael_number) are particularly prone to give unreliable results. + +For example, `bigInt(1729).isProbablePrime()` returns `false` about 76% of the time and `true` about 24% of the time. The correct result is `false`. + +#### `isUnit()` + +Returns `true` if the number is `1` or `-1`, `false` otherwise. + + - `bigInt.one.isUnit()` => `true` + - `bigInt.minusOne.isUnit()` => `true` + - `bigInt(5).isUnit()` => `false` + +#### `isZero()` + +Return `true` if the number is `0` or `-0`, `false` otherwise. + + - `bigInt.zero.isZero()` => `true` + - `bigInt("-0").isZero()` => `true` + - `bigInt(50).isZero()` => `false` + +#### `leq(number)` + +Alias for the `lesserOrEquals` method. + +#### `lesser(number)` + +Checks if the first number is lesser than the second. + + - `bigInt(5).lesser(6)` => `true` + - `bigInt(5).lesser(5)` => `false` + - `bigInt(5).lesser(4)` => `false` + +#### `lesserOrEquals(number)` + +Checks if the first number is less than or equal to the second. + + - `bigInt(5).lesserOrEquals(6)` => `true` + - `bigInt(5).lesserOrEquals(5)` => `true` + - `bigInt(5).lesserOrEquals(4)` => `false` + +#### `lt(number)` + +Alias for the `lesser` method. + +#### `minus(number)` + +Alias for the `subtract` method. + + - `bigInt(3).minus(5)` => `-2` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction) + +#### `mod(number)` + +Performs division and returns the remainder, disregarding the quotient. The sign of the remainder will match the sign of the dividend. + + - `bigInt(59).mod(5)` => `4` + - `bigInt(-5).mod(2)` => `-1` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `modInv(mod)` + +Finds the [multiplicative inverse](https://en.wikipedia.org/wiki/Modular_multiplicative_inverse) of the number modulo `mod`. + + - `bigInt(3).modInv(11)` => `4` + - `bigInt(42).modInv(2017)` => `1969` + +#### `modPow(exp, mod)` + +Takes the number to the power `exp` modulo `mod`. + + - `bigInt(10).modPow(3, 30)` => `10` + +#### `multiply(number)` + +Performs multiplication. + + - `bigInt(111).multiply(111)` => `12321` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication) + +#### `neq(number)` + +Alias for the `notEquals` method. + +#### `next()` + +Adds one to the number. + + - `bigInt(6).next()` => `7` + +#### `not()` + +Performs the bitwise NOT operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(10).not()` => `-11` + - `bigInt(0).not()` => `-1` + +#### `notEquals(number)` + +Checks if two numbers are not equal. + + - `bigInt(5).notEquals(5)` => `false` + - `bigInt(4).notEquals(7)` => `true` + +#### `or(number)` + +Performs the bitwise OR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(13).or(10)` => `15` + - `bigInt(13).or(-8)` => `-3` + +#### `over(number)` + +Alias for the `divide` method. + + - `bigInt(59).over(5)` => `11` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `plus(number)` + +Alias for the `add` method. + + - `bigInt(5).plus(7)` => `12` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition) + +#### `pow(number)` + +Performs exponentiation. If the exponent is less than `0`, `pow` returns `0`. `bigInt.zero.pow(0)` returns `1`. + + - `bigInt(16).pow(16)` => `18446744073709551616` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Exponentiation) + +#### `prev(number)` + +Subtracts one from the number. + + - `bigInt(6).prev()` => `5` + +#### `remainder(number)` + +Alias for the `mod` method. + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division) + +#### `shiftLeft(n)` + +Shifts the number left by `n` places in its binary representation. If a negative number is provided, it will shift right. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`. + + - `bigInt(8).shiftLeft(2)` => `32` + - `bigInt(8).shiftLeft(-2)` => `2` + +#### `shiftRight(n)` + +Shifts the number right by `n` places in its binary representation. If a negative number is provided, it will shift left. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`. + + - `bigInt(8).shiftRight(2)` => `2` + - `bigInt(8).shiftRight(-2)` => `32` + +#### `square()` + +Squares the number + + - `bigInt(3).square()` => `9` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Squaring) + +#### `subtract(number)` + +Performs subtraction. + + - `bigInt(3).subtract(5)` => `-2` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction) + +#### `times(number)` + +Alias for the `multiply` method. + + - `bigInt(111).times(111)` => `12321` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication) + +#### `toArray(radix)` + +Converts a bigInt into an object with the properties "value" and "isNegative." "Value" is an array of integers modulo the given radix. "isNegative" is a boolean that represents the sign of the result. + + - `bigInt("1e9").toArray(10)` => { + value: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + isNegative: false + } + - `bigInt("1e9").toArray(16)` => { + value: [3, 11, 9, 10, 12, 10, 0, 0], + isNegative: false + } + - `bigInt(567890).toArray(100)` => { + value: [56, 78, 90], + isNegative: false + } + +Negative bases are supported. + + - `bigInt(12345).toArray(-10)` => { + value: [2, 8, 4, 6, 5], + isNegative: false + } + +Base 1 and base -1 are also supported. + + - `bigInt(-15).toArray(1)` => { + value: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + isNegative: true + } + - `bigInt(-15).toArray(-1)` => { + value: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], + isNegative: false + } + +Base 0 is only allowed for the number zero. + + - `bigInt(0).toArray(0)` => { + value: [0], + isNegative: false + } + - `bigInt(1).toArray(0)` => `Error: Cannot convert nonzero numbers to base 0.` + +#### `toJSNumber()` + +Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range `[-9007199254740992, 9007199254740992]`. + + - `bigInt("18446744073709551616").toJSNumber()` => `18446744073709552000` + +#### `xor(number)` + +Performs the bitwise XOR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement). + + - `bigInt(12).xor(5)` => `9` + - `bigInt(12).xor(-5)` => `-9` + +### Static Methods + +#### `fromArray(digits, base = 10, isNegative?)` + +Constructs a bigInt from an array of digits in base `base`. The optional `isNegative` flag will make the number negative. + + - `bigInt.fromArray([1, 2, 3, 4, 5], 10)` => `12345` + - `bigInt.fromArray([1, 0, 0], 2, true)` => `-4` + +#### `gcd(a, b)` + +Finds the greatest common denominator of `a` and `b`. + + - `bigInt.gcd(42,56)` => `14` + +#### `isInstance(x)` + +Returns `true` if `x` is a BigInteger, `false` otherwise. + + - `bigInt.isInstance(bigInt(14))` => `true` + - `bigInt.isInstance(14)` => `false` + +#### `lcm(a,b)` + +Finds the least common multiple of `a` and `b`. + + - `bigInt.lcm(21, 6)` => `42` + +#### `max(a,b)` + +Returns the largest of `a` and `b`. + + - `bigInt.max(77, 432)` => `432` + +#### `min(a,b)` + +Returns the smallest of `a` and `b`. + + - `bigInt.min(77, 432)` => `77` + +#### `randBetween(min, max)` + +Returns a random number between `min` and `max`. + + - `bigInt.randBetween("-1e100", "1e100")` => (for example) `8494907165436643479673097939554427056789510374838494147955756275846226209006506706784609314471378745` + + +### Override Methods + +#### `toString(radix = 10)` + +Converts a bigInt to a string. There is an optional radix parameter (which defaults to 10) that converts the number to the given radix. Digits in the range `10-35` will use the letters `a-z`. + + - `bigInt("1e9").toString()` => `"1000000000"` + - `bigInt("1e9").toString(16)` => `"3b9aca00"` + +**Note that arithmetical operators will trigger the `valueOf` function rather than the `toString` function.** When converting a bigInteger to a string, you should use the `toString` method or the `String` function instead of adding the empty string. + + - `bigInt("999999999999999999").toString()` => `"999999999999999999"` + - `String(bigInt("999999999999999999"))` => `"999999999999999999"` + - `bigInt("999999999999999999") + ""` => `1000000000000000000` + +Bases larger than 36 are supported. If a digit is greater than or equal to 36, it will be enclosed in angle brackets. + + - `bigInt(567890).toString(100)` => `"<56><78><90>"` + +Negative bases are also supported. + + - `bigInt(12345).toString(-10)` => `"28465"` + +Base 1 and base -1 are also supported. + + - `bigInt(-15).toString(1)` => `"-111111111111111"` + - `bigInt(-15).toString(-1)` => `"101010101010101010101010101010"` + +Base 0 is only allowed for the number zero. + + - `bigInt(0).toString(0)` => `0` + - `bigInt(1).toString(0)` => `Error: Cannot convert nonzero numbers to base 0.` + +[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#toString) + +#### `valueOf()` + +Converts a bigInt to a native Javascript number. This override allows you to use native arithmetic operators without explicit conversion: + + - `bigInt("100") + bigInt("200") === 300; //true` + +## Contributors + +To contribute, just fork the project, make some changes, and submit a pull request. Please verify that the unit tests pass before submitting. + +The unit tests are contained in the `spec/spec.js` file. You can run them locally by opening the `spec/SpecRunner.html` or file or running `npm test`. You can also [run the tests online from GitHub](http://peterolson.github.io/BigInteger.js/spec/SpecRunner.html). + +There are performance benchmarks that can be viewed from the `benchmarks/index.html` page. You can [run them online from GitHub](http://peterolson.github.io/BigInteger.js/benchmark/). + +## License + +This project is public domain. For more details, read about the [Unlicense](http://unlicense.org/). diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/bower.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/bower.json new file mode 100644 index 0000000..22dc58f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/bower.json @@ -0,0 +1,29 @@ +{ + "name": "big-integer", + "description": "An arbitrary length integer library for Javascript", + "main": "./BigInteger.js", + "authors": [ + "Peter Olson" + ], + "license": "Unlicense", + "keywords": [ + "math", + "big", + "bignum", + "bigint", + "biginteger", + "integer", + "arbitrary", + "precision", + "arithmetic" + ], + "homepage": "https://github.com/peterolson/BigInteger.js", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "coverage", + "tests" + ] +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/package.json new file mode 100644 index 0000000..867c19e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/package.json @@ -0,0 +1,81 @@ +{ + "_from": "big-integer@^1.6.7", + "_id": "big-integer@1.6.32", + "_inBundle": true, + "_integrity": "sha512-ljKJdR3wk9thHfLj4DtrNiOSTxvGFaMjWrG4pW75juXC4j7+XuKJVFdg4kgFMYp85PVkO05dFMj2dk2xVsH4xw==", + "_location": "/cordova-android/big-integer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "big-integer@^1.6.7", + "name": "big-integer", + "escapedName": "big-integer", + "rawSpec": "^1.6.7", + "saveSpec": null, + "fetchSpec": "^1.6.7" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/bplist-parser" + ], + "_resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.32.tgz", + "_shasum": "5867458b25ecd5bcb36b627c30bb501a13c07e89", + "_spec": "big-integer@^1.6.7", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/bplist-parser", + "author": { + "name": "Peter Olson", + "email": "peter.e.c.olson+npm@gmail.com" + }, + "bin": {}, + "bugs": { + "url": "https://github.com/peterolson/BigInteger.js/issues" + }, + "bundleDependencies": false, + "contributors": [], + "deprecated": false, + "description": "An arbitrary length integer library for Javascript", + "devDependencies": { + "@types/lodash": "^4.14.109", + "@types/node": "^7.0.65", + "coveralls": "^2.11.4", + "jasmine": "2.1.x", + "jasmine-core": "^2.3.4", + "karma": "^0.13.22", + "karma-cli": "^1.0.1", + "karma-coverage": "^0.4.2", + "karma-jasmine": "^0.3.6", + "karma-phantomjs-launcher": "^1.0.4", + "lodash": "^4.17.4", + "typescript": "^2.3.3", + "uglifyjs": "^2.4.10" + }, + "engines": { + "node": ">=0.6" + }, + "homepage": "https://github.com/peterolson/BigInteger.js#readme", + "keywords": [ + "math", + "big", + "bignum", + "bigint", + "biginteger", + "integer", + "arbitrary", + "precision", + "arithmetic" + ], + "license": "Unlicense", + "main": "./BigInteger", + "name": "big-integer", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/peterolson/BigInteger.js.git" + }, + "scripts": { + "minify": "uglifyjs BigInteger.js -o BigInteger.min.js", + "test": "tsc && karma start my.conf.js && node spec/tsDefinitions.js" + }, + "typings": "./BigInteger.d.ts", + "version": "1.6.32" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/tsconfig.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/tsconfig.json new file mode 100644 index 0000000..62636e8 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/big-integer/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": false, + "baseUrl": "./", + "moduleResolution": "node", + "allowJs": true, + "typeRoots": [ + "./" + ], + "types": [ + "node" + ], + "forceConsistentCasingInFileNames": true + }, + "files": [ + "BigInteger.d.ts", + "spec/tsDefinitions.ts" + ] +} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/.npmignore new file mode 100644 index 0000000..a9b46ea --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/.npmignore @@ -0,0 +1,8 @@ +/build/* +node_modules +*.node +*.sh +*.swp +.lock* +npm-debug.log +.idea diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/README.md new file mode 100644 index 0000000..37e5e1c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/README.md @@ -0,0 +1,47 @@ +bplist-parser +============= + +Binary Mac OS X Plist (property list) parser. + +## Installation + +```bash +$ npm install bplist-parser +``` + +## Quick Examples + +```javascript +var bplist = require('bplist-parser'); + +bplist.parseFile('myPlist.bplist', function(err, obj) { + if (err) throw err; + + console.log(JSON.stringify(obj)); +}); +``` + +## License + +(The MIT License) + +Copyright (c) 2012 Near Infinity Corporation + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/bplistParser.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/bplistParser.js new file mode 100644 index 0000000..f8335bc --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/bplistParser.js @@ -0,0 +1,357 @@ +'use strict'; + +// adapted from http://code.google.com/p/plist/source/browse/trunk/src/com/dd/plist/BinaryPropertyListParser.java + +var fs = require('fs'); +var bigInt = require("big-integer"); +var debug = false; + +exports.maxObjectSize = 100 * 1000 * 1000; // 100Meg +exports.maxObjectCount = 32768; + +// EPOCH = new SimpleDateFormat("yyyy MM dd zzz").parse("2001 01 01 GMT").getTime(); +// ...but that's annoying in a static initializer because it can throw exceptions, ick. +// So we just hardcode the correct value. +var EPOCH = 978307200000; + +// UID object definition +var UID = exports.UID = function(id) { + this.UID = id; +} + +var parseFile = exports.parseFile = function (fileNameOrBuffer, callback) { + function tryParseBuffer(buffer) { + var err = null; + var result; + try { + result = parseBuffer(buffer); + } catch (ex) { + err = ex; + } + callback(err, result); + } + + if (Buffer.isBuffer(fileNameOrBuffer)) { + return tryParseBuffer(fileNameOrBuffer); + } else { + fs.readFile(fileNameOrBuffer, function (err, data) { + if (err) { return callback(err); } + tryParseBuffer(data); + }); + } +}; + +var parseBuffer = exports.parseBuffer = function (buffer) { + var result = {}; + + // check header + var header = buffer.slice(0, 'bplist'.length).toString('utf8'); + if (header !== 'bplist') { + throw new Error("Invalid binary plist. Expected 'bplist' at offset 0."); + } + + // Handle trailer, last 32 bytes of the file + var trailer = buffer.slice(buffer.length - 32, buffer.length); + // 6 null bytes (index 0 to 5) + var offsetSize = trailer.readUInt8(6); + if (debug) { + console.log("offsetSize: " + offsetSize); + } + var objectRefSize = trailer.readUInt8(7); + if (debug) { + console.log("objectRefSize: " + objectRefSize); + } + var numObjects = readUInt64BE(trailer, 8); + if (debug) { + console.log("numObjects: " + numObjects); + } + var topObject = readUInt64BE(trailer, 16); + if (debug) { + console.log("topObject: " + topObject); + } + var offsetTableOffset = readUInt64BE(trailer, 24); + if (debug) { + console.log("offsetTableOffset: " + offsetTableOffset); + } + + if (numObjects > exports.maxObjectCount) { + throw new Error("maxObjectCount exceeded"); + } + + // Handle offset table + var offsetTable = []; + + for (var i = 0; i < numObjects; i++) { + var offsetBytes = buffer.slice(offsetTableOffset + i * offsetSize, offsetTableOffset + (i + 1) * offsetSize); + offsetTable[i] = readUInt(offsetBytes, 0); + if (debug) { + console.log("Offset for Object #" + i + " is " + offsetTable[i] + " [" + offsetTable[i].toString(16) + "]"); + } + } + + // Parses an object inside the currently parsed binary property list. + // For the format specification check + // + // Apple's binary property list parser implementation. + function parseObject(tableOffset) { + var offset = offsetTable[tableOffset]; + var type = buffer[offset]; + var objType = (type & 0xF0) >> 4; //First 4 bits + var objInfo = (type & 0x0F); //Second 4 bits + switch (objType) { + case 0x0: + return parseSimple(); + case 0x1: + return parseInteger(); + case 0x8: + return parseUID(); + case 0x2: + return parseReal(); + case 0x3: + return parseDate(); + case 0x4: + return parseData(); + case 0x5: // ASCII + return parsePlistString(); + case 0x6: // UTF-16 + return parsePlistString(true); + case 0xA: + return parseArray(); + case 0xD: + return parseDictionary(); + default: + throw new Error("Unhandled type 0x" + objType.toString(16)); + } + + function parseSimple() { + //Simple + switch (objInfo) { + case 0x0: // null + return null; + case 0x8: // false + return false; + case 0x9: // true + return true; + case 0xF: // filler byte + return null; + default: + throw new Error("Unhandled simple type 0x" + objType.toString(16)); + } + } + + function bufferToHexString(buffer) { + var str = ''; + var i; + for (i = 0; i < buffer.length; i++) { + if (buffer[i] != 0x00) { + break; + } + } + for (; i < buffer.length; i++) { + var part = '00' + buffer[i].toString(16); + str += part.substr(part.length - 2); + } + return str; + } + + function parseInteger() { + var length = Math.pow(2, objInfo); + if (length > 4) { + var data = buffer.slice(offset + 1, offset + 1 + length); + var str = bufferToHexString(data); + return bigInt(str, 16); + } if (length < exports.maxObjectSize) { + return readUInt(buffer.slice(offset + 1, offset + 1 + length)); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseUID() { + var length = objInfo + 1; + if (length < exports.maxObjectSize) { + return new UID(readUInt(buffer.slice(offset + 1, offset + 1 + length))); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseReal() { + var length = Math.pow(2, objInfo); + if (length < exports.maxObjectSize) { + var realBuffer = buffer.slice(offset + 1, offset + 1 + length); + if (length === 4) { + return realBuffer.readFloatBE(0); + } + else if (length === 8) { + return realBuffer.readDoubleBE(0); + } + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseDate() { + if (objInfo != 0x3) { + console.error("Unknown date type :" + objInfo + ". Parsing anyway..."); + } + var dateBuffer = buffer.slice(offset + 1, offset + 9); + return new Date(EPOCH + (1000 * dateBuffer.readDoubleBE(0))); + } + + function parseData() { + var dataoffset = 1; + var length = objInfo; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.error("0x4: UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + dataoffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + if (length < exports.maxObjectSize) { + return buffer.slice(offset + dataoffset, offset + dataoffset + length); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parsePlistString (isUtf16) { + isUtf16 = isUtf16 || 0; + var enc = "utf8"; + var length = objInfo; + var stroffset = 1; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.err("UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + var stroffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + // length is String length -> to get byte length multiply by 2, as 1 character takes 2 bytes in UTF-16 + length *= (isUtf16 + 1); + if (length < exports.maxObjectSize) { + var plistString = new Buffer(buffer.slice(offset + stroffset, offset + stroffset + length)); + if (isUtf16) { + plistString = swapBytes(plistString); + enc = "ucs2"; + } + return plistString.toString(enc); + } else { + throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available."); + } + } + + function parseArray() { + var length = objInfo; + var arrayoffset = 1; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.error("0xa: UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + arrayoffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + if (length * objectRefSize > exports.maxObjectSize) { + throw new Error("To little heap space available!"); + } + var array = []; + for (var i = 0; i < length; i++) { + var objRef = readUInt(buffer.slice(offset + arrayoffset + i * objectRefSize, offset + arrayoffset + (i + 1) * objectRefSize)); + array[i] = parseObject(objRef); + } + return array; + } + + function parseDictionary() { + var length = objInfo; + var dictoffset = 1; + if (objInfo == 0xF) { + var int_type = buffer[offset + 1]; + var intType = (int_type & 0xF0) / 0x10; + if (intType != 0x1) { + console.error("0xD: UNEXPECTED LENGTH-INT TYPE! " + intType); + } + var intInfo = int_type & 0x0F; + var intLength = Math.pow(2, intInfo); + dictoffset = 2 + intLength; + if (intLength < 3) { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } else { + length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength)); + } + } + if (length * 2 * objectRefSize > exports.maxObjectSize) { + throw new Error("To little heap space available!"); + } + if (debug) { + console.log("Parsing dictionary #" + tableOffset); + } + var dict = {}; + for (var i = 0; i < length; i++) { + var keyRef = readUInt(buffer.slice(offset + dictoffset + i * objectRefSize, offset + dictoffset + (i + 1) * objectRefSize)); + var valRef = readUInt(buffer.slice(offset + dictoffset + (length * objectRefSize) + i * objectRefSize, offset + dictoffset + (length * objectRefSize) + (i + 1) * objectRefSize)); + var key = parseObject(keyRef); + var val = parseObject(valRef); + if (debug) { + console.log(" DICT #" + tableOffset + ": Mapped " + key + " to " + val); + } + dict[key] = val; + } + return dict; + } + } + + return [ parseObject(topObject) ]; +}; + +function readUInt(buffer, start) { + start = start || 0; + + var l = 0; + for (var i = start; i < buffer.length; i++) { + l <<= 8; + l |= buffer[i] & 0xFF; + } + return l; +} + +// we're just going to toss the high order bits because javascript doesn't have 64-bit ints +function readUInt64BE(buffer, start) { + var data = buffer.slice(start, start + 8); + return data.readUInt32BE(4, 8); +} + +function swapBytes(buffer) { + var len = buffer.length; + for (var i = 0; i < len; i += 2) { + var a = buffer[i]; + buffer[i] = buffer[i+1]; + buffer[i+1] = a; + } + return buffer; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/package.json new file mode 100644 index 0000000..a5ffdff --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/package.json @@ -0,0 +1,59 @@ +{ + "_from": "bplist-parser@^0.1.0", + "_id": "bplist-parser@0.1.1", + "_inBundle": true, + "_integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "_location": "/cordova-android/bplist-parser", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "bplist-parser@^0.1.0", + "name": "bplist-parser", + "escapedName": "bplist-parser", + "rawSpec": "^0.1.0", + "saveSpec": null, + "fetchSpec": "^0.1.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "_shasum": "d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6", + "_spec": "bplist-parser@^0.1.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Joe Ferner", + "email": "joe.ferner@nearinfinity.com" + }, + "bugs": { + "url": "https://github.com/nearinfinity/node-bplist-parser/issues" + }, + "bundleDependencies": false, + "dependencies": { + "big-integer": "^1.6.7" + }, + "deprecated": false, + "description": "Binary plist parser.", + "devDependencies": { + "nodeunit": "~0.9.1" + }, + "homepage": "https://github.com/nearinfinity/node-bplist-parser#readme", + "keywords": [ + "bplist", + "plist", + "parser" + ], + "license": "MIT", + "main": "bplistParser.js", + "name": "bplist-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/nearinfinity/node-bplist-parser.git" + }, + "scripts": { + "test": "./node_modules/nodeunit/bin/nodeunit test" + }, + "version": "0.1.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/airplay.bplist b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/airplay.bplist new file mode 100644 index 0000000000000000000000000000000000000000..931adea120d583e59d640bf218696d3a07a1455d GIT binary patch literal 341 zcmYc)$jK}&F)+Bv$i&RT%Er#Y$;B-oC?qT*Di)DaT9jClnV%OgAdr)vn39?jl9`(t zl$e*ES{yGRT#%DknUt8E?NpkUmRjVRTToINFCc^}>QH=U7HCd!YHD_3QcfzuN@a(wn|ao77^*Mixx~oJ z#~)f;l2}v%7gc6}0!|K2We1@q9tK@&Yi0Wn5K+#B;y_Ijl9N7$ zsu@}sIvJ)itYX;Au$5sK!vThq43`)#GhAV~%5ab2Il~KvR}AkNen8A*Vuac#1*M@B GBO?InLtPpG literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/iTunes-small.bplist b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/iTunes-small.bplist new file mode 100644 index 0000000000000000000000000000000000000000..b7edb14a00912ef3e673c0a5d8e0d0f1a7a5cad3 GIT binary patch literal 24433 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 literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.bplist b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.bplist new file mode 100644 index 0000000000000000000000000000000000000000..6da9c046165aa3b5327da20d50c021b1c2474fa8 GIT binary patch literal 84 zcmYc)$jK}&F)+Bq$jrnNQk7biFTfC)nO9#K9{hA_oy; NWQ5AG!W2PieE?iB4ru@Y literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.xml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.xml new file mode 100644 index 0000000..cc6cb03 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/int64.xml @@ -0,0 +1,10 @@ + + + + + zero + 0 + int64item + 12345678901234567890 + + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/parseTest.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/parseTest.js new file mode 100644 index 0000000..67e7bfa --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/parseTest.js @@ -0,0 +1,159 @@ +'use strict'; + +// tests are adapted from https://github.com/TooTallNate/node-plist + +var path = require('path'); +var nodeunit = require('nodeunit'); +var bplist = require('../'); + +module.exports = { + 'iTunes Small': function (test) { + var file = path.join(__dirname, "iTunes-small.bplist"); + var startTime1 = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime1) + 'ms'); + var dict = dicts[0]; + test.equal(dict['Application Version'], "9.0.3"); + test.equal(dict['Library Persistent ID'], "6F81D37F95101437"); + test.done(); + }); + }, + + 'sample1': function (test) { + var file = path.join(__dirname, "sample1.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + var dict = dicts[0]; + test.equal(dict['CFBundleIdentifier'], 'com.apple.dictionary.MySample'); + test.done(); + }); + }, + + 'sample2': function (test) { + var file = path.join(__dirname, "sample2.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + var dict = dicts[0]; + test.equal(dict['PopupMenu'][2]['Key'], "\n #import \n\n#import \n\nint main(int argc, char *argv[])\n{\n return macruby_main(\"rb_main.rb\", argc, argv);\n}\n"); + test.done(); + }); + }, + + 'airplay': function (test) { + var file = path.join(__dirname, "airplay.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.equal(dict['duration'], 5555.0495000000001); + test.equal(dict['position'], 4.6269989039999997); + test.done(); + }); + }, + + 'utf16': function (test) { + var file = path.join(__dirname, "utf16.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.equal(dict['CFBundleName'], 'sellStuff'); + test.equal(dict['CFBundleShortVersionString'], '2.6.1'); + test.equal(dict['NSHumanReadableCopyright'], '©2008-2012, sellStuff, Inc.'); + test.done(); + }); + }, + + 'utf16chinese': function (test) { + var file = path.join(__dirname, "utf16_chinese.plist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.equal(dict['CFBundleName'], '天翼阅读'); + test.equal(dict['CFBundleDisplayName'], '天翼阅读'); + test.done(); + }); + }, + + + + 'uid': function (test) { + var file = path.join(__dirname, "uid.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + + var dict = dicts[0]; + test.deepEqual(dict['$objects'][1]['NS.keys'], [{UID:2}, {UID:3}, {UID:4}]); + test.deepEqual(dict['$objects'][1]['NS.objects'], [{UID: 5}, {UID:6}, {UID:7}]); + test.deepEqual(dict['$top']['root'], {UID:1}); + test.done(); + }); + }, + + 'int64': function (test) { + var file = path.join(__dirname, "int64.bplist"); + var startTime = new Date(); + + bplist.parseFile(file, function (err, dicts) { + if (err) { + throw err; + } + + var endTime = new Date(); + console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms'); + var dict = dicts[0]; + test.equal(dict['zero'], '0'); + test.equal(dict['int64item'], '12345678901234567890'); + test.done(); + }); + } +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/sample1.bplist b/asciiblaster-cordoba/platforms/android/cordova/node_modules/bplist-parser/test/sample1.bplist new file mode 100644 index 0000000000000000000000000000000000000000..5b808ff2e4be8741f9cc0ad57263fffca75e3d2c GIT binary patch literal 605 zcmY*V&rTFE81J`=Afgm>K|tar9y~c2xEPPHBf1Gggdsu{Y|896yA7RA)9Csz=NK64SfK+yDTuheChAkufIPBT8iBI{yEfc+#If&cxk&lXUjs z+&rUm&9&7+wIv34gfi19D!YXpkts%}hg_@eP>~2UdqZf0r^x91@EUb9W8b35-C|^o zP#s2Rf@Tzm*gA-tvYF}9h)&l!%?c4A@eWw1QEpjb+`7F+4k-AnVhk$k} z&hox?Aqy1?-fL>-Xi(zj(x#J`N_qvb10El;v|q!!D+xwtubX1J*Pz$6sdPE7Gu}xq z$rxEAFUSUYPfo}u@`d~+e_;Y1!&7(#+pr7Aa0(ycGkk?_@Ev}@FF1#PqR!n)uZ|pt(tOY<*1I zyr20SI><;{2aQ&qOf$`M{D#-nO3m?|J&y*YZ*NP-C6~&63!~|pzO(-)rCa?Mp$s)R ifMYm=K3u~9MlgXXPedc4}pD6p)7M4pT|aNh~g2%*)5$ zz|_Fpz_M6SNVtKufvthPfg=Q{*bqb*g9xJ#pdLdIVGJUSF3HHs$wxu-=OyN*MnIUU z#qk2de!;$_C5cHnsVaaBL;H@M+SEWKZY=dM1~B89ELoG0)`@nGKLC^5s7+z`B(on!kQfQjel9ql#A|%BhDYS&dAFZc})Z{wq7iiEBA_(^^jQ<*9;qX2-TcH*SOCutVlkO zCESSgnGu8@cbLW!hnz621()YiV>mK1J#m*BNDVfy?}VO-k&8{Pz%(L9_r}d1cQg~v zhegVpgb_Qmw@}KMnVb@*@3yM^0uU2d44cs5T_015g0RzywND%`WSo6L;V+?D#oFn`&KK*9!RtW-VRGD_Tp_%DLs8 z={G>r5*Xa>DY?l zx)dvX6?f8CD1BfnCN)@J(K_mW?vH%oP%n9VkvYIN_77IBO}KV@T|HmO=9aVhoThWY ziHJHaiZYTi)m-Jz!Q!X#C~nc&66r zMn6X#WfgT)rv00;0FHs%pv}wtHTV|%0Dc0$foI?)_*a-0RG}!`7aZY{a3DMueii-_ zUI_n*GvX!jx>y%o@f-1xcp&~PJ{5n5N8xdJ63)T1@Ep7hm*5J#0XJX`Zo~V~f;M~z zzk}byefSG}0-wS^;otBDdZR6&iD2mXuvJ%?Z&9;=5#*@uSb6~T(>~3g+7DZ4H zyy1-(8Hsk(8GUj_beM4*M}2U3v4{^oC^)0z_{Ja)GG4}ilWa&C_hong+xh5`HEXscCNa$tGma4Z#34||FHPT zmaV9~r&8TpUA6D27hZgMytjW-S<9<<0G04)G9x9oIA2+Qp{o!TU9)B3bMw zDwc}KB-&)3hH@$f@p9KTiT7YtH%eHuhwvoPwJbm1)eU3Qs!Nv3qGThxY;8hjhG=#g znQ)>F>WO3~ts=Xio23Sb#jbNwSISP*Ox3_vmcQARr;)M?O=3r!QF^E}CR zptdW^h5>4vcaMU2ovx>-74#%gYygVPY726UjJ^t1%C?hsmR~80LwI+Ym^cr469xAo z1LcTHY=W%`Sxlj_rWC~z;DaN0_Xv3?)y$$5Rm?+bq(HE_T^2VQM!&Av;IhDVk;tS5 zgqd*Yow7Jg@Ki5Yn7XQBa}%;~zQrdvW1v%0@DA6xUO%X3N@}9D#B@>D@SxPjW0F{g zimDCPyP!ZWNumaYDIf(8ngl>1hZ%sjLeBJ68ZPID_ zRKuuKzDX8FK7ebX?;WPJ-#qE!W1L5v2_?(vFexZSJ+bCdMbgf@B8UyoCEYjTtpVJM~vGE8vL_OaJ3$?D_?(`}k<#w()+>2jfSuObt*}#? z9pFwqNF=3*OV}Fj%M%!x;VDciM5`5Hnx-m3LWtxNIRy*hLMRYQ)I;vvC0FYMZjTtEm#aV(E=C?5)-LNE}o`)K;8qL=&-Jg3);@u?g@jmN{`P$W>- z!%~M{bh=zOu!am$1IqcPC?E*&a6Bj^viwp-^9SMy6QjJ}CP=Fit61JiP;Cm9jii@N z1w(U6Ff+XaJp*t-Ak}Z%h0F$c=FP5te0J>G(viy>UEQ2N`11qq;8~bdmIVaA9ynXn& ziRLe?9A_w9Z64WZ_UQ9)cQ*9}SW+6?gFWDeHRq<3?20|s);YD8c&{|tCwV$NeV!rD zxM#QLuxG||%5&E9v*(I;zPH;edWm5Z&mr7GRsGZalb&xtny+XZCouE!qA5ouBpHbgXKTp@62W93hQAPvUjk4Hp0f(6f3c#>=^qLdx$;8zRI3t z-(yd)pR#AzU)kR{nw!U6$KA;B++uDCw~R}0_j5^ZgxksO@aTmB> YxQpB+?y{%;_`Hp`=UDUId~tvN2l=KQ%m4rY literal 0 HcmV?d00001 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..6b4e0e1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..0478be8 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..f693c51 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/brace-expansion/package.json @@ -0,0 +1,76 @@ +{ + "_from": "brace-expansion@^1.1.7", + "_id": "brace-expansion@1.1.11", + "_inBundle": true, + "_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "_location": "/cordova-android/brace-expansion", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "brace-expansion@^1.1.7", + "name": "brace-expansion", + "escapedName": "brace-expansion", + "rawSpec": "^1.1.7", + "saveSpec": null, + "fetchSpec": "^1.1.7" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/minimatch" + ], + "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "_shasum": "3c7fcbf529d87226f3d2f52b966ff5271eb441dd", + "_spec": "brace-expansion@^1.1.7", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/minimatch", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/brace-expansion/issues" + }, + "bundleDependencies": false, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "deprecated": false, + "description": "Brace expansion as known from sh/bash", + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "keywords": [], + "license": "MIT", + "main": "index.js", + "name": "brace-expansion", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "scripts": { + "bench": "matcha test/perf/bench.js", + "gentest": "bash test/generate.sh", + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.1.11" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/.travis.yml new file mode 100644 index 0000000..f1d0f13 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/README.markdown b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/README.markdown new file mode 100644 index 0000000..408f70a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/README.markdown @@ -0,0 +1,62 @@ +concat-map +========== + +Concatenative mapdashery. + +[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) + +[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) + +example +======= + +``` js +var concatMap = require('concat-map'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); +``` + +*** + +``` +[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] +``` + +methods +======= + +``` js +var concatMap = require('concat-map') +``` + +concatMap(xs, fn) +----------------- + +Return an array of concatenated elements by calling `fn(x, i)` for each element +`x` and each index `i` in the array `xs`. + +When `fn(x, i)` returns an array, its result will be concatenated with the +result array. If `fn(x, i)` returns anything else, that value will be pushed +onto the end of the result array. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install concat-map +``` + +license +======= + +MIT + +notes +===== + +This module was written while sitting high above the ground in a tree. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/index.js new file mode 100644 index 0000000..b29a781 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/index.js @@ -0,0 +1,13 @@ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/package.json new file mode 100644 index 0000000..b25d955 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/package.json @@ -0,0 +1,89 @@ +{ + "_from": "concat-map@0.0.1", + "_id": "concat-map@0.0.1", + "_inBundle": true, + "_integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "_location": "/cordova-android/concat-map", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "concat-map@0.0.1", + "name": "concat-map", + "escapedName": "concat-map", + "rawSpec": "0.0.1", + "saveSpec": null, + "fetchSpec": "0.0.1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/brace-expansion" + ], + "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "_spec": "concat-map@0.0.1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/brace-expansion", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/substack/node-concat-map/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "concatenative mapdashery", + "devDependencies": { + "tape": "~2.4.0" + }, + "directories": { + "example": "example", + "test": "test" + }, + "homepage": "https://github.com/substack/node-concat-map#readme", + "keywords": [ + "concat", + "concatMap", + "map", + "functional", + "higher-order" + ], + "license": "MIT", + "main": "index.js", + "name": "concat-map", + "repository": { + "type": "git", + "url": "git://github.com/substack/node-concat-map.git" + }, + "scripts": { + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": { + "ie": [ + 6, + 7, + 8, + 9 + ], + "ff": [ + 3.5, + 10, + 15 + ], + "chrome": [ + 10, + 22 + ], + "safari": [ + 5.1 + ], + "opera": [ + 12 + ] + } + }, + "version": "0.0.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/test/map.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/test/map.js new file mode 100644 index 0000000..fdbd702 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/concat-map/test/map.js @@ -0,0 +1,39 @@ +var concatMap = require('../'); +var test = require('tape'); + +test('empty or not', function (t) { + var xs = [ 1, 2, 3, 4, 5, 6 ]; + var ixes = []; + var ys = concatMap(xs, function (x, ix) { + ixes.push(ix); + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; + }); + t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); + t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); + t.end(); +}); + +test('always something', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('scalars', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : x; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('undefs', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function () {}); + t.same(ys, [ undefined, undefined, undefined, undefined ]); + t.end(); +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintignore new file mode 100644 index 0000000..161d0c6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintignore @@ -0,0 +1 @@ +spec/fixtures/* \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintrc.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintrc.yml new file mode 100644 index 0000000..21a8e7b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.eslintrc.yml @@ -0,0 +1,13 @@ +root: true +extends: semistandard +rules: + indent: + - error + - 4 + camelcase: off + padded-blocks: off + operator-linebreak: off + no-throw-literal: off + no-unused-vars: + - error + - args: after-used diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..91582f4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +### Platforms affected + + +### What does this PR do? + + +### What testing has been done on this change? + + +### Checklist +- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database +- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected. +- [ ] Added automated test coverage as appropriate for this change. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.npmignore new file mode 100644 index 0000000..5d14118 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.npmignore @@ -0,0 +1,2 @@ +spec +coverage diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.ratignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.ratignore new file mode 100644 index 0000000..f107416 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.ratignore @@ -0,0 +1,4 @@ +fixtures +coverage +jasmine.json +appveyor.yml diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.travis.yml new file mode 100644 index 0000000..b4e310d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/.travis.yml @@ -0,0 +1,17 @@ +language: node_js +sudo: false +git: + depth: 10 +node_js: + - "4" + - "6" + - "8" + - "10" +install: + - npm install + - npm install -g codecov +script: + - npm test + - npm run cover +after_script: + - codecov diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/README.md new file mode 100644 index 0000000..422c98b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/README.md @@ -0,0 +1,155 @@ + + +[![Build status](https://ci.appveyor.com/api/projects/status/wxkmo0jalsr8gane?svg=true)](https://ci.appveyor.com/project/ApacheSoftwareFoundation/cordova-common/branch/master) +[![Build Status](https://travis-ci.org/apache/cordova-common.svg?branch=master)](https://travis-ci.org/apache/cordova-common) +[![NPM](https://nodei.co/npm/cordova-common.png)](https://nodei.co/npm/cordova-common/) + +# cordova-common +Exposes shared functionality used by [cordova-lib](https://github.com/apache/cordova-lib/) and Cordova platforms. +## Exposed APIs + +### `events` + +Represents special instance of NodeJS EventEmitter which is intended to be used to post events to cordova-lib and cordova-cli + +Usage: +```js +var events = require('cordova-common').events; +events.emit('warn', 'Some warning message') +``` + +There are the following events supported by cordova-cli: `verbose`, `log`, `info`, `warn`, `error`. + +### `CordovaError` + +An error class used by Cordova to throw cordova-specific errors. The CordovaError class is inherited from Error, so CordovaError instances is also valid Error instances (`instanceof` check succeeds). + +Usage: + +```js +var CordovaError = require('cordova-common').CordovaError; +throw new CordovaError('Some error message', SOME_ERR_CODE); +``` + +See [CordovaError](src/CordovaError/CordovaError.js) for supported error codes. + +### `ConfigParser` + +Exposes functionality to deal with cordova project `config.xml` files. For ConfigParser API reference check [ConfigParser Readme](src/ConfigParser/README.md). + +Usage: +```js +var ConfigParser = require('cordova-common').ConfigParser; +var appConfig = new ConfigParser('path/to/cordova-app/config.xml'); +console.log(appconfig.name() + ':' + appConfig.version()); +``` + +### `PluginInfoProvider` and `PluginInfo` + +`PluginInfo` is a wrapper for cordova plugins' `plugin.xml` files. This class may be instantiated directly or via `PluginInfoProvider`. The difference is that `PluginInfoProvider` caches `PluginInfo` instances based on plugin source directory. + +Usage: +```js +var PluginInfo: require('cordova-common').PluginInfo; +var PluginInfoProvider: require('cordova-common').PluginInfoProvider; + +// The following instances are equal +var plugin1 = new PluginInfo('path/to/plugin_directory'); +var plugin2 = new PluginInfoProvider().get('path/to/plugin_directory'); + +console.log('The plugin ' + plugin1.id + ' has version ' + plugin1.version) +``` + +### `ActionStack` + +Utility module for dealing with sequential tasks. Provides a set of tasks that are needed to be done and reverts all tasks that are already completed if one of those tasks fail to complete. Used internally by cordova-lib and platform's plugin installation routines. + +Usage: +```js +var ActionStack = require('cordova-common').ActionStack; +var stack = new ActionStack() + +var action1 = stack.createAction(task1, [], task1_reverter, []); +var action2 = stack.createAction(task2, [], task2_reverter, []); + +stack.push(action1); +stack.push(action2); + +stack.process() +.then(function() { + // all actions succeded +}) +.catch(function(error){ + // One of actions failed with error +}) +``` + +### `superspawn` + +Module for spawning child processes with some advanced logic. + +Usage: +```js +var superspawn = require('cordova-common').superspawn; +superspawn.spawn('adb', ['devices']) +.progress(function(data){ + if (data.stderr) + console.error('"adb devices" raised an error: ' + data.stderr); +}) +.then(function(devices){ + // Do something... +}) +``` + +### `xmlHelpers` + +A set of utility methods for dealing with XML files. + +Usage: +```js +var xml = require('cordova-common').xmlHelpers; + +var xmlDoc1 = xml.parseElementtreeSync('some/xml/file'); +var xmlDoc2 = xml.parseElementtreeSync('another/xml/file'); + +xml.mergeXml(doc1, doc2); // doc2 now contains all the nodes from doc1 +``` + +### Other APIs + +The APIs listed below are also exposed but are intended to be only used internally by cordova plugin installation routines. + +``` +PlatformJson +ConfigChanges +ConfigKeeper +ConfigFile +mungeUtil +``` + +## Setup +* Clone this repository onto your local machine + `git clone https://github.com/apache/cordova-common.git` +* Navigate to cordova-common directory, install dependencies and npm-link + `cd cordova-common && npm install && npm link` +* Navigate to cordova-lib directory and link cordova-common + `cd && npm link cordova-common && npm install` diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/RELEASENOTES.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/RELEASENOTES.md new file mode 100644 index 0000000..1964047 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/RELEASENOTES.md @@ -0,0 +1,153 @@ + +# Cordova-common Release Notes + +### 2.2.5 (Jun 26, 2018) +* Use plist@2 (^2.1.0) to avoid engine warning message on Node.js 4 + +### 2.2.4 (June 15, 2018) + +* Revert change to update dependencies in package.json (needed to resolve issues with cordova-ios@4) +* Revert change to use strip-bom package to strip BOM +* Continue to use plist@^3.0.1 in package.json + +### 2.2.3 (June 1, 2018) +* Revert a minor refactoring that was incompatible with NodeJS 4.x. No change to functionality. + +### 2.2.2 (May 30, 2018) +* [CB-13979](https://issues.apache.org/jira/browse/CB-13979) More consistency for `config.xml` lookups +* [CB-14064](https://issues.apache.org/jira/browse/CB-14064) Remove Node 4 from CI matrix +* [CB-14088](https://issues.apache.org/jira/browse/CB-14088) Update dependencies +* [CB-11691](https://issues.apache.org/jira/browse/CB-11691) Fix for modifying binary plists +* [CB-13770](https://issues.apache.org/jira/browse/CB-13770) Warn when or not found +* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) Fix tests and path issues for **Windows** +* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) added unit test for config file provider +* [CB-13744](https://issues.apache.org/jira/browse/CB-13744) Recognize storyboards as XML files +* [CB-13674](https://issues.apache.org/jira/browse/CB-13674) Incremented package version to -dev + +### 2.2.1 (Dec 14, 2017) +* [CB-13674](https://issues.apache.org/jira/browse/CB-13674): updated dependencies + +### 2.2.0 (Nov 22, 2017) +* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) File Provider fix belongs in cordova-common +* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Spot fix for upcoming `cordova-android@7` changes. https://github.com/apache/cordova-android/pull/389 + +### 2.1.1 (Oct 04, 2017) +* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added `getFrameworks` to unit tests +* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to framework tag + +### 2.1.0 (August 30, 2017) +* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to `framework` tag +* [CB-13211](https://issues.apache.org/jira/browse/CB-13211) Add `allows-arbitrary-loads-for-media` attribute parsing for `getAccesses` +* [CB-11968](https://issues.apache.org/jira/browse/CB-11968) Added support for `` in `config.xml` +* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) set up `eslint` and removed `jshint` +* [CB-12785](https://issues.apache.org/jira/browse/CB-12785) added `.gitignore`, `travis`, and `appveyor` support +* [CB-12250](https://issues.apache.org/jira/browse/CB-12250) & [CB-12409](https://issues.apache.org/jira/browse/CB-12409) *iOS*: Fix bug with escaping properties from `plist` file +* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) updated `common`, `fetch`, and `serve` `pkgJson` to point `pkgJson` repo items to github mirrors +* [CB-12766](https://issues.apache.org/jira/browse/CB-12766) Consistently write `JSON` with 2 spaces indentation + +### 2.0.3 (May 02, 2017) +* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add option to get `resource-file` from `root` +* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add tests for `edit-config` in `config.xml` +* [CB-12665](https://issues.apache.org/jira/browse/CB-12665) removed `enginestrict` since it is deprecated + +### 2.0.2 (Apr 14, 2017) +* [CB-11233](https://issues.apache.org/jira/browse/CB-11233) - Support installing frameworks into 'Embedded Binaries' section of the Xcode project +* [CB-10438](https://issues.apache.org/jira/browse/CB-10438) - Install correct dependency version. Removed shell.remove, added pkg.json to dependency tests 1-3, and updated install.js (.replace) to fix tests in uninstall.spec.js and update to workw with jasmine 2.0 +* [CB-11120](https://issues.apache.org/jira/browse/CB-11120) - Allow short/display name in config.xml +* [CB-11346](https://issues.apache.org/jira/browse/CB-11346) - Remove known platforms check +* [CB-11977](https://issues.apache.org/jira/browse/CB-11977) - updated engines and enginescript for common, fetch, and serve + +### 2.0.1 (Mar 09, 2017) +* [CB-12557](https://issues.apache.org/jira/browse/CB-12557) add both stdout and stderr properties to the error object passed to superspawn reject handler. + +### 2.0.0 (Jan 17, 2017) +* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add `resource-file` parsing to `config.xml` +* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated `jshint` and updated tests to work with `jasmine@2` instead of `jasmine-node` +* [CB-12163](https://issues.apache.org/jira/browse/CB-12163) Add reference attrib to `resource-file` for **Windows** +* Move windows-specific logic to `cordova-windows` +* [CB-12189](https://issues.apache.org/jira/browse/CB-12189) Add implementation attribute to framework + +### 1.5.1 (Oct 12, 2016) +* [CB-12002](https://issues.apache.org/jira/browse/CB-12002) Add `getAllowIntents()` to `ConfigParser` +* [CB-11998](https://issues.apache.org/jira/browse/CB-11998) `cordova platform add` error with `cordova-common@1.5.0` + +### 1.5.0 (Oct 06, 2016) +* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) Add test case for different `edit-config` targets +* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add `edit-config` to `config.xml` +* [CB-11936](https://issues.apache.org/jira/browse/CB-11936) Support four new **App Transport Security (ATS)** keys +* update `config.xml` location if it is a **Android Studio** project. +* use `array` methods and `object.keys` for iterating. avoiding `for-in` loops +* [CB-11517](https://issues.apache.org/jira/browse/CB-11517) Allow `.folder` matches +* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) check `edit-config` target exists + +### 1.4.1 (Aug 09, 2016) +* Add general purpose `ConfigParser.getAttribute` API +* [CB-11653](https://issues.apache.org/jira/browse/CB-11653) moved `findProjectRoot` from `cordova-lib` to `cordova-common` +* [CB-11636](https://issues.apache.org/jira/browse/CB-11636) Handle attributes with quotes correctly +* [CB-11645](https://issues.apache.org/jira/browse/CB-11645) added check to see if `getEditConfig` exists before trying to use it +* [CB-9825](https://issues.apache.org/jira/browse/CB-9825) framework tag spec parsing + +### 1.4.0 (Jul 12, 2016) +* [CB-11023](https://issues.apache.org/jira/browse/CB-11023) Add edit-config functionality + +### 1.3.0 (May 12, 2016) +* [CB-11259](https://issues.apache.org/jira/browse/CB-11259): Improving prepare and build logging +* [CB-11194](https://issues.apache.org/jira/browse/CB-11194) Improve cordova load time +* [CB-1117](https://issues.apache.org/jira/browse/CB-1117) Add `FileUpdater` module to `cordova-common`. +* [CB-11131](https://issues.apache.org/jira/browse/CB-11131) Fix `TypeError: message.toUpperCase` is not a function in `CordovaLogger` + +### 1.2.0 (Apr 18, 2016) +* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Save modulesMetadata to both www and platform_www when necessary +* [CB-10833](https://issues.apache.org/jira/browse/CB-10833) Deduplicate common logic for plugin installation/uninstallation +* [CB-10822](https://issues.apache.org/jira/browse/CB-10822) Manage plugins/modules metadata using PlatformJson +* [CB-10940](https://issues.apache.org/jira/browse/CB-10940) Can't add Android platform from path +* [CB-10965](https://issues.apache.org/jira/browse/CB-10965) xml helper allows multiple instances to be merge in config.xml + +### 1.1.1 (Mar 18, 2016) +* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Update test to reflect merging of [CB-9264](https://issues.apache.org/jira/browse/CB-9264) fix +* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Platform-specific configuration preferences don't override global settings +* [CB-9264](https://issues.apache.org/jira/browse/CB-9264) Duplicate entries in `config.xml` +* [CB-10791](https://issues.apache.org/jira/browse/CB-10791) Add `adjustLoggerLevel` to `cordova-common.CordovaLogger` +* [CB-10662](https://issues.apache.org/jira/browse/CB-10662) Add tests for `ConfigParser.getStaticResources` +* [CB-10622](https://issues.apache.org/jira/browse/CB-10622) fix target attribute being ignored for images in `config.xml`. +* [CB-10583](https://issues.apache.org/jira/browse/CB-10583) Protect plugin preferences from adding extra Array properties. + +### 1.1.0 (Feb 16, 2016) +* [CB-10482](https://issues.apache.org/jira/browse/CB-10482) Remove references to windows8 from cordova-lib/cli +* [CB-10430](https://issues.apache.org/jira/browse/CB-10430) Adds forwardEvents method to easily connect two EventEmitters +* [CB-10176](https://issues.apache.org/jira/browse/CB-10176) Adds CordovaLogger class, based on logger module from cordova-cli +* [CB-10052](https://issues.apache.org/jira/browse/CB-10052) Expose child process' io streams via promise progress notification +* [CB-10497](https://issues.apache.org/jira/browse/CB-10497) Prefer .bat over .cmd on windows platform +* [CB-9984](https://issues.apache.org/jira/browse/CB-9984) Bumps plist version and fixes failing cordova-common test + +### 1.0.0 (Oct 29, 2015) + +* [CB-9890](https://issues.apache.org/jira/browse/CB-9890) Documents cordova-common +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Correct cordova-lib -> cordova-common in README +* Pick ConfigParser changes from apache@0c3614e +* [CB-9743](https://issues.apache.org/jira/browse/CB-9743) Removes system frameworks handling from ConfigChanges +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Cleans out code which has been moved to `cordova-common` +* Pick ConfigParser changes from apache@ddb027b +* Picking CordovaError changes from apache@a3b1fca +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Adds tests and fixtures based on existing cordova-lib ones +* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Initial implementation for cordova-common + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/appveyor.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/appveyor.yml new file mode 100644 index 0000000..5302ae0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/appveyor.yml @@ -0,0 +1,20 @@ +# appveyor file +# http://www.appveyor.com/docs/appveyor-yml + +environment: + matrix: + - nodejs_version: "4" + - nodejs_version: "6" + - nodejs_version: "8" + - nodejs_version: "10" + +install: + - ps: Install-Product node $env:nodejs_version + - npm install + +build: off + +test_script: + - node --version + - npm --version + - npm test diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/cordova-common.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/cordova-common.js new file mode 100644 index 0000000..801d510 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/cordova-common.js @@ -0,0 +1,47 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var addProperty = require('./src/util/addProperty'); + +module.exports = { }; + +addProperty(module, 'events', './src/events'); +addProperty(module, 'superspawn', './src/superspawn'); + +addProperty(module, 'ActionStack', './src/ActionStack'); +addProperty(module, 'CordovaError', './src/CordovaError/CordovaError'); +addProperty(module, 'CordovaLogger', './src/CordovaLogger'); +addProperty(module, 'CordovaCheck', './src/CordovaCheck'); +addProperty(module, 'CordovaExternalToolErrorContext', './src/CordovaError/CordovaExternalToolErrorContext'); +addProperty(module, 'PlatformJson', './src/PlatformJson'); +addProperty(module, 'ConfigParser', './src/ConfigParser/ConfigParser'); +addProperty(module, 'FileUpdater', './src/FileUpdater'); + +addProperty(module, 'PluginInfo', './src/PluginInfo/PluginInfo'); +addProperty(module, 'PluginInfoProvider', './src/PluginInfo/PluginInfoProvider'); + +addProperty(module, 'PluginManager', './src/PluginManager'); + +addProperty(module, 'ConfigChanges', './src/ConfigChanges/ConfigChanges'); +addProperty(module, 'ConfigKeeper', './src/ConfigChanges/ConfigKeeper'); +addProperty(module, 'ConfigFile', './src/ConfigChanges/ConfigFile'); +addProperty(module, 'mungeUtil', './src/ConfigChanges/munge-util'); + +addProperty(module, 'xmlHelpers', './src/util/xml-helpers'); + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/package.json new file mode 100644 index 0000000..d8a74af --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/package.json @@ -0,0 +1,81 @@ +{ + "_from": "cordova-common@2.2.5", + "_id": "cordova-common@2.2.5", + "_inBundle": true, + "_integrity": "sha1-+TzvKtSUz8v1bEbj1hKqqctfzDI=", + "_location": "/cordova-android/cordova-common", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "cordova-common@2.2.5", + "name": "cordova-common", + "escapedName": "cordova-common", + "rawSpec": "2.2.5", + "saveSpec": null, + "fetchSpec": "2.2.5" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-2.2.5.tgz", + "_shasum": "f93cef2ad494cfcbf56c46e3d612aaa9cb5fcc32", + "_spec": "cordova-common@2.2.5", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Apache Software Foundation" + }, + "bugs": { + "url": "https://issues.apache.org/jira/browse/CB", + "email": "dev@cordova.apache.org" + }, + "bundleDependencies": false, + "contributors": [], + "dependencies": { + "ansi": "^0.3.1", + "bplist-parser": "^0.1.0", + "cordova-registry-mapper": "^1.1.8", + "elementtree": "0.1.6", + "glob": "^5.0.13", + "minimatch": "^3.0.0", + "plist": "^2.1.0", + "q": "^1.4.1", + "shelljs": "^0.5.3", + "underscore": "^1.8.3", + "unorm": "^1.3.3" + }, + "deprecated": false, + "description": "Apache Cordova tools and platforms shared routines", + "devDependencies": { + "eslint": "^4.0.0", + "eslint-config-semistandard": "^11.0.0", + "eslint-config-standard": "^10.2.1", + "eslint-plugin-import": "^2.3.0", + "eslint-plugin-node": "^5.0.0", + "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-standard": "^3.0.1", + "istanbul": "^0.4.5", + "jasmine": "^2.5.2", + "osenv": "^0.1.3", + "promise-matchers": "^0.9.6", + "rewire": "^2.5.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "homepage": "https://github.com/apache/cordova-common#readme", + "license": "Apache-2.0", + "main": "cordova-common.js", + "name": "cordova-common", + "repository": { + "type": "git", + "url": "git+https://github.com/apache/cordova-common.git" + }, + "scripts": { + "cover": "istanbul cover --root src --print detail jasmine", + "eslint": "eslint src spec", + "jasmine": "jasmine JASMINE_CONFIG_PATH=spec/support/jasmine.json", + "test": "npm run eslint && npm run jasmine" + }, + "version": "2.2.5" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ActionStack.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ActionStack.js new file mode 100644 index 0000000..6983c5c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ActionStack.js @@ -0,0 +1,85 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 quotmark:false */ + +var events = require('./events'); +var Q = require('q'); + +function ActionStack () { + this.stack = []; + this.completed = []; +} + +ActionStack.prototype = { + createAction: function (handler, action_params, reverter, revert_params) { + return { + handler: { + run: handler, + params: action_params + }, + reverter: { + run: reverter, + params: revert_params + } + }; + }, + push: function (tx) { + this.stack.push(tx); + }, + // Returns a promise. + process: function (platform) { + events.emit('verbose', 'Beginning processing of action stack for ' + platform + ' project...'); + + while (this.stack.length) { + var action = this.stack.shift(); + var handler = action.handler.run; + var action_params = action.handler.params; + + try { + handler.apply(null, action_params); + } catch (e) { + events.emit('warn', 'Error during processing of action! Attempting to revert...'); + this.stack.unshift(action); + var issue = 'Uh oh!\n'; + // revert completed tasks + while (this.completed.length) { + var undo = this.completed.shift(); + var revert = undo.reverter.run; + var revert_params = undo.reverter.params; + + try { + revert.apply(null, revert_params); + } catch (err) { + events.emit('warn', 'Error during reversion of action! We probably really messed up your project now, sorry! D:'); + issue += 'A reversion action failed: ' + err.message + '\n'; + } + } + e.message = issue + e.message; + return Q.reject(e); + } + this.completed.push(action); + } + events.emit('verbose', 'Action stack processing complete.'); + + return Q(); + } +}; + +module.exports = ActionStack; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js new file mode 100644 index 0000000..e7ad0e2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js @@ -0,0 +1,426 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +/* + * This module deals with shared configuration / dependency "stuff". That is: + * - XML configuration files such as config.xml, AndroidManifest.xml or WMAppManifest.xml. + * - plist files in iOS + * Essentially, any type of shared resources that we need to handle with awareness + * of how potentially multiple plugins depend on a single shared resource, should be + * handled in this module. + * + * The implementation uses an object as a hash table, with "leaves" of the table tracking + * reference counts. + */ + +var path = require('path'); +var et = require('elementtree'); +var ConfigKeeper = require('./ConfigKeeper'); +var events = require('../events'); + +var mungeutil = require('./munge-util'); +var xml_helpers = require('../util/xml-helpers'); + +exports.PlatformMunger = PlatformMunger; + +exports.process = function (plugins_dir, project_dir, platform, platformJson, pluginInfoProvider) { + var munger = new PlatformMunger(platform, project_dir, platformJson, pluginInfoProvider); + munger.process(plugins_dir); + munger.save_all(); +}; + +/****************************************************************************** +* PlatformMunger class +* +* Can deal with config file of a single project. +* Parsed config files are cached in a ConfigKeeper object. +******************************************************************************/ +function PlatformMunger (platform, project_dir, platformJson, pluginInfoProvider) { + this.platform = platform; + this.project_dir = project_dir; + this.config_keeper = new ConfigKeeper(project_dir); + this.platformJson = platformJson; + this.pluginInfoProvider = pluginInfoProvider; +} + +// Write out all unsaved files. +PlatformMunger.prototype.save_all = PlatformMunger_save_all; +function PlatformMunger_save_all () { + this.config_keeper.save_all(); + this.platformJson.save(); +} + +// Apply a munge object to a single config file. +// The remove parameter tells whether to add the change or remove it. +PlatformMunger.prototype.apply_file_munge = PlatformMunger_apply_file_munge; +function PlatformMunger_apply_file_munge (file, munge, remove) { + var self = this; + + for (var selector in munge.parents) { + for (var xml_child in munge.parents[selector]) { + // this xml child is new, graft it (only if config file exists) + var config_file = self.config_keeper.get(self.project_dir, self.platform, file); + if (config_file.exists) { + if (remove) config_file.prune_child(selector, munge.parents[selector][xml_child]); + else config_file.graft_child(selector, munge.parents[selector][xml_child]); + } else { + events.emit('warn', 'config file ' + file + ' requested for changes not found at ' + config_file.filepath + ', ignoring'); + } + } + } +} + +PlatformMunger.prototype.remove_plugin_changes = remove_plugin_changes; +function remove_plugin_changes (pluginInfo, is_top_level) { + var self = this; + var platform_config = self.platformJson.root; + var plugin_vars = is_top_level ? + platform_config.installed_plugins[pluginInfo.id] : + platform_config.dependent_plugins[pluginInfo.id]; + var edit_config_changes = null; + if (pluginInfo.getEditConfigs) { + edit_config_changes = pluginInfo.getEditConfigs(self.platform); + } + + // get config munge, aka how did this plugin change various config files + var config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes); + // global munge looks at all plugins' changes to config files + var global_munge = platform_config.config_munge; + var munge = mungeutil.decrement_munge(global_munge, config_munge); + + for (var file in munge.files) { + self.apply_file_munge(file, munge.files[file], /* remove = */ true); + } + + // Remove from installed_plugins + self.platformJson.removePlugin(pluginInfo.id, is_top_level); + return self; +} + +PlatformMunger.prototype.add_plugin_changes = add_plugin_changes; +function add_plugin_changes (pluginInfo, plugin_vars, is_top_level, should_increment, plugin_force) { + var self = this; + var platform_config = self.platformJson.root; + + var edit_config_changes = null; + if (pluginInfo.getEditConfigs) { + edit_config_changes = pluginInfo.getEditConfigs(self.platform); + } + + var config_munge; + + if (!edit_config_changes || edit_config_changes.length === 0) { + // get config munge, aka how should this plugin change various config files + config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars); + } else { + var isConflictingInfo = is_conflicting(edit_config_changes, platform_config.config_munge, self, plugin_force); + + if (isConflictingInfo.conflictWithConfigxml) { + throw new Error(pluginInfo.id + + ' cannot be added. changes in this plugin conflicts with changes in config.xml. Conflicts must be resolved before plugin can be added.'); + } + if (plugin_force) { + events.emit('warn', '--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.'); + + // remove conflicting munges + var conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge); + for (var conflict_file in conflict_munge.files) { + self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true); + } + + // force add new munges + config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes); + } else if (isConflictingInfo.conflictFound) { + throw new Error('There was a conflict trying to modify attributes with in plugin ' + pluginInfo.id + + '. The conflicting plugin, ' + isConflictingInfo.conflictingPlugin + ', already modified the same attributes. The conflict must be resolved before ' + + pluginInfo.id + ' can be added. You may use --force to add the plugin and overwrite the conflicting attributes.'); + } else { + // no conflicts, will handle edit-config + config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes); + } + } + + self = munge_helper(should_increment, self, platform_config, config_munge); + + // Move to installed/dependent_plugins + self.platformJson.addPlugin(pluginInfo.id, plugin_vars || {}, is_top_level); + return self; +} + +// Handle edit-config changes from config.xml +PlatformMunger.prototype.add_config_changes = add_config_changes; +function add_config_changes (config, should_increment) { + var self = this; + var platform_config = self.platformJson.root; + + var config_munge; + var changes = []; + + if (config.getEditConfigs) { + var edit_config_changes = config.getEditConfigs(self.platform); + if (edit_config_changes) { + changes = changes.concat(edit_config_changes); + } + } + + if (config.getConfigFiles) { + var config_files_changes = config.getConfigFiles(self.platform); + if (config_files_changes) { + changes = changes.concat(config_files_changes); + } + } + + if (changes && changes.length > 0) { + var isConflictingInfo = is_conflicting(changes, platform_config.config_munge, self, true /* always force overwrite other edit-config */); + if (isConflictingInfo.conflictFound) { + var conflict_munge; + var conflict_file; + + if (Object.keys(isConflictingInfo.configxmlMunge.files).length !== 0) { + // silently remove conflicting config.xml munges so new munges can be added + conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.configxmlMunge); + for (conflict_file in conflict_munge.files) { + self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true); + } + } + if (Object.keys(isConflictingInfo.conflictingMunge.files).length !== 0) { + events.emit('warn', 'Conflict found, edit-config changes from config.xml will overwrite plugin.xml changes'); + + // remove conflicting plugin.xml munges + conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge); + for (conflict_file in conflict_munge.files) { + self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true); + } + } + } + } + + // Add config.xml edit-config and config-file munges + config_munge = self.generate_config_xml_munge(config, changes, 'config.xml'); + self = munge_helper(should_increment, self, platform_config, config_munge); + + // Move to installed/dependent_plugins + return self; +} + +function munge_helper (should_increment, self, platform_config, config_munge) { + // global munge looks at all changes to config files + + // TODO: The should_increment param is only used by cordova-cli and is going away soon. + // If should_increment is set to false, avoid modifying the global_munge (use clone) + // and apply the entire config_munge because it's already a proper subset of the global_munge. + var munge, global_munge; + if (should_increment) { + global_munge = platform_config.config_munge; + munge = mungeutil.increment_munge(global_munge, config_munge); + } else { + global_munge = mungeutil.clone_munge(platform_config.config_munge); + munge = config_munge; + } + + for (var file in munge.files) { + self.apply_file_munge(file, munge.files[file]); + } + + return self; +} + +// Load the global munge from platform json and apply all of it. +// Used by cordova prepare to re-generate some config file from platform +// defaults and the global munge. +PlatformMunger.prototype.reapply_global_munge = reapply_global_munge; +function reapply_global_munge () { + var self = this; + + var platform_config = self.platformJson.root; + var global_munge = platform_config.config_munge; + for (var file in global_munge.files) { + self.apply_file_munge(file, global_munge.files[file]); + } + + return self; +} + +// generate_plugin_config_munge +// Generate the munge object from config.xml +PlatformMunger.prototype.generate_config_xml_munge = generate_config_xml_munge; +function generate_config_xml_munge (config, config_changes, type) { + var munge = { files: {} }; + var id; + + if (!config_changes) { + return munge; + } + + if (type === 'config.xml') { + id = type; + } else { + id = config.id; + } + + config_changes.forEach(function (change) { + change.xmls.forEach(function (xml) { + // 1. stringify each xml + var stringified = (new et.ElementTree(xml)).write({xml_declaration: false}); + // 2. add into munge + if (change.mode) { + mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, id: id }); + } else { + mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after }); + } + }); + }); + return munge; +} + +// generate_plugin_config_munge +// Generate the munge object from plugin.xml + vars +PlatformMunger.prototype.generate_plugin_config_munge = generate_plugin_config_munge; +function generate_plugin_config_munge (pluginInfo, vars, edit_config_changes) { + var self = this; + + vars = vars || {}; + var munge = { files: {} }; + var changes = pluginInfo.getConfigFiles(self.platform); + + if (edit_config_changes) { + Array.prototype.push.apply(changes, edit_config_changes); + } + + changes.forEach(function (change) { + change.xmls.forEach(function (xml) { + // 1. stringify each xml + var stringified = (new et.ElementTree(xml)).write({xml_declaration: false}); + // interp vars + if (vars) { + Object.keys(vars).forEach(function (key) { + var regExp = new RegExp('\\$' + key, 'g'); + stringified = stringified.replace(regExp, vars[key]); + }); + } + // 2. add into munge + if (change.mode) { + if (change.mode !== 'remove') { + mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, plugin: pluginInfo.id }); + } + } else { + mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after }); + } + }); + }); + return munge; +} + +function is_conflicting (editchanges, config_munge, self, force) { + var files = config_munge.files; + var conflictFound = false; + var conflictWithConfigxml = false; + var conflictingMunge = { files: {} }; + var configxmlMunge = { files: {} }; + var conflictingParent; + var conflictingPlugin; + + editchanges.forEach(function (editchange) { + if (files[editchange.file]) { + var parents = files[editchange.file].parents; + var target = parents[editchange.target]; + + // Check if the edit target will resolve to an existing target + if (!target || target.length === 0) { + var file_xml = self.config_keeper.get(self.project_dir, self.platform, editchange.file).data; + var resolveEditTarget = xml_helpers.resolveParent(file_xml, editchange.target); + var resolveTarget; + + if (resolveEditTarget) { + for (var parent in parents) { + resolveTarget = xml_helpers.resolveParent(file_xml, parent); + if (resolveEditTarget === resolveTarget) { + conflictingParent = parent; + target = parents[parent]; + break; + } + } + } + } else { + conflictingParent = editchange.target; + } + + if (target && target.length !== 0) { + // conflict has been found + conflictFound = true; + + if (editchange.id === 'config.xml') { + if (target[0].id === 'config.xml') { + // Keep track of config.xml/config.xml edit-config conflicts + mungeutil.deep_add(configxmlMunge, editchange.file, conflictingParent, target[0]); + } else { + // Keep track of config.xml x plugin.xml edit-config conflicts + mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]); + } + } else { + if (target[0].id === 'config.xml') { + // plugin.xml cannot overwrite config.xml changes even if --force is used + conflictWithConfigxml = true; + return; + } + + if (force) { + // Need to find all conflicts when --force is used, track conflicting munges + mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]); + } else { + // plugin cannot overwrite other plugin changes without --force + conflictingPlugin = target[0].plugin; + + } + } + } + } + }); + + return {conflictFound: conflictFound, + conflictingPlugin: conflictingPlugin, + conflictingMunge: conflictingMunge, + configxmlMunge: configxmlMunge, + conflictWithConfigxml: conflictWithConfigxml}; +} + +// Go over the prepare queue and apply the config munges for each plugin +// that has been (un)installed. +PlatformMunger.prototype.process = PlatformMunger_process; +function PlatformMunger_process (plugins_dir) { + var self = this; + var platform_config = self.platformJson.root; + + // Uninstallation first + platform_config.prepare_queue.uninstalled.forEach(function (u) { + var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin)); + self.remove_plugin_changes(pluginInfo, u.topLevel); + }); + + // Now handle installation + platform_config.prepare_queue.installed.forEach(function (u) { + var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin)); + self.add_plugin_changes(pluginInfo, u.vars, u.topLevel, true, u.force); + }); + + // Empty out installed/ uninstalled queues. + platform_config.prepare_queue.uninstalled = []; + platform_config.prepare_queue.installed = []; +} +/** ** END of PlatformMunger ****/ diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js new file mode 100644 index 0000000..2e5ed5f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js @@ -0,0 +1,259 @@ +/* + * 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. + * +*/ + +/* eslint no-control-regex: 0 */ + +var fs = require('fs'); +var path = require('path'); + +var modules = {}; +var addProperty = require('../util/addProperty'); + +// Use delay loading to ensure plist and other node modules to not get loaded +// on Android, Windows platforms +addProperty(module, 'bplist', 'bplist-parser', modules); +addProperty(module, 'et', 'elementtree', modules); +addProperty(module, 'glob', 'glob', modules); +addProperty(module, 'plist', 'plist', modules); +addProperty(module, 'plist_helpers', '../util/plist-helpers', modules); +addProperty(module, 'xml_helpers', '../util/xml-helpers', modules); + +/****************************************************************************** +* ConfigFile class +* +* Can load and keep various types of config files. Provides some functionality +* specific to some file types such as grafting XML children. In most cases it +* should be instantiated by ConfigKeeper. +* +* For plugin.xml files use as: +* plugin_config = self.config_keeper.get(plugin_dir, '', 'plugin.xml'); +* +* TODO: Consider moving it out to a separate file and maybe partially with +* overrides in platform handlers. +******************************************************************************/ +function ConfigFile (project_dir, platform, file_tag) { + this.project_dir = project_dir; + this.platform = platform; + this.file_tag = file_tag; + this.is_changed = false; + + this.load(); +} + +// ConfigFile.load() +ConfigFile.prototype.load = ConfigFile_load; +function ConfigFile_load () { + var self = this; + + // config file may be in a place not exactly specified in the target + var filepath = self.filepath = resolveConfigFilePath(self.project_dir, self.platform, self.file_tag); + + if (!filepath || !fs.existsSync(filepath)) { + self.exists = false; + return; + } + self.exists = true; + self.mtime = fs.statSync(self.filepath).mtime; + + var ext = path.extname(filepath); + // Windows8 uses an appxmanifest, and wp8 will likely use + // the same in a future release + if (ext === '.xml' || ext === '.appxmanifest' || ext === '.storyboard') { + self.type = 'xml'; + self.data = modules.xml_helpers.parseElementtreeSync(filepath); + } else { + // plist file + self.type = 'plist'; + // TODO: isBinaryPlist() reads the file and then parse re-reads it again. + // We always write out text plist, not binary. + // Do we still need to support binary plist? + // If yes, use plist.parseStringSync() and read the file once. + self.data = isBinaryPlist(filepath) ? + modules.bplist.parseBuffer(fs.readFileSync(filepath))[0] : + modules.plist.parse(fs.readFileSync(filepath, 'utf8')); + } +} + +ConfigFile.prototype.save = function ConfigFile_save () { + var self = this; + if (self.type === 'xml') { + fs.writeFileSync(self.filepath, self.data.write({indent: 4}), 'utf-8'); + } else { + // plist + var regExp = new RegExp('[ \t\r\n]+?', 'g'); + fs.writeFileSync(self.filepath, modules.plist.build(self.data).replace(regExp, '')); + } + self.is_changed = false; +}; + +ConfigFile.prototype.graft_child = function ConfigFile_graft_child (selector, xml_child) { + var self = this; + var filepath = self.filepath; + var result; + if (self.type === 'xml') { + var xml_to_graft = [modules.et.XML(xml_child.xml)]; + switch (xml_child.mode) { + case 'merge': + result = modules.xml_helpers.graftXMLMerge(self.data, xml_to_graft, selector, xml_child); + break; + case 'overwrite': + result = modules.xml_helpers.graftXMLOverwrite(self.data, xml_to_graft, selector, xml_child); + break; + case 'remove': + result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft); + break; + default: + result = modules.xml_helpers.graftXML(self.data, xml_to_graft, selector, xml_child.after); + } + if (!result) { + throw new Error('Unable to graft xml at selector "' + selector + '" from "' + filepath + '" during config install'); + } + } else { + // plist file + result = modules.plist_helpers.graftPLIST(self.data, xml_child.xml, selector); + if (!result) { + throw new Error('Unable to graft plist "' + filepath + '" during config install'); + } + } + self.is_changed = true; +}; + +ConfigFile.prototype.prune_child = function ConfigFile_prune_child (selector, xml_child) { + var self = this; + var filepath = self.filepath; + var result; + if (self.type === 'xml') { + var xml_to_graft = [modules.et.XML(xml_child.xml)]; + switch (xml_child.mode) { + case 'merge': + case 'overwrite': + result = modules.xml_helpers.pruneXMLRestore(self.data, selector, xml_child); + break; + case 'remove': + result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft); + break; + default: + result = modules.xml_helpers.pruneXML(self.data, xml_to_graft, selector); + } + } else { + // plist file + result = modules.plist_helpers.prunePLIST(self.data, xml_child.xml, selector); + } + if (!result) { + var err_msg = 'Pruning at selector "' + selector + '" from "' + filepath + '" went bad.'; + throw new Error(err_msg); + } + self.is_changed = true; +}; + +// Some config-file target attributes are not qualified with a full leading directory, or contain wildcards. +// Resolve to a real path in this function. +// TODO: getIOSProjectname is slow because of glob, try to avoid calling it several times per project. +function resolveConfigFilePath (project_dir, platform, file) { + var filepath = path.join(project_dir, file); + var matches; + + file = path.normalize(file); + + if (file.indexOf('*') > -1) { + // handle wildcards in targets using glob. + matches = modules.glob.sync(path.join(project_dir, '**', file)); + if (matches.length) filepath = matches[0]; + + // [CB-5989] multiple Info.plist files may exist. default to $PROJECT_NAME-Info.plist + if (matches.length > 1 && file.indexOf('-Info.plist') > -1) { + var plistName = getIOSProjectname(project_dir) + '-Info.plist'; + for (var i = 0; i < matches.length; i++) { + if (matches[i].indexOf(plistName) > -1) { + filepath = matches[i]; + break; + } + } + } + return filepath; + } + + // XXX this checks for android studio projects + // only if none of the options above are satisfied does this get called + // TODO: Move this out of cordova-common and into the platforms somehow + if (platform === 'android' && !fs.existsSync(filepath)) { + if (file === 'AndroidManifest.xml') { + filepath = path.join(project_dir, 'app', 'src', 'main', 'AndroidManifest.xml'); + } else if (file.endsWith('config.xml')) { + filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', 'config.xml'); + } else if (file.endsWith('strings.xml')) { + // Plugins really shouldn't mess with strings.xml, since it's able to be localized + filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', 'strings.xml'); + } else if (file.includes(path.join('res', 'xml'))) { + // Catch-all for all other stored XML configuration in legacy plugins + var config_file = path.basename(file); + filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', config_file); + } + return filepath; + } + + // special-case config.xml target that is just "config.xml" for other platforms. This should + // be resolved to the real location of the file. + // TODO: Move this out of cordova-common into platforms + if (file === 'config.xml') { + if (platform === 'ubuntu') { + filepath = path.join(project_dir, 'config.xml'); + } else if (platform === 'ios') { + var iospath = module.exports.getIOSProjectname(project_dir); + filepath = path.join(project_dir, iospath, 'config.xml'); + } else { + matches = modules.glob.sync(path.join(project_dir, '**', 'config.xml')); + if (matches.length) filepath = matches[0]; + } + return filepath; + } + + // None of the special cases matched, returning project_dir/file. + return filepath; +} + +// Find out the real name of an iOS project +// TODO: glob is slow, need a better way or caching, or avoid using more than once. +function getIOSProjectname (project_dir) { + var matches = modules.glob.sync(path.join(project_dir, '*.xcodeproj')); + var iospath; + if (matches.length === 1) { + iospath = path.basename(matches[0], '.xcodeproj'); + } else { + var msg; + if (matches.length === 0) { + msg = 'Does not appear to be an xcode project, no xcode project file in ' + project_dir; + } else { + msg = 'There are multiple *.xcodeproj dirs in ' + project_dir; + } + throw new Error(msg); + } + return iospath; +} + +// determine if a plist file is binary +function isBinaryPlist (filename) { + // I wish there was a synchronous way to read only the first 6 bytes of a + // file. This is wasteful :/ + var buf = '' + fs.readFileSync(filename, 'utf8'); + // binary plists start with a magic header, "bplist" + return buf.substring(0, 6) === 'bplist'; +} + +module.exports = ConfigFile; +module.exports.isBinaryPlist = isBinaryPlist; +module.exports.getIOSProjectname = getIOSProjectname; +module.exports.resolveConfigFilePath = resolveConfigFilePath; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js new file mode 100644 index 0000000..0ef0435 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js @@ -0,0 +1,64 @@ +/* + * 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 sub:true */ + +var path = require('path'); +var ConfigFile = require('./ConfigFile'); + +/****************************************************************************** +* ConfigKeeper class +* +* Used to load and store config files to avoid re-parsing and writing them out +* multiple times. +* +* The config files are referred to by a fake path constructed as +* project_dir/platform/file +* where file is the name used for the file in config munges. +******************************************************************************/ +function ConfigKeeper (project_dir, plugins_dir) { + this.project_dir = project_dir; + this.plugins_dir = plugins_dir; + this._cached = {}; +} + +ConfigKeeper.prototype.get = function ConfigKeeper_get (project_dir, platform, file) { + var self = this; + + // This fixes a bug with older plugins - when specifying config xml instead of res/xml/config.xml + // https://issues.apache.org/jira/browse/CB-6414 + if (file === 'config.xml' && platform === 'android') { + file = 'res/xml/config.xml'; + } + var fake_path = path.join(project_dir, platform, file); + + if (self._cached[fake_path]) { + return self._cached[fake_path]; + } + // File was not cached, need to load. + var config_file = new ConfigFile(project_dir, platform, file); + self._cached[fake_path] = config_file; + return config_file; +}; + +ConfigKeeper.prototype.save_all = function ConfigKeeper_save_all () { + var self = this; + Object.keys(self._cached).forEach(function (fake_path) { + var config_file = self._cached[fake_path]; + if (config_file.is_changed) config_file.save(); + }); +}; + +module.exports = ConfigKeeper; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/munge-util.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/munge-util.js new file mode 100644 index 0000000..62648d8 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/munge-util.js @@ -0,0 +1,162 @@ +/* + * 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 sub:true */ + +var _ = require('underscore'); + +// add the count of [key1][key2]...[keyN] to obj +// return true if it didn't exist before +exports.deep_add = function deep_add (obj, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + + return exports.process_munge(obj, true/* createParents */, function (parentArray, k) { + var found = _.find(parentArray, function (element) { + return element.xml === k.xml; + }); + if (found) { + found.after = found.after || k.after; + found.count += k.count; + } else { + parentArray.push(k); + } + return !found; + }, keys); +}; + +// decrement the count of [key1][key2]...[keyN] from obj and remove if it reaches 0 +// return true if it was removed or not found +exports.deep_remove = function deep_remove (obj, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + + var result = exports.process_munge(obj, false/* createParents */, function (parentArray, k) { + var index = -1; + var found = _.find(parentArray, function (element) { + index++; + return element.xml === k.xml; + }); + if (found) { + if (parentArray[index].oldAttrib) { + k.oldAttrib = _.extend({}, parentArray[index].oldAttrib); + } + found.count -= k.count; + if (found.count > 0) { + return false; + } else { + parentArray.splice(index, 1); + } + } + return undefined; + }, keys); + + return typeof result === 'undefined' ? true : result; +}; + +// search for [key1][key2]...[keyN] +// return the object or undefined if not found +exports.deep_find = function deep_find (obj, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + + return exports.process_munge(obj, false/* createParents? */, function (parentArray, k) { + return _.find(parentArray, function (element) { + return element.xml === (k.xml || k); + }); + }, keys); +}; + +// Execute func passing it the parent array and the xmlChild key. +// When createParents is true, add the file and parent items they are missing +// When createParents is false, stop and return undefined if the file and/or parent items are missing + +exports.process_munge = function process_munge (obj, createParents, func, keys /* or key1, key2 .... */) { + if (!Array.isArray(keys)) { + keys = Array.prototype.slice.call(arguments, 1); + } + var k = keys[0]; + if (keys.length === 1) { + return func(obj, k); + } else if (keys.length === 2) { + if (!obj.parents[k] && !createParents) { + return undefined; + } + obj.parents[k] = obj.parents[k] || []; + return exports.process_munge(obj.parents[k], createParents, func, keys.slice(1)); + } else if (keys.length === 3) { + if (!obj.files[k] && !createParents) { + return undefined; + } + obj.files[k] = obj.files[k] || { parents: {} }; + return exports.process_munge(obj.files[k], createParents, func, keys.slice(1)); + } else { + throw new Error('Invalid key format. Must contain at most 3 elements (file, parent, xmlChild).'); + } +}; + +// All values from munge are added to base as +// base[file][selector][child] += munge[file][selector][child] +// Returns a munge object containing values that exist in munge +// but not in base. +exports.increment_munge = function increment_munge (base, munge) { + var diff = { files: {} }; + + for (var file in munge.files) { + for (var selector in munge.files[file].parents) { + for (var xml_child in munge.files[file].parents[selector]) { + var val = munge.files[file].parents[selector][xml_child]; + // if node not in base, add it to diff and base + // else increment it's value in base without adding to diff + var newlyAdded = exports.deep_add(base, [file, selector, val]); + if (newlyAdded) { + exports.deep_add(diff, file, selector, val); + } + } + } + } + return diff; +}; + +// Update the base munge object as +// base[file][selector][child] -= munge[file][selector][child] +// nodes that reached zero value are removed from base and added to the returned munge +// object. +exports.decrement_munge = function decrement_munge (base, munge) { + var zeroed = { files: {} }; + + for (var file in munge.files) { + for (var selector in munge.files[file].parents) { + for (var xml_child in munge.files[file].parents[selector]) { + var val = munge.files[file].parents[selector][xml_child]; + // if node not in base, add it to diff and base + // else increment it's value in base without adding to diff + var removed = exports.deep_remove(base, [file, selector, val]); + if (removed) { + exports.deep_add(zeroed, file, selector, val); + } + } + } + } + return zeroed; +}; + +// For better readability where used +exports.clone_munge = function clone_munge (munge) { + return exports.increment_munge({}, munge); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigParser/ConfigParser.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigParser/ConfigParser.js new file mode 100644 index 0000000..1a98c3a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/ConfigParser/ConfigParser.js @@ -0,0 +1,602 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var et = require('elementtree'); +var xml = require('../util/xml-helpers'); +var CordovaError = require('../CordovaError/CordovaError'); +var fs = require('fs'); +var events = require('../events'); + +/** Wraps a config.xml file */ +function ConfigParser (path) { + this.path = path; + try { + this.doc = xml.parseElementtreeSync(path); + this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc); + et.register_namespace(this.cdvNamespacePrefix, 'http://cordova.apache.org/ns/1.0'); + } catch (e) { + events.emit('error', 'Parsing ' + path + ' failed'); + throw e; + } + var r = this.doc.getroot(); + if (r.tag !== 'widget') { + throw new CordovaError(path + ' has incorrect root node name (expected "widget", was "' + r.tag + '")'); + } +} + +function getNodeTextSafe (el) { + return el && el.text && el.text.trim(); +} + +function findOrCreate (doc, name) { + var ret = doc.find(name); + if (!ret) { + ret = new et.Element(name); + doc.getroot().append(ret); + } + return ret; +} + +function getCordovaNamespacePrefix (doc) { + var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib); + var prefix = 'cdv'; + for (var j = 0; j < rootAtribs.length; j++) { + if (rootAtribs[j].indexOf('xmlns:') === 0 && + doc.getroot().attrib[rootAtribs[j]] === 'http://cordova.apache.org/ns/1.0') { + var strings = rootAtribs[j].split(':'); + prefix = strings[1]; + break; + } + } + return prefix; +} + +/** + * Finds the value of an element's attribute + * @param {String} attributeName Name of the attribute to search for + * @param {Array} elems An array of ElementTree nodes + * @return {String} + */ +function findElementAttributeValue (attributeName, elems) { + + elems = Array.isArray(elems) ? elems : [ elems ]; + + var value = elems.filter(function (elem) { + return elem.attrib.name.toLowerCase() === attributeName.toLowerCase(); + }).map(function (filteredElems) { + return filteredElems.attrib.value; + }).pop(); + + return value || ''; +} + +function removeChildren (el, selector) { + const matches = el.findall(selector); + matches.forEach(child => el.remove(child)); +} + +ConfigParser.prototype = { + getAttribute: function (attr) { + return this.doc.getroot().attrib[attr]; + }, + + packageName: function () { + return this.getAttribute('id'); + }, + setPackageName: function (id) { + this.doc.getroot().attrib['id'] = id; + }, + android_packageName: function () { + return this.getAttribute('android-packageName'); + }, + android_activityName: function () { + return this.getAttribute('android-activityName'); + }, + ios_CFBundleIdentifier: function () { + return this.getAttribute('ios-CFBundleIdentifier'); + }, + name: function () { + return getNodeTextSafe(this.doc.find('name')); + }, + setName: function (name) { + var el = findOrCreate(this.doc, 'name'); + el.text = name; + }, + shortName: function () { + return this.doc.find('name').attrib['short'] || this.name(); + }, + setShortName: function (shortname) { + var el = findOrCreate(this.doc, 'name'); + if (!el.text) { + el.text = shortname; + } + el.attrib['short'] = shortname; + }, + description: function () { + return getNodeTextSafe(this.doc.find('description')); + }, + setDescription: function (text) { + var el = findOrCreate(this.doc, 'description'); + el.text = text; + }, + version: function () { + return this.getAttribute('version'); + }, + windows_packageVersion: function () { + return this.getAttribute('windows-packageVersion'); + }, + android_versionCode: function () { + return this.getAttribute('android-versionCode'); + }, + ios_CFBundleVersion: function () { + return this.getAttribute('ios-CFBundleVersion'); + }, + setVersion: function (value) { + this.doc.getroot().attrib['version'] = value; + }, + author: function () { + return getNodeTextSafe(this.doc.find('author')); + }, + getGlobalPreference: function (name) { + return findElementAttributeValue(name, this.doc.findall('preference')); + }, + setGlobalPreference: function (name, value) { + var pref = this.doc.find('preference[@name="' + name + '"]'); + if (!pref) { + pref = new et.Element('preference'); + pref.attrib.name = name; + this.doc.getroot().append(pref); + } + pref.attrib.value = value; + }, + getPlatformPreference: function (name, platform) { + return findElementAttributeValue(name, this.doc.findall('./platform[@name="' + platform + '"]/preference')); + }, + getPreference: function (name, platform) { + + var platformPreference = ''; + + if (platform) { + platformPreference = this.getPlatformPreference(name, platform); + } + + return platformPreference || this.getGlobalPreference(name); + + }, + /** + * Returns all resources for the platform specified. + * @param {String} platform The platform. + * @param {string} resourceName Type of static resources to return. + * "icon" and "splash" currently supported. + * @return {Array} Resources for the platform specified. + */ + getStaticResources: function (platform, resourceName) { + var ret = []; + var staticResources = []; + if (platform) { // platform specific icons + this.doc.findall('./platform[@name="' + platform + '"]/' + resourceName).forEach(function (elt) { + elt.platform = platform; // mark as platform specific resource + staticResources.push(elt); + }); + } + // root level resources + staticResources = staticResources.concat(this.doc.findall(resourceName)); + // parse resource elements + var that = this; + staticResources.forEach(function (elt) { + var res = {}; + res.src = elt.attrib.src; + res.target = elt.attrib.target || undefined; + res.density = elt.attrib['density'] || elt.attrib[that.cdvNamespacePrefix + ':density'] || elt.attrib['gap:density']; + res.platform = elt.platform || null; // null means icon represents default icon (shared between platforms) + res.width = +elt.attrib.width || undefined; + res.height = +elt.attrib.height || undefined; + + // default icon + if (!res.width && !res.height && !res.density) { + ret.defaultResource = res; + } + ret.push(res); + }); + + /** + * Returns resource with specified width and/or height. + * @param {number} width Width of resource. + * @param {number} height Height of resource. + * @return {Resource} Resource object or null if not found. + */ + ret.getBySize = function (width, height) { + return ret.filter(function (res) { + if (!res.width && !res.height) { + return false; + } + return ((!res.width || (width === res.width)) && + (!res.height || (height === res.height))); + })[0] || null; + }; + + /** + * Returns resource with specified density. + * @param {string} density Density of resource. + * @return {Resource} Resource object or null if not found. + */ + ret.getByDensity = function (density) { + return ret.filter(function (res) { + return res.density === density; + })[0] || null; + }; + + /** Returns default icons */ + ret.getDefault = function () { + return ret.defaultResource; + }; + + return ret; + }, + + /** + * Returns all icons for specific platform. + * @param {string} platform Platform name + * @return {Resource[]} Array of icon objects. + */ + getIcons: function (platform) { + return this.getStaticResources(platform, 'icon'); + }, + + /** + * Returns all splash images for specific platform. + * @param {string} platform Platform name + * @return {Resource[]} Array of Splash objects. + */ + getSplashScreens: function (platform) { + return this.getStaticResources(platform, 'splash'); + }, + + /** + * Returns all resource-files for a specific platform. + * @param {string} platform Platform name + * @param {boolean} includeGlobal Whether to return resource-files at the + * root level. + * @return {Resource[]} Array of resource file objects. + */ + getFileResources: function (platform, includeGlobal) { + var fileResources = []; + + if (platform) { // platform specific resources + fileResources = this.doc.findall('./platform[@name="' + platform + '"]/resource-file').map(function (tag) { + return { + platform: platform, + src: tag.attrib.src, + target: tag.attrib.target, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'], + arch: tag.attrib.arch + }; + }); + } + + if (includeGlobal) { + this.doc.findall('resource-file').forEach(function (tag) { + fileResources.push({ + platform: platform || null, + src: tag.attrib.src, + target: tag.attrib.target, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'], + arch: tag.attrib.arch + }); + }); + } + + return fileResources; + }, + + /** + * Returns all hook scripts for the hook type specified. + * @param {String} hook The hook type. + * @param {Array} platforms Platforms to look for scripts into (root scripts will be included as well). + * @return {Array} Script elements. + */ + getHookScripts: function (hook, platforms) { + var self = this; + var scriptElements = self.doc.findall('./hook'); + + if (platforms) { + platforms.forEach(function (platform) { + scriptElements = scriptElements.concat(self.doc.findall('./platform[@name="' + platform + '"]/hook')); + }); + } + + function filterScriptByHookType (el) { + return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook; + } + + return scriptElements.filter(filterScriptByHookType); + }, + /** + * Returns a list of plugin (IDs). + * + * This function also returns any plugin's that + * were defined using the legacy tags. + * @return {string[]} Array of plugin IDs + */ + getPluginIdList: function () { + var plugins = this.doc.findall('plugin'); + var result = plugins.map(function (plugin) { + return plugin.attrib.name; + }); + var features = this.doc.findall('feature'); + features.forEach(function (element) { + var idTag = element.find('./param[@name="id"]'); + if (idTag) { + result.push(idTag.attrib.value); + } + }); + return result; + }, + getPlugins: function () { + return this.getPluginIdList().map(function (pluginId) { + return this.getPlugin(pluginId); + }, this); + }, + /** + * Adds a plugin element. Does not check for duplicates. + * @name addPlugin + * @function + * @param {object} attributes name and spec are supported + * @param {Array|object} variables name, value or arbitary object + */ + addPlugin: function (attributes, variables) { + if (!attributes && !attributes.name) return; + var el = new et.Element('plugin'); + el.attrib.name = attributes.name; + if (attributes.spec) { + el.attrib.spec = attributes.spec; + } + + // support arbitrary object as variables source + if (variables && typeof variables === 'object' && !Array.isArray(variables)) { + variables = Object.keys(variables) + .map(function (variableName) { + return {name: variableName, value: variables[variableName]}; + }); + } + + if (variables) { + variables.forEach(function (variable) { + el.append(new et.Element('variable', { name: variable.name, value: variable.value })); + }); + } + this.doc.getroot().append(el); + }, + /** + * Retrives the plugin with the given id or null if not found. + * + * This function also returns any plugin's that + * were defined using the legacy tags. + * @name getPlugin + * @function + * @param {String} id + * @returns {object} plugin including any variables + */ + getPlugin: function (id) { + if (!id) { + return undefined; + } + var pluginElement = this.doc.find('./plugin/[@name="' + id + '"]'); + if (pluginElement === null) { + var legacyFeature = this.doc.find('./feature/param[@name="id"][@value="' + id + '"]/..'); + if (legacyFeature) { + events.emit('log', 'Found deprecated feature entry for ' + id + ' in config.xml.'); + return featureToPlugin(legacyFeature); + } + return undefined; + } + var plugin = {}; + + plugin.name = pluginElement.attrib.name; + plugin.spec = pluginElement.attrib.spec || pluginElement.attrib.src || pluginElement.attrib.version; + plugin.variables = {}; + var variableElements = pluginElement.findall('variable'); + variableElements.forEach(function (varElement) { + var name = varElement.attrib.name; + var value = varElement.attrib.value; + if (name) { + plugin.variables[name] = value; + } + }); + return plugin; + }, + /** + * Remove the plugin entry with give name (id). + * + * This function also operates on any plugin's that + * were defined using the legacy tags. + * @name removePlugin + * @function + * @param id name of the plugin + */ + removePlugin: function (id) { + if (!id) return; + const root = this.doc.getroot(); + removeChildren(root, `./plugin/[@name="${id}"]`); + removeChildren(root, `./feature/param[@name="id"][@value="${id}"]/..`); + }, + + // Add any element to the root + addElement: function (name, attributes) { + var el = et.Element(name); + for (var a in attributes) { + el.attrib[a] = attributes[a]; + } + this.doc.getroot().append(el); + }, + + /** + * Adds an engine. Does not check for duplicates. + * @param {String} name the engine name + * @param {String} spec engine source location or version (optional) + */ + addEngine: function (name, spec) { + if (!name) return; + var el = et.Element('engine'); + el.attrib.name = name; + if (spec) { + el.attrib.spec = spec; + } + this.doc.getroot().append(el); + }, + /** + * Removes all the engines with given name + * @param {String} name the engine name. + */ + removeEngine: function (name) { + removeChildren(this.doc.getroot(), `./engine/[@name="${name}"]`); + }, + getEngines: function () { + var engines = this.doc.findall('./engine'); + return engines.map(function (engine) { + var spec = engine.attrib.spec || engine.attrib.version; + return { + 'name': engine.attrib.name, + 'spec': spec || null + }; + }); + }, + /* Get all the access tags */ + getAccesses: function () { + var accesses = this.doc.findall('./access'); + return accesses.map(function (access) { + var minimum_tls_version = access.attrib['minimum-tls-version']; /* String */ + var requires_forward_secrecy = access.attrib['requires-forward-secrecy']; /* Boolean */ + var requires_certificate_transparency = access.attrib['requires-certificate-transparency']; /* Boolean */ + var allows_arbitrary_loads_in_web_content = access.attrib['allows-arbitrary-loads-in-web-content']; /* Boolean */ + var allows_arbitrary_loads_in_media = access.attrib['allows-arbitrary-loads-in-media']; /* Boolean (DEPRECATED) */ + var allows_arbitrary_loads_for_media = access.attrib['allows-arbitrary-loads-for-media']; /* Boolean */ + var allows_local_networking = access.attrib['allows-local-networking']; /* Boolean */ + + return { + 'origin': access.attrib.origin, + 'minimum_tls_version': minimum_tls_version, + 'requires_forward_secrecy': requires_forward_secrecy, + 'requires_certificate_transparency': requires_certificate_transparency, + 'allows_arbitrary_loads_in_web_content': allows_arbitrary_loads_in_web_content, + 'allows_arbitrary_loads_in_media': allows_arbitrary_loads_in_media, + 'allows_arbitrary_loads_for_media': allows_arbitrary_loads_for_media, + 'allows_local_networking': allows_local_networking + }; + }); + }, + /* Get all the allow-navigation tags */ + getAllowNavigations: function () { + var allow_navigations = this.doc.findall('./allow-navigation'); + return allow_navigations.map(function (allow_navigation) { + var minimum_tls_version = allow_navigation.attrib['minimum-tls-version']; /* String */ + var requires_forward_secrecy = allow_navigation.attrib['requires-forward-secrecy']; /* Boolean */ + var requires_certificate_transparency = allow_navigation.attrib['requires-certificate-transparency']; /* Boolean */ + + return { + 'href': allow_navigation.attrib.href, + 'minimum_tls_version': minimum_tls_version, + 'requires_forward_secrecy': requires_forward_secrecy, + 'requires_certificate_transparency': requires_certificate_transparency + }; + }); + }, + /* Get all the allow-intent tags */ + getAllowIntents: function () { + var allow_intents = this.doc.findall('./allow-intent'); + return allow_intents.map(function (allow_intent) { + return { + 'href': allow_intent.attrib.href + }; + }); + }, + /* Get all edit-config tags */ + getEditConfigs: function (platform) { + var platform_edit_configs = this.doc.findall('./platform[@name="' + platform + '"]/edit-config'); + var edit_configs = this.doc.findall('edit-config').concat(platform_edit_configs); + + return edit_configs.map(function (tag) { + var editConfig = + { + file: tag.attrib['file'], + target: tag.attrib['target'], + mode: tag.attrib['mode'], + id: 'config.xml', + xmls: tag.getchildren() + }; + return editConfig; + }); + }, + + /* Get all config-file tags */ + getConfigFiles: function (platform) { + var platform_config_files = this.doc.findall('./platform[@name="' + platform + '"]/config-file'); + var config_files = this.doc.findall('config-file').concat(platform_config_files); + + return config_files.map(function (tag) { + var configFile = + { + target: tag.attrib['target'], + parent: tag.attrib['parent'], + after: tag.attrib['after'], + xmls: tag.getchildren(), + // To support demuxing via versions + versions: tag.attrib['versions'], + deviceTarget: tag.attrib['device-target'] + }; + return configFile; + }); + }, + + write: function () { + fs.writeFileSync(this.path, this.doc.write({indent: 4}), 'utf-8'); + } +}; + +function featureToPlugin (featureElement) { + var plugin = {}; + plugin.variables = []; + var pluginVersion, + pluginSrc; + + var nodes = featureElement.findall('param'); + nodes.forEach(function (element) { + var n = element.attrib.name; + var v = element.attrib.value; + if (n === 'id') { + plugin.name = v; + } else if (n === 'version') { + pluginVersion = v; + } else if (n === 'url' || n === 'installPath') { + pluginSrc = v; + } else { + plugin.variables[n] = v; + } + }); + + var spec = pluginSrc || pluginVersion; + if (spec) { + plugin.spec = spec; + } + + return plugin; +} +module.exports = ConfigParser; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaCheck.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaCheck.js new file mode 100644 index 0000000..28f629d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaCheck.js @@ -0,0 +1,76 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var fs = require('fs'); +var path = require('path'); + +function isRootDir (dir) { + if (fs.existsSync(path.join(dir, 'www'))) { + if (fs.existsSync(path.join(dir, 'config.xml'))) { + // For sure is. + if (fs.existsSync(path.join(dir, 'platforms'))) { + return 2; + } else { + return 1; + } + } + // Might be (or may be under platforms/). + if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) { + return 1; + } + } + return 0; +} + +// Runs up the directory chain looking for a .cordova directory. +// IF it is found we are in a Cordova project. +// Omit argument to use CWD. +function isCordova (dir) { + if (!dir) { + // Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687). + var pwd = process.env.PWD; + var cwd = process.cwd(); + if (pwd && pwd !== cwd && pwd !== 'undefined') { + return isCordova(pwd) || isCordova(cwd); + } + return isCordova(cwd); + } + var bestReturnValueSoFar = false; + for (var i = 0; i < 1000; ++i) { + var result = isRootDir(dir); + if (result === 2) { + return dir; + } + if (result === 1) { + bestReturnValueSoFar = dir; + } + var parentDir = path.normalize(path.join(dir, '..')); + // Detect fs root. + if (parentDir === dir) { + return bestReturnValueSoFar; + } + dir = parentDir; + } + console.error('Hit an unhandled case in CordovaCheck.isCordova'); + return false; +} + +module.exports = { + findProjectRoot: isCordova +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaError.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaError.js new file mode 100644 index 0000000..24de6af --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaError.js @@ -0,0 +1,92 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +/* eslint no-proto: 0 */ + +var EOL = require('os').EOL; + +/** + * A derived exception class. See usage example in cli.js + * Based on: + * stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/8460753#8460753 + * @param {String} message Error message + * @param {Number} [code=0] Error code + * @param {CordovaExternalToolErrorContext} [context] External tool error context object + * @constructor + */ +function CordovaError (message, code, context) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.message = message; + this.code = code || CordovaError.UNKNOWN_ERROR; + this.context = context; +} +CordovaError.prototype.__proto__ = Error.prototype; + +// TODO: Extend error codes according the projects specifics +CordovaError.UNKNOWN_ERROR = 0; +CordovaError.EXTERNAL_TOOL_ERROR = 1; + +/** + * Translates instance's error code number into error code name, e.g. 0 -> UNKNOWN_ERROR + * @returns {string} Error code string name + */ +CordovaError.prototype.getErrorCodeName = function () { + for (var key in CordovaError) { + if (CordovaError.hasOwnProperty(key)) { + if (CordovaError[key] === this.code) { + return key; + } + } + } +}; + +/** + * Converts CordovaError instance to string representation + * @param {Boolean} [isVerbose] Set up verbose mode. Used to provide more + * details including information about error code name and context + * @return {String} Stringified error representation + */ +CordovaError.prototype.toString = function (isVerbose) { + var message = ''; + var codePrefix = ''; + + if (this.code !== CordovaError.UNKNOWN_ERROR) { + codePrefix = 'code: ' + this.code + (isVerbose ? (' (' + this.getErrorCodeName() + ')') : '') + ' '; + } + + if (this.code === CordovaError.EXTERNAL_TOOL_ERROR) { + if (typeof this.context !== 'undefined') { + if (isVerbose) { + message = codePrefix + EOL + this.context.toString(isVerbose) + '\n failed with an error: ' + + this.message + EOL + 'Stack trace: ' + this.stack; + } else { + message = codePrefix + '\'' + this.context.toString(isVerbose) + '\' ' + this.message; + } + } else { + message = 'External tool failed with an error: ' + this.message; + } + } else { + message = isVerbose ? codePrefix + this.stack : codePrefix + this.message; + } + + return message; +}; + +module.exports = CordovaError; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js new file mode 100644 index 0000000..30699b4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js @@ -0,0 +1,48 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 proto:true */ + +var path = require('path'); + +/** + * @param {String} cmd Command full path + * @param {String[]} args Command args + * @param {String} [cwd] Command working directory + * @constructor + */ +function CordovaExternalToolErrorContext (cmd, args, cwd) { + this.cmd = cmd; + // Helper field for readability + this.cmdShortName = path.basename(cmd); + this.args = args; + this.cwd = cwd; +} + +CordovaExternalToolErrorContext.prototype.toString = function (isVerbose) { + if (isVerbose) { + return 'External tool \'' + this.cmdShortName + '\'' + + '\nCommand full path: ' + this.cmd + '\nCommand args: ' + this.args + + (typeof this.cwd !== 'undefined' ? '\nCommand cwd: ' + this.cwd : ''); + } + + return this.cmdShortName; +}; + +module.exports = CordovaExternalToolErrorContext; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaLogger.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaLogger.js new file mode 100644 index 0000000..ea6e9ce --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/CordovaLogger.js @@ -0,0 +1,220 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +var ansi = require('ansi'); +var EventEmitter = require('events').EventEmitter; +var CordovaError = require('./CordovaError/CordovaError'); +var EOL = require('os').EOL; + +var INSTANCE; + +/** + * @class CordovaLogger + * + * Implements logging facility that anybody could use. Should not be + * instantiated directly, `CordovaLogger.get()` method should be used instead + * to acquire logger instance + */ +function CordovaLogger () { + this.levels = {}; + this.colors = {}; + this.stdout = process.stdout; + this.stderr = process.stderr; + + this.stdoutCursor = ansi(this.stdout); + this.stderrCursor = ansi(this.stderr); + + this.addLevel('verbose', 1000, 'grey'); + this.addLevel('normal', 2000); + this.addLevel('warn', 2000, 'yellow'); + this.addLevel('info', 3000, 'blue'); + this.addLevel('error', 5000, 'red'); + this.addLevel('results', 10000); + + this.setLevel('normal'); +} + +/** + * Static method to create new or acquire existing instance. + * + * @return {CordovaLogger} Logger instance + */ +CordovaLogger.get = function () { + return INSTANCE || (INSTANCE = new CordovaLogger()); +}; + +CordovaLogger.VERBOSE = 'verbose'; +CordovaLogger.NORMAL = 'normal'; +CordovaLogger.WARN = 'warn'; +CordovaLogger.INFO = 'info'; +CordovaLogger.ERROR = 'error'; +CordovaLogger.RESULTS = 'results'; + +/** + * Emits log message to process' stdout/stderr depending on message's severity + * and current log level. If severity is less than current logger's level, + * then the message is ignored. + * + * @param {String} logLevel The message's log level. The logger should have + * corresponding level added (via logger.addLevel), otherwise + * `CordovaLogger.NORMAL` level will be used. + * @param {String} message The message, that should be logged to process' + * stdio + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.log = function (logLevel, message) { + // if there is no such logLevel defined, or provided level has + // less severity than active level, then just ignore this call and return + if (!this.levels[logLevel] || this.levels[logLevel] < this.levels[this.logLevel]) { + // return instance to allow to chain calls + return this; + } + + var isVerbose = this.logLevel === 'verbose'; + var cursor = this.stdoutCursor; + + if (message instanceof Error || logLevel === CordovaLogger.ERROR) { + message = formatError(message, isVerbose); + cursor = this.stderrCursor; + } + + var color = this.colors[logLevel]; + if (color) { + cursor.bold().fg[color](); + } + + cursor.write(message).reset().write(EOL); + + return this; +}; + +/** + * Adds a new level to logger instance. This method also creates a shortcut + * method to log events with the level provided (i.e. after adding new level + * 'debug', the method `debug(message)`, equal to logger.log('debug', message), + * will be added to logger instance) + * + * @param {String} level A log level name. The levels with the following + * names added by default to every instance: 'verbose', 'normal', 'warn', + * 'info', 'error', 'results' + * @param {Number} severity A number that represents level's severity. + * @param {String} color A valid color name, that will be used to log + * messages with this level. Any CSS color code or RGB value is allowed + * (according to ansi documentation: + * https://github.com/TooTallNate/ansi.js#features) + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.addLevel = function (level, severity, color) { + + this.levels[level] = severity; + + if (color) { + this.colors[level] = color; + } + + // Define own method with corresponding name + if (!this[level]) { + this[level] = this.log.bind(this, level); + } + + return this; +}; + +/** + * Sets the current logger level to provided value. If logger doesn't have level + * with this name, `CordovaLogger.NORMAL` will be used. + * + * @param {String} logLevel Level name. The level with this name should be + * added to logger before. + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.setLevel = function (logLevel) { + this.logLevel = this.levels[logLevel] ? logLevel : CordovaLogger.NORMAL; + + return this; +}; + +/** + * Adjusts the current logger level according to the passed options. + * + * @param {Object|Array} opts An object or args array with options + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.adjustLevel = function (opts) { + if (opts.verbose || (Array.isArray(opts) && opts.indexOf('--verbose') !== -1)) { + this.setLevel('verbose'); + } else if (opts.silent || (Array.isArray(opts) && opts.indexOf('--silent') !== -1)) { + this.setLevel('error'); + } + + return this; +}; + +/** + * Attaches logger to EventEmitter instance provided. + * + * @param {EventEmitter} eventEmitter An EventEmitter instance to attach + * logger to. + * + * @return {CordovaLogger} Current instance, to allow calls chaining. + */ +CordovaLogger.prototype.subscribe = function (eventEmitter) { + + if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Subscribe method only accepts an EventEmitter instance as argument'); } + + eventEmitter.on('verbose', this.verbose) + .on('log', this.normal) + .on('info', this.info) + .on('warn', this.warn) + .on('warning', this.warn) + // Set up event handlers for logging and results emitted as events. + .on('results', this.results); + + return this; +}; + +function formatError (error, isVerbose) { + var message = ''; + + if (error instanceof CordovaError) { + message = error.toString(isVerbose); + } else if (error instanceof Error) { + if (isVerbose) { + message = error.stack; + } else { + message = error.message; + } + } else { + // Plain text error message + message = error; + } + + if (typeof message === 'string' && message.toUpperCase().indexOf('ERROR:') !== 0) { + // Needed for backward compatibility with external tools + message = 'Error: ' + message; + } + + return message; +} + +module.exports = CordovaLogger; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/FileUpdater.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/FileUpdater.js new file mode 100644 index 0000000..ea5d9e2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/FileUpdater.js @@ -0,0 +1,415 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 fs = require('fs'); +var path = require('path'); +var shell = require('shelljs'); +var minimatch = require('minimatch'); + +/** + * Logging callback used in the FileUpdater methods. + * @callback loggingCallback + * @param {string} message A message describing a single file update operation. + */ + +/** + * Updates a target file or directory with a source file or directory. (Directory updates are + * not recursive.) Stats for target and source items must be passed in. This is an internal + * helper function used by other methods in this module. + * + * @param {?string} sourcePath Source file or directory to be used to update the + * destination. If the source is null, then the destination is deleted if it exists. + * @param {?fs.Stats} sourceStats An instance of fs.Stats for the source path, or null if + * the source does not exist. + * @param {string} targetPath Required destination file or directory to be updated. If it does + * not exist, it will be created. + * @param {?fs.Stats} targetStats An instance of fs.Stats for the target path, or null if + * the target does not exist. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function updatePathWithStats (sourcePath, sourceStats, targetPath, targetStats, options, log) { + var updated = false; + + var rootDir = (options && options.rootDir) || ''; + var copyAll = (options && options.all) || false; + + var targetFullPath = path.join(rootDir || '', targetPath); + + if (sourceStats) { + var sourceFullPath = path.join(rootDir || '', sourcePath); + + if (targetStats) { + // The target exists. But if the directory status doesn't match the source, delete it. + if (targetStats.isDirectory() && !sourceStats.isDirectory()) { + log('rmdir ' + targetPath + ' (source is a file)'); + shell.rm('-rf', targetFullPath); + targetStats = null; + updated = true; + } else if (!targetStats.isDirectory() && sourceStats.isDirectory()) { + log('delete ' + targetPath + ' (source is a directory)'); + shell.rm('-f', targetFullPath); + targetStats = null; + updated = true; + } + } + + if (!targetStats) { + if (sourceStats.isDirectory()) { + // The target directory does not exist, so it should be created. + log('mkdir ' + targetPath); + shell.mkdir('-p', targetFullPath); + updated = true; + } else if (sourceStats.isFile()) { + // The target file does not exist, so it should be copied from the source. + log('copy ' + sourcePath + ' ' + targetPath + (copyAll ? '' : ' (new file)')); + shell.cp('-f', sourceFullPath, targetFullPath); + updated = true; + } + } else if (sourceStats.isFile() && targetStats.isFile()) { + // The source and target paths both exist and are files. + if (copyAll) { + // The caller specified all files should be copied. + log('copy ' + sourcePath + ' ' + targetPath); + shell.cp('-f', sourceFullPath, targetFullPath); + updated = true; + } else { + // Copy if the source has been modified since it was copied to the target, or if + // the file sizes are different. (The latter catches most cases in which something + // was done to the file after copying.) Comparison is >= rather than > to allow + // for timestamps lacking sub-second precision in some filesystems. + if (sourceStats.mtime.getTime() >= targetStats.mtime.getTime() || + sourceStats.size !== targetStats.size) { + log('copy ' + sourcePath + ' ' + targetPath + ' (updated file)'); + shell.cp('-f', sourceFullPath, targetFullPath); + updated = true; + } + } + } + } else if (targetStats) { + // The target exists but the source is null, so the target should be deleted. + if (targetStats.isDirectory()) { + log('rmdir ' + targetPath + (copyAll ? '' : ' (no source)')); + shell.rm('-rf', targetFullPath); + } else { + log('delete ' + targetPath + (copyAll ? '' : ' (no source)')); + shell.rm('-f', targetFullPath); + } + updated = true; + } + + return updated; +} + +/** + * Helper for updatePath and updatePaths functions. Queries stats for source and target + * and ensures target directory exists before copying a file. + */ +function updatePathInternal (sourcePath, targetPath, options, log) { + var rootDir = (options && options.rootDir) || ''; + var targetFullPath = path.join(rootDir, targetPath); + var targetStats = fs.existsSync(targetFullPath) ? fs.statSync(targetFullPath) : null; + var sourceStats = null; + + if (sourcePath) { + // A non-null source path was specified. It should exist. + var sourceFullPath = path.join(rootDir, sourcePath); + if (!fs.existsSync(sourceFullPath)) { + throw new Error('Source path does not exist: ' + sourcePath); + } + + sourceStats = fs.statSync(sourceFullPath); + + // Create the target's parent directory if it doesn't exist. + var parentDir = path.dirname(targetFullPath); + if (!fs.existsSync(parentDir)) { + shell.mkdir('-p', parentDir); + } + } + + return updatePathWithStats(sourcePath, sourceStats, targetPath, targetStats, options, log); +} + +/** + * Updates a target file or directory with a source file or directory. (Directory updates are + * not recursive.) + * + * @param {?string} sourcePath Source file or directory to be used to update the + * destination. If the source is null, then the destination is deleted if it exists. + * @param {string} targetPath Required destination file or directory to be updated. If it does + * not exist, it will be created. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function updatePath (sourcePath, targetPath, options, log) { + if (sourcePath !== null && typeof sourcePath !== 'string') { + throw new Error('A source path (or null) is required.'); + } + + if (!targetPath || typeof targetPath !== 'string') { + throw new Error('A target path is required.'); + } + + log = log || function () { }; + + return updatePathInternal(sourcePath, targetPath, options, log); +} + +/** + * Updates files and directories based on a mapping from target paths to source paths. Targets + * with null sources in the map are deleted. + * + * @param {Object} pathMap A dictionary mapping from target paths to source paths. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function updatePaths (pathMap, options, log) { + if (!pathMap || typeof pathMap !== 'object' || Array.isArray(pathMap)) { + throw new Error('An object mapping from target paths to source paths is required.'); + } + + log = log || function () { }; + + var updated = false; + + // Iterate in sorted order to ensure directories are created before files under them. + Object.keys(pathMap).sort().forEach(function (targetPath) { + var sourcePath = pathMap[targetPath]; + updated = updatePathInternal(sourcePath, targetPath, options, log) || updated; + }); + + return updated; +} + +/** + * Updates a target directory with merged files and subdirectories from source directories. + * + * @param {string|string[]} sourceDirs Required source directory or array of source directories + * to be merged into the target. The directories are listed in order of precedence; files in + * directories later in the array supersede files in directories earlier in the array + * (regardless of timestamps). + * @param {string} targetDir Required destination directory to be updated. If it does not exist, + * it will be created. If it exists, newer files from source directories will be copied over, + * and files missing in the source directories will be deleted. + * @param {Object} [options] Optional additional parameters for the update. + * @param {string} [options.rootDir] Optional root directory (such as a project) to which target + * and source path parameters are relative; may be omitted if the paths are absolute. The + * rootDir is always omitted from any logged paths, to make the logs easier to read. + * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times. + * Otherwise, a file is copied if the source's last-modified time is greather than or + * equal to the target's last-modified time, or if the file sizes are different. + * @param {string|string[]} [options.include] Optional glob string or array of glob strings that + * are tested against both target and source relative paths to determine if they are included + * in the merge-and-update. If unspecified, all items are included. + * @param {string|string[]} [options.exclude] Optional glob string or array of glob strings that + * are tested against both target and source relative paths to determine if they are excluded + * from the merge-and-update. Exclusions override inclusions. If unspecified, no items are + * excluded. + * @param {loggingCallback} [log] Optional logging callback that takes a string message + * describing any file operations that are performed. + * @return {boolean} true if any changes were made, or false if the force flag is not set + * and everything was up to date + */ +function mergeAndUpdateDir (sourceDirs, targetDir, options, log) { + if (sourceDirs && typeof sourceDirs === 'string') { + sourceDirs = [ sourceDirs ]; + } else if (!Array.isArray(sourceDirs)) { + throw new Error('A source directory path or array of paths is required.'); + } + + if (!targetDir || typeof targetDir !== 'string') { + throw new Error('A target directory path is required.'); + } + + log = log || function () { }; + + var rootDir = (options && options.rootDir) || ''; + + var include = (options && options.include) || [ '**' ]; + if (typeof include === 'string') { + include = [ include ]; + } else if (!Array.isArray(include)) { + throw new Error('Include parameter must be a glob string or array of glob strings.'); + } + + var exclude = (options && options.exclude) || []; + if (typeof exclude === 'string') { + exclude = [ exclude ]; + } else if (!Array.isArray(exclude)) { + throw new Error('Exclude parameter must be a glob string or array of glob strings.'); + } + + // Scan the files in each of the source directories. + var sourceMaps = sourceDirs.map(function (sourceDir) { + return path.join(rootDir, sourceDir); + }).map(function (sourcePath) { + if (!fs.existsSync(sourcePath)) { + throw new Error('Source directory does not exist: ' + sourcePath); + } + return mapDirectory(rootDir, path.relative(rootDir, sourcePath), include, exclude); + }); + + // Scan the files in the target directory, if it exists. + var targetMap = {}; + var targetFullPath = path.join(rootDir, targetDir); + if (fs.existsSync(targetFullPath)) { + targetMap = mapDirectory(rootDir, targetDir, include, exclude); + } + + var pathMap = mergePathMaps(sourceMaps, targetMap, targetDir); + + var updated = false; + + // Iterate in sorted order to ensure directories are created before files under them. + Object.keys(pathMap).sort().forEach(function (subPath) { + var entry = pathMap[subPath]; + updated = updatePathWithStats( + entry.sourcePath, + entry.sourceStats, + entry.targetPath, + entry.targetStats, + options, + log) || updated; + }); + + return updated; +} + +/** + * Creates a dictionary map of all files and directories under a path. + */ +function mapDirectory (rootDir, subDir, include, exclude) { + var dirMap = { '': { subDir: subDir, stats: fs.statSync(path.join(rootDir, subDir)) } }; + mapSubdirectory(rootDir, subDir, '', include, exclude, dirMap); + return dirMap; + + function mapSubdirectory (rootDir, subDir, relativeDir, include, exclude, dirMap) { + var itemMapped = false; + var items = fs.readdirSync(path.join(rootDir, subDir, relativeDir)); + + items.forEach(function (item) { + var relativePath = path.join(relativeDir, item); + if (!matchGlobArray(relativePath, exclude)) { + // Stats obtained here (required at least to know where to recurse in directories) + // are saved for later, where the modified times may also be used. This minimizes + // the number of file I/O operations performed. + var fullPath = path.join(rootDir, subDir, relativePath); + var stats = fs.statSync(fullPath); + + if (stats.isDirectory()) { + // Directories are included if either something under them is included or they + // match an include glob. + if (mapSubdirectory(rootDir, subDir, relativePath, include, exclude, dirMap) || + matchGlobArray(relativePath, include)) { + dirMap[relativePath] = { subDir: subDir, stats: stats }; + itemMapped = true; + } + } else if (stats.isFile()) { + // Files are included only if they match an include glob. + if (matchGlobArray(relativePath, include)) { + dirMap[relativePath] = { subDir: subDir, stats: stats }; + itemMapped = true; + } + } + } + }); + return itemMapped; + } + + function matchGlobArray (path, globs) { + return globs.some(function (elem) { + return minimatch(path, elem, {dot: true}); + }); + } +} + +/** + * Merges together multiple source maps and a target map into a single mapping from + * relative paths to objects with target and source paths and stats. + */ +function mergePathMaps (sourceMaps, targetMap, targetDir) { + // Merge multiple source maps together, along with target path info. + // Entries in later source maps override those in earlier source maps. + // Target stats will be filled in below for targets that exist. + var pathMap = {}; + sourceMaps.forEach(function (sourceMap) { + Object.keys(sourceMap).forEach(function (sourceSubPath) { + var sourceEntry = sourceMap[sourceSubPath]; + pathMap[sourceSubPath] = { + targetPath: path.join(targetDir, sourceSubPath), + targetStats: null, + sourcePath: path.join(sourceEntry.subDir, sourceSubPath), + sourceStats: sourceEntry.stats + }; + }); + }); + + // Fill in target stats for targets that exist, and create entries + // for targets that don't have any corresponding sources. + Object.keys(targetMap).forEach(function (subPath) { + var entry = pathMap[subPath]; + if (entry) { + entry.targetStats = targetMap[subPath].stats; + } else { + pathMap[subPath] = { + targetPath: path.join(targetDir, subPath), + targetStats: targetMap[subPath].stats, + sourcePath: null, + sourceStats: null + }; + } + }); + + return pathMap; +} + +module.exports = { + updatePath: updatePath, + updatePaths: updatePaths, + mergeAndUpdateDir: mergeAndUpdateDir +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PlatformJson.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PlatformJson.js new file mode 100644 index 0000000..7eaf1a2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PlatformJson.js @@ -0,0 +1,277 @@ +/* + * 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. + * +*/ + +var fs = require('fs'); +var path = require('path'); +var shelljs = require('shelljs'); +var mungeutil = require('./ConfigChanges/munge-util'); +var pluginMappernto = require('cordova-registry-mapper').newToOld; +var pluginMapperotn = require('cordova-registry-mapper').oldToNew; + +function PlatformJson (filePath, platform, root) { + this.filePath = filePath; + this.platform = platform; + this.root = fix_munge(root || {}); +} + +PlatformJson.load = function (plugins_dir, platform) { + var filePath = path.join(plugins_dir, platform + '.json'); + var root = null; + if (fs.existsSync(filePath)) { + root = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + } + return new PlatformJson(filePath, platform, root); +}; + +PlatformJson.prototype.save = function () { + shelljs.mkdir('-p', path.dirname(this.filePath)); + fs.writeFileSync(this.filePath, JSON.stringify(this.root, null, 2), 'utf-8'); +}; + +/** + * Indicates whether the specified plugin is installed as a top-level (not as + * dependency to others) + * @method function + * @param {String} pluginId A plugin id to check for. + * @return {Boolean} true if plugin installed as top-level, otherwise false. + */ +PlatformJson.prototype.isPluginTopLevel = function (pluginId) { + var installedPlugins = this.root.installed_plugins; + return installedPlugins[pluginId] || + installedPlugins[pluginMappernto[pluginId]] || + installedPlugins[pluginMapperotn[pluginId]]; +}; + +/** + * Indicates whether the specified plugin is installed as a dependency to other + * plugin. + * @method function + * @param {String} pluginId A plugin id to check for. + * @return {Boolean} true if plugin installed as a dependency, otherwise false. + */ +PlatformJson.prototype.isPluginDependent = function (pluginId) { + var dependentPlugins = this.root.dependent_plugins; + return dependentPlugins[pluginId] || + dependentPlugins[pluginMappernto[pluginId]] || + dependentPlugins[pluginMapperotn[pluginId]]; +}; + +/** + * Indicates whether plugin is installed either as top-level or as dependency. + * @method function + * @param {String} pluginId A plugin id to check for. + * @return {Boolean} true if plugin installed, otherwise false. + */ +PlatformJson.prototype.isPluginInstalled = function (pluginId) { + return this.isPluginTopLevel(pluginId) || + this.isPluginDependent(pluginId); +}; + +PlatformJson.prototype.addPlugin = function (pluginId, variables, isTopLevel) { + var pluginsList = isTopLevel ? + this.root.installed_plugins : + this.root.dependent_plugins; + + pluginsList[pluginId] = variables; + + return this; +}; + +/** + * @chaining + * Generates and adds metadata for provided plugin into associated .json file + * + * @param {PluginInfo} pluginInfo A pluginInfo instance to add metadata from + * @returns {this} Current PlatformJson instance to allow calls chaining + */ +PlatformJson.prototype.addPluginMetadata = function (pluginInfo) { + + var installedModules = this.root.modules || []; + + var installedPaths = installedModules.map(function (installedModule) { + return installedModule.file; + }); + + var modulesToInstall = pluginInfo.getJsModules(this.platform) + .map(function (module) { + return new ModuleMetadata(pluginInfo.id, module); + }) + .filter(function (metadata) { + // Filter out modules which are already added to metadata + return installedPaths.indexOf(metadata.file) === -1; + }); + + this.root.modules = installedModules.concat(modulesToInstall); + + this.root.plugin_metadata = this.root.plugin_metadata || {}; + this.root.plugin_metadata[pluginInfo.id] = pluginInfo.version; + + return this; +}; + +PlatformJson.prototype.removePlugin = function (pluginId, isTopLevel) { + var pluginsList = isTopLevel ? + this.root.installed_plugins : + this.root.dependent_plugins; + + delete pluginsList[pluginId]; + + return this; +}; + +/** + * @chaining + * Removes metadata for provided plugin from associated file + * + * @param {PluginInfo} pluginInfo A PluginInfo instance to which modules' metadata + * we need to remove + * + * @returns {this} Current PlatformJson instance to allow calls chaining + */ +PlatformJson.prototype.removePluginMetadata = function (pluginInfo) { + var modulesToRemove = pluginInfo.getJsModules(this.platform) + .map(function (jsModule) { + return ['plugins', pluginInfo.id, jsModule.src].join('/'); + }); + + var installedModules = this.root.modules || []; + this.root.modules = installedModules + .filter(function (installedModule) { + // Leave only those metadatas which 'file' is not in removed modules + return (modulesToRemove.indexOf(installedModule.file) === -1); + }); + + if (this.root.plugin_metadata) { + delete this.root.plugin_metadata[pluginInfo.id]; + } + + return this; +}; + +PlatformJson.prototype.addInstalledPluginToPrepareQueue = function (pluginDirName, vars, is_top_level, force) { + this.root.prepare_queue.installed.push({'plugin': pluginDirName, 'vars': vars, 'topLevel': is_top_level, 'force': force}); +}; + +PlatformJson.prototype.addUninstalledPluginToPrepareQueue = function (pluginId, is_top_level) { + this.root.prepare_queue.uninstalled.push({'plugin': pluginId, 'id': pluginId, 'topLevel': is_top_level}); +}; + +/** + * Moves plugin, specified by id to top-level plugins. If plugin is top-level + * already, then does nothing. + * @method function + * @param {String} pluginId A plugin id to make top-level. + * @return {PlatformJson} PlatformJson instance. + */ +PlatformJson.prototype.makeTopLevel = function (pluginId) { + var plugin = this.root.dependent_plugins[pluginId]; + if (plugin) { + delete this.root.dependent_plugins[pluginId]; + this.root.installed_plugins[pluginId] = plugin; + } + return this; +}; + +/** + * Generates a metadata for all installed plugins and js modules. The resultant + * string is ready to be written to 'cordova_plugins.js' + * + * @returns {String} cordova_plugins.js contents + */ +PlatformJson.prototype.generateMetadata = function () { + return [ + 'cordova.define(\'cordova/plugin_list\', function(require, exports, module) {', + 'module.exports = ' + JSON.stringify(this.root.modules, null, 2) + ';', + 'module.exports.metadata = ', + '// TOP OF METADATA', + JSON.stringify(this.root.plugin_metadata, null, 2) + ';', + '// BOTTOM OF METADATA', + '});' // Close cordova.define. + ].join('\n'); +}; + +/** + * @chaining + * Generates and then saves metadata to specified file. Doesn't check if file exists. + * + * @param {String} destination File metadata will be written to + * @return {PlatformJson} PlatformJson instance + */ +PlatformJson.prototype.generateAndSaveMetadata = function (destination) { + var meta = this.generateMetadata(); + shelljs.mkdir('-p', path.dirname(destination)); + fs.writeFileSync(destination, meta, 'utf-8'); + + return this; +}; + +// convert a munge from the old format ([file][parent][xml] = count) to the current one +function fix_munge (root) { + root.prepare_queue = root.prepare_queue || {installed: [], uninstalled: []}; + root.config_munge = root.config_munge || {files: {}}; + root.installed_plugins = root.installed_plugins || {}; + root.dependent_plugins = root.dependent_plugins || {}; + + var munge = root.config_munge; + if (!munge.files) { + var new_munge = { files: {} }; + for (var file in munge) { + for (var selector in munge[file]) { + for (var xml_child in munge[file][selector]) { + var val = parseInt(munge[file][selector][xml_child]); + for (var i = 0; i < val; i++) { + mungeutil.deep_add(new_munge, [file, selector, { xml: xml_child, count: val }]); + } + } + } + } + root.config_munge = new_munge; + } + + return root; +} + +/** + * @constructor + * @class ModuleMetadata + * + * Creates a ModuleMetadata object that represents module entry in 'cordova_plugins.js' + * file at run time + * + * @param {String} pluginId Plugin id where this module installed from + * @param (JsModule|Object) jsModule A js-module entry from PluginInfo class to generate metadata for + */ +function ModuleMetadata (pluginId, jsModule) { + + if (!pluginId) throw new TypeError('pluginId argument must be a valid plugin id'); + if (!jsModule.src && !jsModule.name) throw new TypeError('jsModule argument must contain src or/and name properties'); + + this.id = pluginId + '.' + (jsModule.name || jsModule.src.match(/([^\/]+)\.js/)[1]); /* eslint no-useless-escape: 0 */ + this.file = ['plugins', pluginId, jsModule.src].join('/'); + this.pluginId = pluginId; + + if (jsModule.clobbers && jsModule.clobbers.length > 0) { + this.clobbers = jsModule.clobbers.map(function (o) { return o.target; }); + } + if (jsModule.merges && jsModule.merges.length > 0) { + this.merges = jsModule.merges.map(function (o) { return o.target; }); + } + if (jsModule.runs) { + this.runs = true; + } +} + +module.exports = PlatformJson; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfo.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfo.js new file mode 100644 index 0000000..7e9754d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfo.js @@ -0,0 +1,439 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 class for holidng the information currently stored in plugin.xml +It should also be able to answer questions like whether the plugin +is compatible with a given engine version. + +TODO (kamrik): refactor this to not use sync functions and return promises. +*/ + +var path = require('path'); +var fs = require('fs'); +var xml_helpers = require('../util/xml-helpers'); +var CordovaError = require('../CordovaError/CordovaError'); + +function PluginInfo (dirname) { + var self = this; + + // METHODS + // Defined inside the constructor to avoid the "this" binding problems. + + // tag + // Example: + // Used to require a variable to be specified via --variable when installing the plugin. + // returns { key : default | null} + self.getPreferences = getPreferences; + function getPreferences (platform) { + return _getTags(self._et, 'preference', platform, _parsePreference) + .reduce(function (preferences, pref) { + preferences[pref.preference] = pref.default; + return preferences; + }, {}); + } + + function _parsePreference (prefTag) { + var name = prefTag.attrib.name.toUpperCase(); + var def = prefTag.attrib.default || null; + return {preference: name, default: def}; + } + + // + self.getAssets = getAssets; + function getAssets (platform) { + var assets = _getTags(self._et, 'asset', platform, _parseAsset); + return assets; + } + + function _parseAsset (tag) { + var src = tag.attrib.src; + var target = tag.attrib.target; + + if (!src || !target) { + var msg = + 'Malformed tag. Both "src" and "target" attributes' + + 'must be specified in\n' + + self.filepath + ; + throw new Error(msg); + } + + var asset = { + itemType: 'asset', + src: src, + target: target + }; + return asset; + } + + // + // Example: + // + self.getDependencies = getDependencies; + function getDependencies (platform) { + var deps = _getTags( + self._et, + 'dependency', + platform, + _parseDependency + ); + return deps; + } + + function _parseDependency (tag) { + var dep = + { id: tag.attrib.id, + version: tag.attrib.version || '', + url: tag.attrib.url || '', + subdir: tag.attrib.subdir || '', + commit: tag.attrib.commit + }; + + dep.git_ref = dep.commit; + + if (!dep.id) { + var msg = + ' tag is missing id attribute in ' + + self.filepath + ; + throw new CordovaError(msg); + } + return dep; + } + + // tag + self.getConfigFiles = getConfigFiles; + function getConfigFiles (platform) { + var configFiles = _getTags(self._et, 'config-file', platform, _parseConfigFile); + return configFiles; + } + + function _parseConfigFile (tag) { + var configFile = + { target: tag.attrib['target'], + parent: tag.attrib['parent'], + after: tag.attrib['after'], + xmls: tag.getchildren(), + // To support demuxing via versions + versions: tag.attrib['versions'], + deviceTarget: tag.attrib['device-target'] + }; + return configFile; + } + + self.getEditConfigs = getEditConfigs; + function getEditConfigs (platform) { + var editConfigs = _getTags(self._et, 'edit-config', platform, _parseEditConfigs); + return editConfigs; + } + + function _parseEditConfigs (tag) { + var editConfig = + { file: tag.attrib['file'], + target: tag.attrib['target'], + mode: tag.attrib['mode'], + xmls: tag.getchildren() + }; + return editConfig; + } + + // tags, both global and within a + // TODO (kamrik): Do we ever use under ? Example wanted. + self.getInfo = getInfo; + function getInfo (platform) { + var infos = _getTags( + self._et, + 'info', + platform, + function (elem) { return elem.text; } + ); + // Filter out any undefined or empty strings. + infos = infos.filter(Boolean); + return infos; + } + + // + // Examples: + // + // + self.getSourceFiles = getSourceFiles; + function getSourceFiles (platform) { + var sourceFiles = _getTagsInPlatform(self._et, 'source-file', platform, _parseSourceFile); + return sourceFiles; + } + + function _parseSourceFile (tag) { + return { + itemType: 'source-file', + src: tag.attrib.src, + framework: isStrTrue(tag.attrib.framework), + weak: isStrTrue(tag.attrib.weak), + compilerFlags: tag.attrib['compiler-flags'], + targetDir: tag.attrib['target-dir'] + }; + } + + // + // Example: + // + self.getHeaderFiles = getHeaderFiles; + function getHeaderFiles (platform) { + var headerFiles = _getTagsInPlatform(self._et, 'header-file', platform, function (tag) { + return { + itemType: 'header-file', + src: tag.attrib.src, + targetDir: tag.attrib['target-dir'] + }; + }); + return headerFiles; + } + + // + // Example: + // + self.getResourceFiles = getResourceFiles; + function getResourceFiles (platform) { + var resourceFiles = _getTagsInPlatform(self._et, 'resource-file', platform, function (tag) { + return { + itemType: 'resource-file', + src: tag.attrib.src, + target: tag.attrib.target, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'], + arch: tag.attrib.arch, + reference: tag.attrib.reference + }; + }); + return resourceFiles; + } + + // + // Example: + // + self.getLibFiles = getLibFiles; + function getLibFiles (platform) { + var libFiles = _getTagsInPlatform(self._et, 'lib-file', platform, function (tag) { + return { + itemType: 'lib-file', + src: tag.attrib.src, + arch: tag.attrib.arch, + Include: tag.attrib.Include, + versions: tag.attrib.versions, + deviceTarget: tag.attrib['device-target'] || tag.attrib.target + }; + }); + return libFiles; + } + + // + // Example: + // + self.getHookScripts = getHookScripts; + function getHookScripts (hook, platforms) { + var scriptElements = self._et.findall('./hook'); + + if (platforms) { + platforms.forEach(function (platform) { + scriptElements = scriptElements.concat(self._et.findall('./platform[@name="' + platform + '"]/hook')); + }); + } + + function filterScriptByHookType (el) { + return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook; + } + + return scriptElements.filter(filterScriptByHookType); + } + + self.getJsModules = getJsModules; + function getJsModules (platform) { + var modules = _getTags(self._et, 'js-module', platform, _parseJsModule); + return modules; + } + + function _parseJsModule (tag) { + var ret = { + itemType: 'js-module', + name: tag.attrib.name, + src: tag.attrib.src, + clobbers: tag.findall('clobbers').map(function (tag) { return { target: tag.attrib.target }; }), + merges: tag.findall('merges').map(function (tag) { return { target: tag.attrib.target }; }), + runs: tag.findall('runs').length > 0 + }; + + return ret; + } + + self.getEngines = function () { + return self._et.findall('engines/engine').map(function (n) { + return { + name: n.attrib.name, + version: n.attrib.version, + platform: n.attrib.platform, + scriptSrc: n.attrib.scriptSrc + }; + }); + }; + + self.getPlatforms = function () { + return self._et.findall('platform').map(function (n) { + return { name: n.attrib.name }; + }); + }; + + self.getPlatformsArray = function () { + return self._et.findall('platform').map(function (n) { + return n.attrib.name; + }); + }; + + self.getFrameworks = function (platform, options) { + return _getTags(self._et, 'framework', platform, function (el) { + var src = el.attrib.src; + if (options) { + var vars = options.cli_variables || {}; + + if (Object.keys(vars).length === 0) { + // get variable defaults from plugin.xml for removal + vars = self.getPreferences(platform); + } + var regExp; + // Iterate over plugin variables. + // Replace them in framework src if they exist + Object.keys(vars).forEach(function (name) { + if (vars[name]) { + regExp = new RegExp('\\$' + name, 'g'); + src = src.replace(regExp, vars[name]); + } + }); + } + var ret = { + itemType: 'framework', + type: el.attrib.type, + parent: el.attrib.parent, + custom: isStrTrue(el.attrib.custom), + embed: isStrTrue(el.attrib.embed), + src: src, + spec: el.attrib.spec, + weak: isStrTrue(el.attrib.weak), + versions: el.attrib.versions, + targetDir: el.attrib['target-dir'], + deviceTarget: el.attrib['device-target'] || el.attrib.target, + arch: el.attrib.arch, + implementation: el.attrib.implementation + }; + return ret; + }); + }; + + self.getFilesAndFrameworks = getFilesAndFrameworks; + function getFilesAndFrameworks (platform, options) { + // Please avoid changing the order of the calls below, files will be + // installed in this order. + var items = [].concat( + self.getSourceFiles(platform), + self.getHeaderFiles(platform), + self.getResourceFiles(platform), + self.getFrameworks(platform, options), + self.getLibFiles(platform) + ); + return items; + } + /// // End of PluginInfo methods ///// + + /// // PluginInfo Constructor logic ///// + self.filepath = path.join(dirname, 'plugin.xml'); + if (!fs.existsSync(self.filepath)) { + throw new CordovaError('Cannot find plugin.xml for plugin "' + path.basename(dirname) + '". Please try adding it again.'); + } + + self.dir = dirname; + var et = self._et = xml_helpers.parseElementtreeSync(self.filepath); + var pelem = et.getroot(); + self.id = pelem.attrib.id; + self.version = pelem.attrib.version; + + // Optional fields + self.name = pelem.findtext('name'); + self.description = pelem.findtext('description'); + self.license = pelem.findtext('license'); + self.repo = pelem.findtext('repo'); + self.issue = pelem.findtext('issue'); + self.keywords = pelem.findtext('keywords'); + self.info = pelem.findtext('info'); + if (self.keywords) { + self.keywords = self.keywords.split(',').map(function (s) { return s.trim(); }); + } + self.getKeywordsAndPlatforms = function () { + var ret = self.keywords || []; + return ret.concat('ecosystem:cordova').concat(addCordova(self.getPlatformsArray())); + }; +} // End of PluginInfo constructor. + +// Helper function used to prefix every element of an array with cordova- +// Useful when we want to modify platforms to be cordova-platform +function addCordova (someArray) { + var newArray = someArray.map(function (element) { + return 'cordova-' + element; + }); + return newArray; +} + +// Helper function used by most of the getSomething methods of PluginInfo. +// Get all elements of a given name. Both in root and in platform sections +// for the given platform. If transform is given and is a function, it is +// applied to each element. +function _getTags (pelem, tag, platform, transform) { + var platformTag = pelem.find('./platform[@name="' + platform + '"]'); + var tagsInRoot = pelem.findall(tag); + tagsInRoot = tagsInRoot || []; + var tagsInPlatform = platformTag ? platformTag.findall(tag) : []; + var tags = tagsInRoot.concat(tagsInPlatform); + if (typeof transform === 'function') { + tags = tags.map(transform); + } + return tags; +} + +// Same as _getTags() but only looks inside a platform section. +function _getTagsInPlatform (pelem, tag, platform, transform) { + var platformTag = pelem.find('./platform[@name="' + platform + '"]'); + var tags = platformTag ? platformTag.findall(tag) : []; + if (typeof transform === 'function') { + tags = tags.map(transform); + } + return tags; +} + +// Check if x is a string 'true'. +function isStrTrue (x) { + return String(x).toLowerCase() === 'true'; +} + +module.exports = PluginInfo; +// Backwards compat: +PluginInfo.PluginInfo = PluginInfo; +PluginInfo.loadPluginsDir = function (dir) { + var PluginInfoProvider = require('./PluginInfoProvider'); + return new PluginInfoProvider().getAllWithinSearchPath(dir); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js new file mode 100644 index 0000000..5d3f329 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js @@ -0,0 +1,82 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 sub:true, laxcomma:true, laxbreak:true */ + +var fs = require('fs'); +var path = require('path'); +var PluginInfo = require('./PluginInfo'); +var events = require('../events'); + +function PluginInfoProvider () { + this._cache = {}; + this._getAllCache = {}; +} + +PluginInfoProvider.prototype.get = function (dirName) { + var absPath = path.resolve(dirName); + if (!this._cache[absPath]) { + this._cache[absPath] = new PluginInfo(dirName); + } + return this._cache[absPath]; +}; + +// Normally you don't need to put() entries, but it's used +// when copying plugins, and in unit tests. +PluginInfoProvider.prototype.put = function (pluginInfo) { + var absPath = path.resolve(pluginInfo.dir); + this._cache[absPath] = pluginInfo; +}; + +// Used for plugin search path processing. +// Given a dir containing multiple plugins, create a PluginInfo object for +// each of them and return as array. +// Should load them all in parallel and return a promise, but not yet. +PluginInfoProvider.prototype.getAllWithinSearchPath = function (dirName) { + var absPath = path.resolve(dirName); + if (!this._getAllCache[absPath]) { + this._getAllCache[absPath] = getAllHelper(absPath, this); + } + return this._getAllCache[absPath]; +}; + +function getAllHelper (absPath, provider) { + if (!fs.existsSync(absPath)) { + return []; + } + // If dir itself is a plugin, return it in an array with one element. + if (fs.existsSync(path.join(absPath, 'plugin.xml'))) { + return [provider.get(absPath)]; + } + var subdirs = fs.readdirSync(absPath); + var plugins = []; + subdirs.forEach(function (subdir) { + var d = path.join(absPath, subdir); + if (fs.existsSync(path.join(d, 'plugin.xml'))) { + try { + plugins.push(provider.get(d)); + } catch (e) { + events.emit('warn', 'Error parsing ' + path.join(d, 'plugin.xml.\n' + e.stack)); + } + } + }); + return plugins; +} + +module.exports = PluginInfoProvider; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js new file mode 100644 index 0000000..0097db4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js @@ -0,0 +1,149 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); + +var ActionStack = require('./ActionStack'); +var PlatformJson = require('./PlatformJson'); +var CordovaError = require('./CordovaError/CordovaError'); +var PlatformMunger = require('./ConfigChanges/ConfigChanges').PlatformMunger; +var PluginInfoProvider = require('./PluginInfo/PluginInfoProvider'); + +/** + * @constructor + * @class PluginManager + * Represents an entity for adding/removing plugins for platforms + * + * @param {String} platform Platform name + * @param {Object} locations - Platform files and directories + * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from + */ +function PluginManager (platform, locations, ideProject) { + this.platform = platform; + this.locations = locations; + this.project = ideProject; + + var platformJson = PlatformJson.load(locations.root, platform); + this.munger = new PlatformMunger(platform, locations.root, platformJson, new PluginInfoProvider()); +} + +/** + * @constructs PluginManager + * A convenience shortcut to new PluginManager(...) + * + * @param {String} platform Platform name + * @param {Object} locations - Platform files and directories + * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from + * @returns new PluginManager instance + */ +PluginManager.get = function (platform, locations, ideProject) { + return new PluginManager(platform, locations, ideProject); +}; + +PluginManager.INSTALL = 'install'; +PluginManager.UNINSTALL = 'uninstall'; + +module.exports = PluginManager; + +/** + * Describes and implements common plugin installation/uninstallation routine. The flow is the following: + * * Validate and set defaults for options. Note that options are empty by default. Everything + * needed for platform IDE project must be passed from outside. Plugin variables (which + * are the part of the options) also must be already populated with 'PACKAGE_NAME' variable. + * * Collect all plugin's native and web files, get installers/uninstallers and process + * all these via ActionStack. + * * Save the IDE project, so the changes made by installers are persisted. + * * Generate config changes munge for plugin and apply it to all required files + * * Generate metadata for plugin and plugin modules and save it to 'cordova_plugins.js' + * + * @param {PluginInfo} plugin A PluginInfo structure representing plugin to install + * @param {Object} [options={}] An installation options. It is expected but is not necessary + * that options would contain 'variables' inner object with 'PACKAGE_NAME' field set by caller. + * + * @returns {Promise} Returns a Q promise, either resolved in case of success, rejected otherwise. + */ +PluginManager.prototype.doOperation = function (operation, plugin, options) { + if (operation !== PluginManager.INSTALL && operation !== PluginManager.UNINSTALL) { return Q.reject(new CordovaError('The parameter is incorrect. The opeation must be either "add" or "remove"')); } + + if (!plugin || plugin.constructor.name !== 'PluginInfo') { return Q.reject(new CordovaError('The parameter is incorrect. The first parameter should be a PluginInfo instance')); } + + // Set default to empty object to play safe when accesing properties + options = options || {}; + + var self = this; + var actions = new ActionStack(); + + // gather all files need to be handled during operation ... + plugin.getFilesAndFrameworks(this.platform, options) + .concat(plugin.getAssets(this.platform)) + .concat(plugin.getJsModules(this.platform)) + // ... put them into stack ... + .forEach(function (item) { + var installer = self.project.getInstaller(item.itemType); + var uninstaller = self.project.getUninstaller(item.itemType); + var actionArgs = [item, plugin, self.project, options]; + + var action; + if (operation === PluginManager.INSTALL) { + action = actions.createAction.apply(actions, [installer, actionArgs, uninstaller, actionArgs]); /* eslint no-useless-call: 0 */ + } else /* op === PluginManager.UNINSTALL */{ + action = actions.createAction.apply(actions, [uninstaller, actionArgs, installer, actionArgs]); /* eslint no-useless-call: 0 */ + } + actions.push(action); + }); + + // ... and run through the action stack + return actions.process(this.platform) + .then(function () { + if (self.project.write) { + self.project.write(); + } + + if (operation === PluginManager.INSTALL) { + // Ignore passed `is_top_level` option since platform itself doesn't know + // anything about managing dependencies - it's responsibility of caller. + self.munger.add_plugin_changes(plugin, options.variables, /* is_top_level= */true, /* should_increment= */true, options.force); + self.munger.platformJson.addPluginMetadata(plugin); + } else { + self.munger.remove_plugin_changes(plugin, /* is_top_level= */true); + self.munger.platformJson.removePluginMetadata(plugin); + } + + // Save everything (munge and plugin/modules metadata) + self.munger.save_all(); + + var metadata = self.munger.platformJson.generateMetadata(); + fs.writeFileSync(path.join(self.locations.www, 'cordova_plugins.js'), metadata, 'utf-8'); + + // CB-11022 save plugin metadata to both www and platform_www if options.usePlatformWww is specified + if (options.usePlatformWww) { + fs.writeFileSync(path.join(self.locations.platformWww, 'cordova_plugins.js'), metadata, 'utf-8'); + } + }); +}; + +PluginManager.prototype.addPlugin = function (plugin, installOptions) { + return this.doOperation(PluginManager.INSTALL, plugin, installOptions); +}; + +PluginManager.prototype.removePlugin = function (plugin, uninstallOptions) { + return this.doOperation(PluginManager.UNINSTALL, plugin, uninstallOptions); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/events.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/events.js new file mode 100644 index 0000000..7038643 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/events.js @@ -0,0 +1,72 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var EventEmitter = require('events').EventEmitter; + +var INSTANCE = new EventEmitter(); +INSTANCE.setMaxListeners(20); +var EVENTS_RECEIVER; + +module.exports = INSTANCE; + +/** + * Sets up current instance to forward emitted events to another EventEmitter + * instance. + * + * @param {EventEmitter} [eventEmitter] The emitter instance to forward + * events to. Falsy value, when passed, disables forwarding. + */ +module.exports.forwardEventsTo = function (eventEmitter) { + + // If no argument is specified disable events forwarding + if (!eventEmitter) { + EVENTS_RECEIVER = undefined; + return; + } + + if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Cordova events can be redirected to another EventEmitter instance only'); } + + // CB-10940 Skipping forwarding to self to avoid infinite recursion. + // This is the case when the modules are npm-linked. + if (this !== eventEmitter) { + EVENTS_RECEIVER = eventEmitter; + } else { + // Reset forwarding if we are subscribing to self + EVENTS_RECEIVER = undefined; + } +}; + +var emit = INSTANCE.emit; + +/** + * This method replaces original 'emit' method to allow events forwarding. + * + * @return {eventEmitter} Current instance to allow calls chaining, as + * original 'emit' does + */ +module.exports.emit = function () { + + var args = Array.prototype.slice.call(arguments); + + if (EVENTS_RECEIVER) { + EVENTS_RECEIVER.emit.apply(EVENTS_RECEIVER, args); + } + + return emit.apply(this, args); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/superspawn.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/superspawn.js new file mode 100644 index 0000000..424934e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/superspawn.js @@ -0,0 +1,189 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var child_process = require('child_process'); +var fs = require('fs'); +var path = require('path'); +var _ = require('underscore'); +var Q = require('q'); +var shell = require('shelljs'); +var events = require('./events'); +var iswin32 = process.platform === 'win32'; + +// On Windows, spawn() for batch files requires absolute path & having the extension. +function resolveWindowsExe (cmd) { + var winExtensions = ['.exe', '.bat', '.cmd', '.js', '.vbs']; + function isValidExe (c) { + return winExtensions.indexOf(path.extname(c)) !== -1 && fs.existsSync(c); + } + if (isValidExe(cmd)) { + return cmd; + } + cmd = shell.which(cmd) || cmd; + if (!isValidExe(cmd)) { + winExtensions.some(function (ext) { + if (fs.existsSync(cmd + ext)) { + cmd = cmd + ext; + return true; + } + }); + } + return cmd; +} + +function maybeQuote (a) { + if (/^[^"].*[ &].*[^"]/.test(a)) return '"' + a + '"'; + return a; +} + +/** + * A special implementation for child_process.spawn that handles + * Windows-specific issues with batch files and spaces in paths. Returns a + * promise that succeeds only for return code 0. It is also possible to + * subscribe on spawned process' stdout and stderr streams using progress + * handler for resultant promise. + * + * @example spawn('mycommand', [], {stdio: 'pipe'}) .progress(function (stdio){ + * if (stdio.stderr) { console.error(stdio.stderr); } }) + * .then(function(result){ // do other stuff }) + * + * @param {String} cmd A command to spawn + * @param {String[]} [args=[]] An array of arguments, passed to spawned + * process + * @param {Object} [opts={}] A configuration object + * @param {String|String[]|Object} opts.stdio Property that configures how + * spawned process' stdio will behave. Has the same meaning and possible + * values as 'stdio' options for child_process.spawn method + * (https://nodejs.org/api/child_process.html#child_process_options_stdio). + * @param {Object} [env={}] A map of extra environment variables + * @param {String} [cwd=process.cwd()] Working directory for the command + * @param {Boolean} [chmod=false] If truthy, will attempt to set the execute + * bit before executing on non-Windows platforms + * + * @return {Promise} A promise that is either fulfilled if the spawned + * process is exited with zero error code or rejected otherwise. If the + * 'stdio' option set to 'default' or 'pipe', the promise also emits progress + * messages with the following contents: + * { + * 'stdout': ..., + * 'stderr': ... + * } + */ +exports.spawn = function (cmd, args, opts) { + args = args || []; + opts = opts || {}; + var spawnOpts = {}; + var d = Q.defer(); + + if (iswin32) { + cmd = resolveWindowsExe(cmd); + // If we couldn't find the file, likely we'll end up failing, + // but for things like "del", cmd will do the trick. + if (path.extname(cmd) !== '.exe') { + var cmdArgs = '"' + [cmd].concat(args).map(maybeQuote).join(' ') + '"'; + // We need to use /s to ensure that spaces are parsed properly with cmd spawned content + args = [['/s', '/c', cmdArgs].join(' ')]; + cmd = 'cmd'; + spawnOpts.windowsVerbatimArguments = true; + } else if (!fs.existsSync(cmd)) { + // We need to use /s to ensure that spaces are parsed properly with cmd spawned content + args = ['/s', '/c', cmd].concat(args).map(maybeQuote); + } + } + + if (opts.stdio !== 'default') { + // Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option + spawnOpts.stdio = opts.stdio; + } + + if (opts.cwd) { + spawnOpts.cwd = opts.cwd; + } + + if (opts.env) { + spawnOpts.env = _.extend(_.extend({}, process.env), opts.env); + } + + if (opts.chmod && !iswin32) { + try { + // This fails when module is installed in a system directory (e.g. via sudo npm install) + fs.chmodSync(cmd, '755'); + } catch (e) { + // If the perms weren't set right, then this will come as an error upon execution. + } + } + + events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + maybeQuote(cmd) + ' ' + args.map(maybeQuote).join(' ')); + + var child = child_process.spawn(cmd, args, spawnOpts); + var capturedOut = ''; + var capturedErr = ''; + + if (child.stdout) { + child.stdout.setEncoding('utf8'); + child.stdout.on('data', function (data) { + capturedOut += data; + d.notify({'stdout': data}); + }); + } + + if (child.stderr) { + child.stderr.setEncoding('utf8'); + child.stderr.on('data', function (data) { + capturedErr += data; + d.notify({'stderr': data}); + }); + } + + child.on('close', whenDone); + child.on('error', whenDone); + function whenDone (arg) { + child.removeListener('close', whenDone); + child.removeListener('error', whenDone); + var code = typeof arg === 'number' ? arg : arg && arg.code; + + events.emit('verbose', 'Command finished with error code ' + code + ': ' + cmd + ' ' + args); + if (code === 0) { + d.resolve(capturedOut.trim()); + } else { + var errMsg = cmd + ': Command failed with exit code ' + code; + if (capturedErr) { + errMsg += ' Error output:\n' + capturedErr.trim(); + } + var err = new Error(errMsg); + if (capturedErr) { + err.stderr = capturedErr; + } + if (capturedOut) { + err.stdout = capturedOut; + } + err.code = code; + d.reject(err); + } + } + + return d.promise; +}; + +exports.maybeSpawn = function (cmd, args, opts) { + if (fs.existsSync(cmd)) { + return exports.spawn(cmd, args, opts); + } + return Q(null); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/addProperty.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/addProperty.js new file mode 100644 index 0000000..3e48174 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/addProperty.js @@ -0,0 +1,32 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +module.exports = function addProperty (module, property, modulePath, obj) { + + obj = obj || module.exports; + // Add properties as getter to delay load the modules on first invocation + Object.defineProperty(obj, property, { + configurable: true, + get: function () { + var delayLoadedModule = module.require(modulePath); + obj[property] = delayLoadedModule; + return delayLoadedModule; + } + }); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/plist-helpers.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/plist-helpers.js new file mode 100644 index 0000000..5ec4c1d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/plist-helpers.js @@ -0,0 +1,96 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +/* eslint no-useless-escape: 0 */ + +// contains PLIST utility functions +var __ = require('underscore'); +var plist = require('plist'); + +// adds node to doc at selector +module.exports.graftPLIST = graftPLIST; +function graftPLIST (doc, xml, selector) { + var obj = plist.parse('' + xml + ''); + + var node = doc[selector]; + if (node && Array.isArray(node) && Array.isArray(obj)) { + node = node.concat(obj); + for (var i = 0; i < node.length; i++) { + for (var j = i + 1; j < node.length; ++j) { + if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); } + } + } + doc[selector] = node; + } else { + // plist uses objects for . If we have two dicts we merge them instead of + // overriding the old one. See CB-6472 + if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) { // arrays checked above + __.extend(obj, node); + } + doc[selector] = obj; + } + + return true; +} + +// removes node from doc at selector +module.exports.prunePLIST = prunePLIST; +function prunePLIST (doc, xml, selector) { + var obj = plist.parse('' + xml + ''); + + pruneOBJECT(doc, selector, obj); + + return true; +} + +function pruneOBJECT (doc, selector, fragment) { + if (Array.isArray(fragment) && Array.isArray(doc[selector])) { + var empty = true; + for (var i in fragment) { + for (var j in doc[selector]) { + empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty; + } + } + if (empty) { + delete doc[selector]; + return true; + } + } else if (nodeEqual(doc[selector], fragment)) { + delete doc[selector]; + return true; + } + + return false; +} + +function nodeEqual (node1, node2) { + if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') { + node2 = escapeRE(node2).replace(/\\\$\S+/gm, '(.*?)'); + return new RegExp('^' + node2 + '$').test(node1); + } else { + for (var key in node2) { + if (!nodeEqual(node1[key], node2[key])) return false; + } + return true; + } +} + +// escape string for use in regex +function escapeRE (str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/xml-helpers.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/xml-helpers.js new file mode 100644 index 0000000..6b5d70f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-common/src/util/xml-helpers.js @@ -0,0 +1,365 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +/** + * contains XML utility functions, some of which are specific to elementtree + */ + +var fs = require('fs'); +var path = require('path'); +var _ = require('underscore'); +var et = require('elementtree'); + +/* eslint-disable no-useless-escape */ +var ROOT = /^\/([^\/]*)/; +var ABSOLUTE = /^\/([^\/]*)\/(.*)/; +/* eslint-enable no-useless-escape */ + +module.exports = { + // compare two et.XML nodes, see if they match + // compares tagName, text, attributes and children (recursively) + equalNodes: function (one, two) { + if (one.tag !== two.tag) { + return false; + } else if (one.text.trim() !== two.text.trim()) { + return false; + } else if (one._children.length !== two._children.length) { + return false; + } + + if (!attribMatch(one, two)) return false; + + for (var i = 0; i < one._children.length; i++) { + if (!module.exports.equalNodes(one._children[i], two._children[i])) { + return false; + } + } + + return true; + }, + + // adds node to doc at selector, creating parent if it doesn't exist + graftXML: function (doc, nodes, selector, after) { + var parent = module.exports.resolveParent(doc, selector); + if (!parent) { + // Try to create the parent recursively if necessary + try { + var parentToCreate = et.XML('<' + path.basename(selector) + '>'); + var parentSelector = path.dirname(selector); + + this.graftXML(doc, [parentToCreate], parentSelector); + } catch (e) { + return false; + } + parent = module.exports.resolveParent(doc, selector); + if (!parent) return false; + } + + nodes.forEach(function (node) { + // check if child is unique first + if (uniqueChild(node, parent)) { + var children = parent.getchildren(); + var insertIdx = after ? findInsertIdx(children, after) : children.length; + + // TODO: replace with parent.insert after the bug in ElementTree is fixed + parent.getchildren().splice(insertIdx, 0, node); + } + }); + + return true; + }, + + // adds new attributes to doc at selector + // Will only merge if attribute has not been modified already or --force is used + graftXMLMerge: function (doc, nodes, selector, xml) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + // saves the attributes of the original xml before making changes + xml.oldAttrib = _.extend({}, target.attrib); + + nodes.forEach(function (node) { + var attributes = node.attrib; + for (var attribute in attributes) { + target.attrib[attribute] = node.attrib[attribute]; + } + }); + + return true; + }, + + // overwrite all attributes to doc at selector with new attributes + // Will only overwrite if attribute has not been modified already or --force is used + graftXMLOverwrite: function (doc, nodes, selector, xml) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + // saves the attributes of the original xml before making changes + xml.oldAttrib = _.extend({}, target.attrib); + + // remove old attributes from target + var targetAttributes = target.attrib; + for (var targetAttribute in targetAttributes) { + delete targetAttributes[targetAttribute]; + } + + // add new attributes to target + nodes.forEach(function (node) { + var attributes = node.attrib; + for (var attribute in attributes) { + target.attrib[attribute] = node.attrib[attribute]; + } + }); + + return true; + }, + + // removes node from doc at selector + pruneXML: function (doc, nodes, selector) { + var parent = module.exports.resolveParent(doc, selector); + if (!parent) return false; + + nodes.forEach(function (node) { + var matchingKid = null; + if ((matchingKid = findChild(node, parent)) !== null) { + // stupid elementtree takes an index argument it doesn't use + // and does not conform to the python lib + parent.remove(matchingKid); + } + }); + + return true; + }, + + // restores attributes from doc at selector + pruneXMLRestore: function (doc, selector, xml) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + if (xml.oldAttrib) { + target.attrib = _.extend({}, xml.oldAttrib); + } + + return true; + }, + + pruneXMLRemove: function (doc, selector, nodes) { + var target = module.exports.resolveParent(doc, selector); + if (!target) return false; + + nodes.forEach(function (node) { + var attributes = node.attrib; + for (var attribute in attributes) { + if (target.attrib[attribute]) { + delete target.attrib[attribute]; + } + } + }); + + return true; + + }, + + parseElementtreeSync: function (filename) { + var contents = fs.readFileSync(filename, 'utf-8'); + if (contents) { + // Windows is the BOM. Skip the Byte Order Mark. + contents = contents.substring(contents.indexOf('<')); + } + return new et.ElementTree(et.XML(contents)); + }, + + resolveParent: function (doc, selector) { + var parent, tagName, subSelector; + + // handle absolute selector (which elementtree doesn't like) + if (ROOT.test(selector)) { + tagName = selector.match(ROOT)[1]; + // test for wildcard "any-tag" root selector + if (tagName === '*' || tagName === doc._root.tag) { + parent = doc._root; + + // could be an absolute path, but not selecting the root + if (ABSOLUTE.test(selector)) { + subSelector = selector.match(ABSOLUTE)[2]; + parent = parent.find(subSelector); + } + } else { + return false; + } + } else { + parent = doc.find(selector); + } + return parent; + } +}; + +function findChild (node, parent) { + var matchingKids = parent.findall(node.tag); + var i; + var j; + + for (i = 0, j = matchingKids.length; i < j; i++) { + if (module.exports.equalNodes(node, matchingKids[i])) { + return matchingKids[i]; + } + } + return null; +} + +function uniqueChild (node, parent) { + var matchingKids = parent.findall(node.tag); + var i = 0; + + if (matchingKids.length === 0) { + return true; + } else { + for (i; i < matchingKids.length; i++) { + if (module.exports.equalNodes(node, matchingKids[i])) { + return false; + } + } + return true; + } +} + +// Find the index at which to insert an entry. After is a ;-separated priority list +// of tags after which the insertion should be made. E.g. If we need to +// insert an element C, and the rule is that the order of children has to be +// As, Bs, Cs. After will be equal to "C;B;A". +function findInsertIdx (children, after) { + var childrenTags = children.map(function (child) { return child.tag; }); + var afters = after.split(';'); + var afterIndexes = afters.map(function (current) { return childrenTags.lastIndexOf(current); }); + var foundIndex = _.find(afterIndexes, function (index) { return index !== -1; }); + + // add to the beginning if no matching nodes are found + return typeof foundIndex === 'undefined' ? 0 : foundIndex + 1; +} + +var BLACKLIST = ['platform', 'feature', 'plugin', 'engine']; +var SINGLETONS = ['content', 'author', 'name']; +function mergeXml (src, dest, platform, clobber) { + // Do nothing for blacklisted tags. + if (BLACKLIST.indexOf(src.tag) !== -1) return; + + // Handle attributes + Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) { + if (clobber || !dest.attrib[attribute]) { + dest.attrib[attribute] = src.attrib[attribute]; + } + }); + // Handle text + if (src.text && (clobber || !dest.text)) { + dest.text = src.text; + } + // Handle children + src.getchildren().forEach(mergeChild); + + // Handle platform + if (platform) { + src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) { + platformElement.getchildren().forEach(mergeChild); + }); + } + + // Handle duplicate preference tags (by name attribute) + removeDuplicatePreferences(dest); + + function mergeChild (srcChild) { + var srcTag = srcChild.tag; + var destChild = new et.Element(srcTag); + var foundChild; + var query = srcTag + ''; + var shouldMerge = true; + + if (BLACKLIST.indexOf(srcTag) !== -1) return; + + if (SINGLETONS.indexOf(srcTag) !== -1) { + foundChild = dest.find(query); + if (foundChild) { + destChild = foundChild; + dest.remove(destChild); + } + } else { + // Check for an exact match and if you find one don't add + var mergeCandidates = dest.findall(query) + .filter(function (foundChild) { + return foundChild && textMatch(srcChild, foundChild) && attribMatch(srcChild, foundChild); + }); + + if (mergeCandidates.length > 0) { + destChild = mergeCandidates[0]; + dest.remove(destChild); + shouldMerge = false; + } + } + + mergeXml(srcChild, destChild, platform, clobber && shouldMerge); + dest.append(destChild); + } + + function removeDuplicatePreferences (xml) { + // reduce preference tags to a hashtable to remove dupes + var prefHash = xml.findall('preference[@name][@value]').reduce(function (previousValue, currentValue) { + previousValue[ currentValue.attrib.name ] = currentValue.attrib.value; + return previousValue; + }, {}); + + // remove all preferences + xml.findall('preference[@name][@value]').forEach(function (pref) { + xml.remove(pref); + }); + + // write new preferences + Object.keys(prefHash).forEach(function (key) { + var element = et.SubElement(xml, 'preference'); + element.set('name', key); + element.set('value', this[key]); + }, prefHash); + } +} + +// Expose for testing. +module.exports.mergeXml = mergeXml; + +function textMatch (elm1, elm2) { + var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : ''; + var text2 = elm2.text ? elm2.text.replace(/\s+/, '') : ''; + return (text1 === '' || text1 === text2); +} + +function attribMatch (one, two) { + var oneAttribKeys = Object.keys(one.attrib); + var twoAttribKeys = Object.keys(two.attrib); + + if (oneAttribKeys.length !== twoAttribKeys.length) { + return false; + } + + for (var i = 0; i < oneAttribKeys.length; i++) { + var attribName = oneAttribKeys[i]; + + if (one.attrib[attribName] !== two.attrib[attribName]) { + return false; + } + } + + return true; +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.travis.yml new file mode 100644 index 0000000..ae381fc --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +sudo: false +node_js: + - "0.10" +install: npm install +script: + - npm test diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/README.md new file mode 100644 index 0000000..3b93e5f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/README.md @@ -0,0 +1,14 @@ +[![Build Status](https://travis-ci.org/stevengill/cordova-registry-mapper.svg?branch=master)](https://travis-ci.org/stevengill/cordova-registry-mapper) + +#Cordova Registry Mapper + +This module is used to map Cordova plugin ids to package names and vice versa. + +When Cordova users add plugins to their projects using ids +(e.g. `cordova plugin add org.apache.cordova.device`), +this module will map that id to the corresponding package name so `cordova-lib` knows what to fetch from **npm**. + +This module was created so the Apache Cordova project could migrate its plugins from +the [Cordova Registry](http://registry.cordova.io/) +to [npm](https://registry.npmjs.com/) +instead of having to maintain a registry. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/index.js new file mode 100644 index 0000000..4550774 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/index.js @@ -0,0 +1,204 @@ +var map = { + 'org.apache.cordova.battery-status':'cordova-plugin-battery-status', + 'org.apache.cordova.camera':'cordova-plugin-camera', + 'org.apache.cordova.console':'cordova-plugin-console', + 'org.apache.cordova.contacts':'cordova-plugin-contacts', + 'org.apache.cordova.device':'cordova-plugin-device', + 'org.apache.cordova.device-motion':'cordova-plugin-device-motion', + 'org.apache.cordova.device-orientation':'cordova-plugin-device-orientation', + 'org.apache.cordova.dialogs':'cordova-plugin-dialogs', + 'org.apache.cordova.file':'cordova-plugin-file', + 'org.apache.cordova.file-transfer':'cordova-plugin-file-transfer', + 'org.apache.cordova.geolocation':'cordova-plugin-geolocation', + 'org.apache.cordova.globalization':'cordova-plugin-globalization', + 'org.apache.cordova.inappbrowser':'cordova-plugin-inappbrowser', + 'org.apache.cordova.media':'cordova-plugin-media', + 'org.apache.cordova.media-capture':'cordova-plugin-media-capture', + 'org.apache.cordova.network-information':'cordova-plugin-network-information', + 'org.apache.cordova.splashscreen':'cordova-plugin-splashscreen', + 'org.apache.cordova.statusbar':'cordova-plugin-statusbar', + 'org.apache.cordova.vibration':'cordova-plugin-vibration', + 'org.apache.cordova.test-framework':'cordova-plugin-test-framework', + 'com.msopentech.websql' : 'cordova-plugin-websql', + 'com.msopentech.indexeddb' : 'cordova-plugin-indexeddb', + 'com.microsoft.aad.adal' : 'cordova-plugin-ms-adal', + 'com.microsoft.capptain' : 'capptain-cordova', + 'com.microsoft.services.aadgraph' : 'cordova-plugin-ms-aad-graph', + 'com.microsoft.services.files' : 'cordova-plugin-ms-files', + 'om.microsoft.services.outlook' : 'cordova-plugin-ms-outlook', + 'com.pbakondy.sim' : 'cordova-plugin-sim', + 'android.support.v4' : 'cordova-plugin-android-support-v4', + 'android.support.v7-appcompat' : 'cordova-plugin-android-support-v7-appcompat', + 'com.google.playservices' : 'cordova-plugin-googleplayservices', + 'com.google.cordova.admob' : 'cordova-plugin-admobpro', + 'com.rjfun.cordova.extension' : 'cordova-plugin-extension', + 'com.rjfun.cordova.plugin.admob' : 'cordova-plugin-admob', + 'com.rjfun.cordova.flurryads' : 'cordova-plugin-flurry', + 'com.rjfun.cordova.facebookads' : 'cordova-plugin-facebookads', + 'com.rjfun.cordova.httpd' : 'cordova-plugin-httpd', + 'com.rjfun.cordova.iad' : 'cordova-plugin-iad', + 'com.rjfun.cordova.iflyspeech' : 'cordova-plugin-iflyspeech', + 'com.rjfun.cordova.lianlianpay' : 'cordova-plugin-lianlianpay', + 'com.rjfun.cordova.mobfox' : 'cordova-plugin-mobfox', + 'com.rjfun.cordova.mopub' : 'cordova-plugin-mopub', + 'com.rjfun.cordova.mmedia' : 'cordova-plugin-mmedia', + 'com.rjfun.cordova.nativeaudio' : 'cordova-plugin-nativeaudio', + 'com.rjfun.cordova.plugin.paypalmpl' : 'cordova-plugin-paypalmpl', + 'com.rjfun.cordova.smartadserver' : 'cordova-plugin-smartadserver', + 'com.rjfun.cordova.sms' : 'cordova-plugin-sms', + 'com.rjfun.cordova.wifi' : 'cordova-plugin-wifi', + 'com.ohh2ahh.plugins.appavailability' : 'cordova-plugin-appavailability', + 'org.adapt-it.cordova.fonts' : 'cordova-plugin-fonts', + 'de.martinreinhardt.cordova.plugins.barcodeScanner' : 'cordova-plugin-barcodescanner', + 'de.martinreinhardt.cordova.plugins.urlhandler' : 'cordova-plugin-urlhandler', + 'de.martinreinhardt.cordova.plugins.email' : 'cordova-plugin-email', + 'de.martinreinhardt.cordova.plugins.certificates' : 'cordova-plugin-certificates', + 'de.martinreinhardt.cordova.plugins.sqlite' : 'cordova-plugin-sqlite', + 'fr.smile.cordova.fileopener' : 'cordova-plugin-fileopener', + 'org.smile.websqldatabase.initializer' : 'cordova-plugin-websqldatabase-initializer', + 'org.smile.websqldatabase.wpdb' : 'cordova-plugin-websqldatabase', + 'org.jboss.aerogear.cordova.push' : 'aerogear-cordova-push', + 'org.jboss.aerogear.cordova.oauth2' : 'aerogear-cordova-oauth2', + 'org.jboss.aerogear.cordova.geo' : 'aerogear-cordova-geo', + 'org.jboss.aerogear.cordova.crypto' : 'aerogear-cordova-crypto', + 'org.jboss.aerogaer.cordova.otp' : 'aerogear-cordova-otp', + 'uk.co.ilee.applewatch' : 'cordova-plugin-apple-watch', + 'uk.co.ilee.directions' : 'cordova-plugin-directions', + 'uk.co.ilee.gamecenter' : 'cordova-plugin-game-center', + 'uk.co.ilee.jailbreakdetection' : 'cordova-plugin-jailbreak-detection', + 'uk.co.ilee.nativetransitions' : 'cordova-plugin-native-transitions', + 'uk.co.ilee.pedometer' : 'cordova-plugin-pedometer', + 'uk.co.ilee.shake' : 'cordova-plugin-shake', + 'uk.co.ilee.touchid' : 'cordova-plugin-touchid', + 'com.knowledgecode.cordova.websocket' : 'cordova-plugin-websocket', + 'com.elixel.plugins.settings' : 'cordova-plugin-settings', + 'com.cowbell.cordova.geofence' : 'cordova-plugin-geofence', + 'com.blackberry.community.preventsleep' : 'cordova-plugin-preventsleep', + 'com.blackberry.community.gamepad' : 'cordova-plugin-gamepad', + 'com.blackberry.community.led' : 'cordova-plugin-led', + 'com.blackberry.community.thumbnail' : 'cordova-plugin-thumbnail', + 'com.blackberry.community.mediakeys' : 'cordova-plugin-mediakeys', + 'com.blackberry.community.simplebtlehrplugin' : 'cordova-plugin-bluetoothheartmonitor', + 'com.blackberry.community.simplebeaconplugin' : 'cordova-plugin-bluetoothibeacon', + 'com.blackberry.community.simplebtsppplugin' : 'cordova-plugin-bluetoothspp', + 'com.blackberry.community.clipboard' : 'cordova-plugin-clipboard', + 'com.blackberry.community.curl' : 'cordova-plugin-curl', + 'com.blackberry.community.qt' : 'cordova-plugin-qtbridge', + 'com.blackberry.community.upnp' : 'cordova-plugin-upnp', + 'com.blackberry.community.PasswordCrypto' : 'cordova-plugin-password-crypto', + 'com.blackberry.community.deviceinfoplugin' : 'cordova-plugin-deviceinfo', + 'com.blackberry.community.gsecrypto' : 'cordova-plugin-bb-crypto', + 'com.blackberry.community.mongoose' : 'cordova-plugin-mongoose', + 'com.blackberry.community.sysdialog' : 'cordova-plugin-bb-sysdialog', + 'com.blackberry.community.screendisplay' : 'cordova-plugin-screendisplay', + 'com.blackberry.community.messageplugin' : 'cordova-plugin-bb-messageretrieve', + 'com.blackberry.community.emailsenderplugin' : 'cordova-plugin-emailsender', + 'com.blackberry.community.audiometadata' : 'cordova-plugin-audiometadata', + 'com.blackberry.community.deviceemails' : 'cordova-plugin-deviceemails', + 'com.blackberry.community.audiorecorder' : 'cordova-plugin-audiorecorder', + 'com.blackberry.community.vibration' : 'cordova-plugin-vibrate-intense', + 'com.blackberry.community.SMSPlugin' : 'cordova-plugin-bb-sms', + 'com.blackberry.community.extractZipFile' : 'cordova-plugin-bb-zip', + 'com.blackberry.community.lowlatencyaudio' : 'cordova-plugin-bb-nativeaudio', + 'com.blackberry.community.barcodescanner' : 'phonegap-plugin-barcodescanner', + 'com.blackberry.app' : 'cordova-plugin-bb-app', + 'com.blackberry.bbm.platform' : 'cordova-plugin-bbm', + 'com.blackberry.connection' : 'cordova-plugin-bb-connection', + 'com.blackberry.identity' : 'cordova-plugin-bb-identity', + 'com.blackberry.invoke.card' : 'cordova-plugin-bb-card', + 'com.blackberry.invoke' : 'cordova-plugin-bb-invoke', + 'com.blackberry.invoked' : 'cordova-plugin-bb-invoked', + 'com.blackberry.io.filetransfer' : 'cordova-plugin-bb-filetransfer', + 'com.blackberry.io' : 'cordova-plugin-bb-io', + 'com.blackberry.notification' : 'cordova-plugin-bb-notification', + 'com.blackberry.payment' : 'cordova-plugin-bb-payment', + 'com.blackberry.pim.calendar' : 'cordova-plugin-bb-calendar', + 'com.blackberry.pim.contacts' : 'cordova-plugin-bb-contacts', + 'com.blackberry.pim.lib' : 'cordova-plugin-bb-pimlib', + 'com.blackberry.push' : 'cordova-plugin-bb-push', + 'com.blackberry.screenshot' : 'cordova-plugin-screenshot', + 'com.blackberry.sensors' : 'cordova-plugin-bb-sensors', + 'com.blackberry.system' : 'cordova-plugin-bb-system', + 'com.blackberry.ui.contextmenu' : 'cordova-plugin-bb-ctxmenu', + 'com.blackberry.ui.cover' : 'cordova-plugin-bb-cover', + 'com.blackberry.ui.dialog' : 'cordova-plugin-bb-dialog', + 'com.blackberry.ui.input' : 'cordova-plugin-touch-keyboard', + 'com.blackberry.ui.toast' : 'cordova-plugin-toast', + 'com.blackberry.user.identity' : 'cordova-plugin-bb-idservice', + 'com.blackberry.utils' : 'cordova-plugin-bb-utils', + 'net.yoik.cordova.plugins.screenorientation' : 'cordova-plugin-screen-orientation', + 'com.phonegap.plugins.barcodescanner' : 'phonegap-plugin-barcodescanner', + 'com.manifoldjs.hostedwebapp' : 'cordova-plugin-hostedwebapp', + 'com.initialxy.cordova.themeablebrowser' : 'cordova-plugin-themeablebrowser', + 'gr.denton.photosphere' : 'cordova-plugin-panoramaviewer', + 'nl.x-services.plugins.actionsheet' : 'cordova-plugin-actionsheet', + 'nl.x-services.plugins.socialsharing' : 'cordova-plugin-x-socialsharing', + 'nl.x-services.plugins.googleplus' : 'cordova-plugin-googleplus', + 'nl.x-services.plugins.insomnia' : 'cordova-plugin-insomnia', + 'nl.x-services.plugins.toast' : 'cordova-plugin-x-toast', + 'nl.x-services.plugins.calendar' : 'cordova-plugin-calendar', + 'nl.x-services.plugins.launchmyapp' : 'cordova-plugin-customurlscheme', + 'nl.x-services.plugins.flashlight' : 'cordova-plugin-flashlight', + 'nl.x-services.plugins.sslcertificatechecker' : 'cordova-plugin-sslcertificatechecker', + 'com.bridge.open' : 'cordova-open', + 'com.bridge.safe' : 'cordova-safe', + 'com.disusered.open' : 'cordova-open', + 'com.disusered.safe' : 'cordova-safe', + 'me.apla.cordova.app-preferences' : 'cordova-plugin-app-preferences', + 'com.konotor.cordova' : 'cordova-plugin-konotor', + 'io.intercom.cordova' : 'cordova-plugin-intercom', + 'com.onesignal.plugins.onesignal' : 'onesignal-cordova-plugin', + 'com.danjarvis.document-contract': 'cordova-plugin-document-contract', + 'com.eface2face.iosrtc' : 'cordova-plugin-iosrtc', + 'com.mobileapptracking.matplugin' : 'cordova-plugin-tune', + 'com.marianhello.cordova.background-geolocation' : 'cordova-plugin-mauron85-background-geolocation', + 'fr.louisbl.cordova.locationservices' : 'cordova-plugin-locationservices', + 'fr.louisbl.cordova.gpslocation' : 'cordova-plugin-gpslocation', + 'com.hiliaox.weibo' : 'cordova-plugin-weibo', + 'com.uxcam.cordova.plugin' : 'cordova-uxcam', + 'de.fastr.phonegap.plugins.downloader' : 'cordova-plugin-fastrde-downloader', + 'de.fastr.phonegap.plugins.injectView' : 'cordova-plugin-fastrde-injectview', + 'de.fastr.phonegap.plugins.CheckGPS' : 'cordova-plugin-fastrde-checkgps', + 'de.fastr.phonegap.plugins.md5chksum' : 'cordova-plugin-fastrde-md5', + 'io.repro.cordova' : 'cordova-plugin-repro', + 're.notifica.cordova': 'cordova-plugin-notificare-push', + 'com.megster.cordova.ble': 'cordova-plugin-ble-central', + 'com.megster.cordova.bluetoothserial': 'cordova-plugin-bluetooth-serial', + 'com.megster.cordova.rfduino': 'cordova-plugin-rfduino', + 'cz.velda.cordova.plugin.devicefeedback': 'cordova-plugin-velda-devicefeedback', + 'cz.Velda.cordova.plugin.devicefeedback': 'cordova-plugin-velda-devicefeedback', + 'org.scriptotek.appinfo': 'cordova-plugin-appinfo', + 'com.yezhiming.cordova.appinfo': 'cordova-plugin-appinfo', + 'pl.makingwaves.estimotebeacons': 'cordova-plugin-estimote', + 'com.evothings.ble': 'cordova-plugin-ble', + 'com.appsee.plugin' : 'cordova-plugin-appsee', + 'am.armsoft.plugins.listpicker': 'cordova-plugin-listpicker', + 'com.pushbots.push': 'pushbots-cordova-plugin', + 'com.admob.google': 'cordova-admob', + 'admob.ads.google': 'cordova-admob-ads', + 'admob.google.plugin': 'admob-google', + 'com.admob.admobads': 'admob-ads', + 'com.connectivity.monitor': 'cordova-connectivity-monitor', + 'com.ios.libgoogleadmobads': 'cordova-libgoogleadmobads', + 'com.google.play.services': 'cordova-google-play-services', + 'android.support.v13': 'cordova-android-support-v13', + 'android.support.v4': 'cordova-android-support-v4', // Duplicated key ;) + 'com.analytics.google': 'cordova-plugin-analytics', + 'com.analytics.adid.google': 'cordova-plugin-analytics-adid', + 'com.chariotsolutions.nfc.plugin': 'phonegap-nfc', + 'com.samz.mixpanel': 'cordova-plugin-mixpanel', + 'de.appplant.cordova.common.RegisterUserNotificationSettings': 'cordova-plugin-registerusernotificationsettings', + 'plugin.google.maps': 'cordova-plugin-googlemaps', + 'xu.li.cordova.wechat': 'cordova-plugin-wechat', + 'es.keensoft.fullscreenimage': 'cordova-plugin-fullscreenimage', + 'com.arcoirislabs.plugin.mqtt' : 'cordova-plugin-mqtt' +}; + +module.exports.oldToNew = map; + +var reverseMap = {}; +Object.keys(map).forEach(function(elem){ + reverseMap[map[elem]] = elem; +}); + +module.exports.newToOld = reverseMap; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/package.json new file mode 100644 index 0000000..180ffd6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/package.json @@ -0,0 +1,54 @@ +{ + "_from": "cordova-registry-mapper@^1.1.8", + "_id": "cordova-registry-mapper@1.1.15", + "_inBundle": true, + "_integrity": "sha1-4kS5GFuBdUc7/2B5MkkFEV+D3Hw=", + "_location": "/cordova-android/cordova-registry-mapper", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "cordova-registry-mapper@^1.1.8", + "name": "cordova-registry-mapper", + "escapedName": "cordova-registry-mapper", + "rawSpec": "^1.1.8", + "saveSpec": null, + "fetchSpec": "^1.1.8" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/cordova-registry-mapper/-/cordova-registry-mapper-1.1.15.tgz", + "_shasum": "e244b9185b8175473bff6079324905115f83dc7c", + "_spec": "cordova-registry-mapper@^1.1.8", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Steve Gill" + }, + "bugs": { + "url": "https://github.com/stevengill/cordova-registry-mapper/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Maps old plugin ids to new plugin names for fetching from npm", + "devDependencies": { + "tape": "^3.5.0" + }, + "homepage": "https://github.com/stevengill/cordova-registry-mapper#readme", + "keywords": [ + "cordova", + "plugins" + ], + "license": "Apache version 2.0", + "main": "index.js", + "name": "cordova-registry-mapper", + "repository": { + "type": "git", + "url": "git+https://github.com/stevengill/cordova-registry-mapper.git" + }, + "scripts": { + "test": "node tests/test.js" + }, + "version": "1.1.15" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/tests/test.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/tests/test.js new file mode 100644 index 0000000..35343be --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/cordova-registry-mapper/tests/test.js @@ -0,0 +1,11 @@ +var test = require('tape'); +var oldToNew = require('../index').oldToNew; +var newToOld = require('../index').newToOld; + +test('plugin mappings exist', function(t) { + t.plan(2); + + t.equal('cordova-plugin-device', oldToNew['org.apache.cordova.device']); + + t.equal('org.apache.cordova.device', newToOld['cordova-plugin-device']); +}) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.travis.yml new file mode 100644 index 0000000..6f27c96 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/.travis.yml @@ -0,0 +1,10 @@ +language: node_js + +node_js: + - 0.6 + +script: make test + +notifications: + email: + - tomaz+travisci@tomaz.me diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/CHANGES.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/CHANGES.md new file mode 100644 index 0000000..50d415d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/CHANGES.md @@ -0,0 +1,39 @@ +elementtree v0.1.6 (in development) + +* Add support for CData elements. (#14) + [hermannpencole] + +elementtree v0.1.5 - 2012-11-14 + +* Fix a bug in the find() and findtext() method which could manifest itself + under some conditions. + [metagriffin] + +elementtree v0.1.4 - 2012-10-15 + +* Allow user to use namespaced attributes when using find* functions. + [Andrew Lunny] + +elementtree v0.1.3 - 2012-09-21 + +* Improve the output of text content in the tags (strip unnecessary line break + characters). + +[Darryl Pogue] + +elementtree v0.1.2 - 2012-09-04 + + * Allow user to pass 'indent' option to ElementTree.write method. If this + option is specified (e.g. {'indent': 4}). XML will be pretty printed. + [Darryl Pogue, Tomaz Muraus] + + * Bump sax dependency version. + +elementtree v0.1.1 - 2011-09-23 + + * Improve special character escaping. + [Ryan Phillips] + +elementtree v0.1.0 - 2011-09-05 + + * Initial release. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/LICENSE.txt b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/LICENSE.txt new file mode 100644 index 0000000..6b0b127 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/LICENSE.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/Makefile b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/Makefile new file mode 100644 index 0000000..ab7c4e0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/Makefile @@ -0,0 +1,21 @@ +TESTS := \ + tests/test-simple.js + + + +PATH := ./node_modules/.bin:$(PATH) + +WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey') + +default: test + +test: + NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}" + +tap: + NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}" + +coverage: + NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}" + +.PHONY: default test coverage tap scope diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/NOTICE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/NOTICE new file mode 100644 index 0000000..28ad70a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/NOTICE @@ -0,0 +1,5 @@ +node-elementtree +Copyright (c) 2011, Rackspace, Inc. + +The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/README.md new file mode 100644 index 0000000..738420c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/README.md @@ -0,0 +1,141 @@ +node-elementtree +==================== + +node-elementtree is a [Node.js](http://nodejs.org) XML parser and serializer based upon the [Python ElementTree v1.3](http://effbot.org/zone/element-index.htm) module. + +Installation +==================== + + $ npm install elementtree + +Using the library +==================== + +For the usage refer to the Python ElementTree library documentation - [http://effbot.org/zone/element-index.htm#usage](http://effbot.org/zone/element-index.htm#usage). + +Supported XPath expressions in `find`, `findall` and `findtext` methods are listed on [http://effbot.org/zone/element-xpath.htm](http://effbot.org/zone/element-xpath.htm). + +Example 1 – Creating An XML Document +==================== + +This example shows how to build a valid XML document that can be published to +Atom Hopper. Atom Hopper is used internally as a bridge from products all the +way to collecting revenue, called “Usage.” MaaS and other products send similar +events to it every time user performs an action on a resource +(e.g. creates,updates or deletes). Below is an example of leveraging the API +to create a new XML document. + +```javascript +var et = require('elementtree'); +var XML = et.XML; +var ElementTree = et.ElementTree; +var element = et.Element; +var subElement = et.SubElement; + +var date, root, tenantId, serviceName, eventType, usageId, dataCenter, region, +checks, resourceId, category, startTime, resourceName, etree, xml; + +date = new Date(); + +root = element('entry'); +root.set('xmlns', 'http://www.w3.org/2005/Atom'); + +tenantId = subElement(root, 'TenantId'); +tenantId.text = '12345'; + +serviceName = subElement(root, 'ServiceName'); +serviceName.text = 'MaaS'; + +resourceId = subElement(root, 'ResourceID'); +resourceId.text = 'enAAAA'; + +usageId = subElement(root, 'UsageID'); +usageId.text = '550e8400-e29b-41d4-a716-446655440000'; + +eventType = subElement(root, 'EventType'); +eventType.text = 'create'; + +category = subElement(root, 'category'); +category.set('term', 'monitoring.entity.create'); + +dataCenter = subElement(root, 'DataCenter'); +dataCenter.text = 'global'; + +region = subElement(root, 'Region'); +region.text = 'global'; + +startTime = subElement(root, 'StartTime'); +startTime.text = date; + +resourceName = subElement(root, 'ResourceName'); +resourceName.text = 'entity'; + +etree = new ElementTree(root); +xml = etree.write({'xml_declaration': false}); +console.log(xml); +``` + +As you can see, both et.Element and et.SubElement are factory methods which +return a new instance of Element and SubElement class, respectively. +When you create a new element (tag) you can use set method to set an attribute. +To set the tag value, assign a value to the .text attribute. + +This example would output a document that looks like this: + +```xml + + 12345 + MaaS + enAAAA + 550e8400-e29b-41d4-a716-446655440000 + create + + global + global + Sun Apr 29 2012 16:37:32 GMT-0700 (PDT) + entity + +``` + +Example 2 – Parsing An XML Document +==================== + +This example shows how to parse an XML document and use simple XPath selectors. +For demonstration purposes, we will use the XML document located at +https://gist.github.com/2554343. + +Behind the scenes, node-elementtree uses Isaac’s sax library for parsing XML, +but the library has a concept of “parsers,” which means it’s pretty simple to +add support for a different parser. + +```javascript +var fs = require('fs'); + +var et = require('elementtree'); + +var XML = et.XML; +var ElementTree = et.ElementTree; +var element = et.Element; +var subElement = et.SubElement; + +var data, etree; + +data = fs.readFileSync('document.xml').toString(); +etree = et.parse(data); + +console.log(etree.findall('./entry/TenantId').length); // 2 +console.log(etree.findtext('./entry/ServiceName')); // MaaS +console.log(etree.findall('./entry/category')[0].get('term')); // monitoring.entity.create +console.log(etree.findall('*/category/[@term="monitoring.entity.update"]').length); // 1 +``` + +Build status +==================== + +[![Build Status](https://secure.travis-ci.org/racker/node-elementtree.png)](http://travis-ci.org/racker/node-elementtree) + + +License +==================== + +node-elementtree is distributed under the [Apache license](http://www.apache.org/licenses/LICENSE-2.0.html). diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/constants.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/constants.js new file mode 100644 index 0000000..b057faf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/constants.js @@ -0,0 +1,20 @@ +/* + * Copyright 2011 Rackspace + * + * 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. + * + */ + +var DEFAULT_PARSER = 'sax'; + +exports.DEFAULT_PARSER = DEFAULT_PARSER; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementpath.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementpath.js new file mode 100644 index 0000000..2e93f47 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementpath.js @@ -0,0 +1,343 @@ +/** + * Copyright 2011 Rackspace + * + * 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. + * + */ + +var sprintf = require('./sprintf').sprintf; + +var utils = require('./utils'); +var SyntaxError = require('./errors').SyntaxError; + +var _cache = {}; + +var RE = new RegExp( + "(" + + "'[^']*'|\"[^\"]*\"|" + + "::|" + + "//?|" + + "\\.\\.|" + + "\\(\\)|" + + "[/.*:\\[\\]\\(\\)@=])|" + + "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" + + "\\s+", 'g' +); + +var xpath_tokenizer = utils.findall.bind(null, RE); + +function prepare_tag(next, token) { + var tag = token[0]; + + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + elem._children.forEach(function(e) { + if (e.tag === tag) { + rv.push(e); + } + }); + } + + return rv; + } + + return select; +} + +function prepare_star(next, token) { + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + elem._children.forEach(function(e) { + rv.push(e); + }); + } + + return rv; + } + + return select; +} + +function prepare_dot(next, token) { + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + rv.push(elem); + } + + return rv; + } + + return select; +} + +function prepare_iter(next, token) { + var tag; + token = next(); + + if (token[1] === '*') { + tag = '*'; + } + else if (!token[1]) { + tag = token[0] || ''; + } + else { + throw new SyntaxError(token); + } + + function select(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + elem.iter(tag, function(e) { + if (e !== elem) { + rv.push(e); + } + }); + } + + return rv; + } + + return select; +} + +function prepare_dot_dot(next, token) { + function select(context, result) { + var i, len, elem, rv = [], parent_map = context.parent_map; + + if (!parent_map) { + context.parent_map = parent_map = {}; + + context.root.iter(null, function(p) { + p._children.forEach(function(e) { + parent_map[e] = p; + }); + }); + } + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (parent_map.hasOwnProperty(elem)) { + rv.push(parent_map[elem]); + } + } + + return rv; + } + + return select; +} + + +function prepare_predicate(next, token) { + var tag, key, value, select; + token = next(); + + if (token[1] === '@') { + // attribute + token = next(); + + if (token[1]) { + throw new SyntaxError(token, 'Invalid attribute predicate'); + } + + key = token[0]; + token = next(); + + if (token[1] === ']') { + select = function(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (elem.get(key)) { + rv.push(elem); + } + } + + return rv; + }; + } + else if (token[1] === '=') { + value = next()[1]; + + if (value[0] === '"' || value[value.length - 1] === '\'') { + value = value.slice(1, value.length - 1); + } + else { + throw new SyntaxError(token, 'Ivalid comparison target'); + } + + token = next(); + select = function(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (elem.get(key) === value) { + rv.push(elem); + } + } + + return rv; + }; + } + + if (token[1] !== ']') { + throw new SyntaxError(token, 'Invalid attribute predicate'); + } + } + else if (!token[1]) { + tag = token[0] || ''; + token = next(); + + if (token[1] !== ']') { + throw new SyntaxError(token, 'Invalid node predicate'); + } + + select = function(context, result) { + var i, len, elem, rv = []; + + for (i = 0, len = result.length; i < len; i++) { + elem = result[i]; + + if (elem.find(tag)) { + rv.push(elem); + } + } + + return rv; + }; + } + else { + throw new SyntaxError(null, 'Invalid predicate'); + } + + return select; +} + + + +var ops = { + "": prepare_tag, + "*": prepare_star, + ".": prepare_dot, + "..": prepare_dot_dot, + "//": prepare_iter, + "[": prepare_predicate, +}; + +function _SelectorContext(root) { + this.parent_map = null; + this.root = root; +} + +function findall(elem, path) { + var selector, result, i, len, token, value, select, context; + + if (_cache.hasOwnProperty(path)) { + selector = _cache[path]; + } + else { + // TODO: Use smarter cache purging approach + if (Object.keys(_cache).length > 100) { + _cache = {}; + } + + if (path.charAt(0) === '/') { + throw new SyntaxError(null, 'Cannot use absolute path on element'); + } + + result = xpath_tokenizer(path); + selector = []; + + function getToken() { + return result.shift(); + } + + token = getToken(); + while (true) { + var c = token[1] || ''; + value = ops[c](getToken, token); + + if (!value) { + throw new SyntaxError(null, sprintf('Invalid path: %s', path)); + } + + selector.push(value); + token = getToken(); + + if (!token) { + break; + } + else if (token[1] === '/') { + token = getToken(); + } + + if (!token) { + break; + } + } + + _cache[path] = selector; + } + + // Execute slector pattern + result = [elem]; + context = new _SelectorContext(elem); + + for (i = 0, len = selector.length; i < len; i++) { + select = selector[i]; + result = select(context, result); + } + + return result || []; +} + +function find(element, path) { + var resultElements = findall(element, path); + + if (resultElements && resultElements.length > 0) { + return resultElements[0]; + } + + return null; +} + +function findtext(element, path, defvalue) { + var resultElements = findall(element, path); + + if (resultElements && resultElements.length > 0) { + return resultElements[0].text; + } + + return defvalue; +} + + +exports.find = find; +exports.findall = findall; +exports.findtext = findtext; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementtree.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementtree.js new file mode 100644 index 0000000..61d9276 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/elementtree.js @@ -0,0 +1,611 @@ +/** + * Copyright 2011 Rackspace + * + * 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. + * + */ + +var sprintf = require('./sprintf').sprintf; + +var utils = require('./utils'); +var ElementPath = require('./elementpath'); +var TreeBuilder = require('./treebuilder').TreeBuilder; +var get_parser = require('./parser').get_parser; +var constants = require('./constants'); + +var element_ids = 0; + +function Element(tag, attrib) +{ + this._id = element_ids++; + this.tag = tag; + this.attrib = {}; + this.text = null; + this.tail = null; + this._children = []; + + if (attrib) { + this.attrib = utils.merge(this.attrib, attrib); + } +} + +Element.prototype.toString = function() +{ + return sprintf("", this.tag, this._id); +}; + +Element.prototype.makeelement = function(tag, attrib) +{ + return new Element(tag, attrib); +}; + +Element.prototype.len = function() +{ + return this._children.length; +}; + +Element.prototype.getItem = function(index) +{ + return this._children[index]; +}; + +Element.prototype.setItem = function(index, element) +{ + this._children[index] = element; +}; + +Element.prototype.delItem = function(index) +{ + this._children.splice(index, 1); +}; + +Element.prototype.getSlice = function(start, stop) +{ + return this._children.slice(start, stop); +}; + +Element.prototype.setSlice = function(start, stop, elements) +{ + var i; + var k = 0; + for (i = start; i < stop; i++, k++) { + this._children[i] = elements[k]; + } +}; + +Element.prototype.delSlice = function(start, stop) +{ + this._children.splice(start, stop - start); +}; + +Element.prototype.append = function(element) +{ + this._children.push(element); +}; + +Element.prototype.extend = function(elements) +{ + this._children.concat(elements); +}; + +Element.prototype.insert = function(index, element) +{ + this._children[index] = element; +}; + +Element.prototype.remove = function(element) +{ + this._children = this._children.filter(function(e) { + /* TODO: is this the right way to do this? */ + if (e._id === element._id) { + return false; + } + return true; + }); +}; + +Element.prototype.getchildren = function() { + return this._children; +}; + +Element.prototype.find = function(path) +{ + return ElementPath.find(this, path); +}; + +Element.prototype.findtext = function(path, defvalue) +{ + return ElementPath.findtext(this, path, defvalue); +}; + +Element.prototype.findall = function(path, defvalue) +{ + return ElementPath.findall(this, path, defvalue); +}; + +Element.prototype.clear = function() +{ + this.attrib = {}; + this._children = []; + this.text = null; + this.tail = null; +}; + +Element.prototype.get = function(key, defvalue) +{ + if (this.attrib[key] !== undefined) { + return this.attrib[key]; + } + else { + return defvalue; + } +}; + +Element.prototype.set = function(key, value) +{ + this.attrib[key] = value; +}; + +Element.prototype.keys = function() +{ + return Object.keys(this.attrib); +}; + +Element.prototype.items = function() +{ + return utils.items(this.attrib); +}; + +/* + * In python this uses a generator, but in v8 we don't have em, + * so we use a callback instead. + **/ +Element.prototype.iter = function(tag, callback) +{ + var self = this; + var i, child; + + if (tag === "*") { + tag = null; + } + + if (tag === null || this.tag === tag) { + callback(self); + } + + for (i = 0; i < this._children.length; i++) { + child = this._children[i]; + child.iter(tag, function(e) { + callback(e); + }); + } +}; + +Element.prototype.itertext = function(callback) +{ + this.iter(null, function(e) { + if (e.text) { + callback(e.text); + } + + if (e.tail) { + callback(e.tail); + } + }); +}; + + +function SubElement(parent, tag, attrib) { + var element = parent.makeelement(tag, attrib); + parent.append(element); + return element; +} + +function Comment(text) { + var element = new Element(Comment); + if (text) { + element.text = text; + } + return element; +} + +function CData(text) { + var element = new Element(CData); + if (text) { + element.text = text; + } + return element; +} + +function ProcessingInstruction(target, text) +{ + var element = new Element(ProcessingInstruction); + element.text = target; + if (text) { + element.text = element.text + " " + text; + } + return element; +} + +function QName(text_or_uri, tag) +{ + if (tag) { + text_or_uri = sprintf("{%s}%s", text_or_uri, tag); + } + this.text = text_or_uri; +} + +QName.prototype.toString = function() { + return this.text; +}; + +function ElementTree(element) +{ + this._root = element; +} + +ElementTree.prototype.getroot = function() { + return this._root; +}; + +ElementTree.prototype._setroot = function(element) { + this._root = element; +}; + +ElementTree.prototype.parse = function(source, parser) { + if (!parser) { + parser = get_parser(constants.DEFAULT_PARSER); + parser = new parser.XMLParser(new TreeBuilder()); + } + + parser.feed(source); + this._root = parser.close(); + return this._root; +}; + +ElementTree.prototype.iter = function(tag, callback) { + this._root.iter(tag, callback); +}; + +ElementTree.prototype.find = function(path) { + return this._root.find(path); +}; + +ElementTree.prototype.findtext = function(path, defvalue) { + return this._root.findtext(path, defvalue); +}; + +ElementTree.prototype.findall = function(path) { + return this._root.findall(path); +}; + +/** + * Unlike ElementTree, we don't write to a file, we return you a string. + */ +ElementTree.prototype.write = function(options) { + var sb = []; + options = utils.merge({ + encoding: 'utf-8', + xml_declaration: null, + default_namespace: null, + method: 'xml'}, options); + + if (options.xml_declaration !== false) { + sb.push("\n"); + } + + if (options.method === "text") { + _serialize_text(sb, self._root, encoding); + } + else { + var qnames, namespaces, indent, indent_string; + var x = _namespaces(this._root, options.encoding, options.default_namespace); + qnames = x[0]; + namespaces = x[1]; + + if (options.hasOwnProperty('indent')) { + indent = 0; + indent_string = new Array(options.indent + 1).join(' '); + } + else { + indent = false; + } + + if (options.method === "xml") { + _serialize_xml(function(data) { + sb.push(data); + }, this._root, options.encoding, qnames, namespaces, indent, indent_string); + } + else { + /* TODO: html */ + throw new Error("unknown serialization method "+ options.method); + } + } + + return sb.join(""); +}; + +var _namespace_map = { + /* "well-known" namespace prefixes */ + "http://www.w3.org/XML/1998/namespace": "xml", + "http://www.w3.org/1999/xhtml": "html", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", + "http://schemas.xmlsoap.org/wsdl/": "wsdl", + /* xml schema */ + "http://www.w3.org/2001/XMLSchema": "xs", + "http://www.w3.org/2001/XMLSchema-instance": "xsi", + /* dublic core */ + "http://purl.org/dc/elements/1.1/": "dc", +}; + +function register_namespace(prefix, uri) { + if (/ns\d+$/.test(prefix)) { + throw new Error('Prefix format reserved for internal use'); + } + + if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) { + delete _namespace_map[uri]; + } + + _namespace_map[uri] = prefix; +} + + +function _escape(text, encoding, isAttribute, isText) { + if (text) { + text = text.toString(); + text = text.replace(/&/g, '&'); + text = text.replace(//g, '>'); + if (!isText) { + text = text.replace(/\n/g, ' '); + text = text.replace(/\r/g, ' '); + } + if (isAttribute) { + text = text.replace(/"/g, '"'); + } + } + return text; +} + +/* TODO: benchmark single regex */ +function _escape_attrib(text, encoding) { + return _escape(text, encoding, true); +} + +function _escape_cdata(text, encoding) { + return _escape(text, encoding, false); +} + +function _escape_text(text, encoding) { + return _escape(text, encoding, false, true); +} + +function _namespaces(elem, encoding, default_namespace) { + var qnames = {}; + var namespaces = {}; + + if (default_namespace) { + namespaces[default_namespace] = ""; + } + + function encode(text) { + return text; + } + + function add_qname(qname) { + if (qname[0] === "{") { + var tmp = qname.substring(1).split("}", 2); + var uri = tmp[0]; + var tag = tmp[1]; + var prefix = namespaces[uri]; + + if (prefix === undefined) { + prefix = _namespace_map[uri]; + if (prefix === undefined) { + prefix = "ns" + Object.keys(namespaces).length; + } + if (prefix !== "xml") { + namespaces[uri] = prefix; + } + } + + if (prefix) { + qnames[qname] = sprintf("%s:%s", prefix, tag); + } + else { + qnames[qname] = tag; + } + } + else { + if (default_namespace) { + throw new Error('cannot use non-qualified names with default_namespace option'); + } + + qnames[qname] = qname; + } + } + + + elem.iter(null, function(e) { + var i; + var tag = e.tag; + var text = e.text; + var items = e.items(); + + if (tag instanceof QName && qnames[tag.text] === undefined) { + add_qname(tag.text); + } + else if (typeof(tag) === "string") { + add_qname(tag); + } + else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) { + throw new Error('Invalid tag type for serialization: '+ tag); + } + + if (text instanceof QName && qnames[text.text] === undefined) { + add_qname(text.text); + } + + items.forEach(function(item) { + var key = item[0], + value = item[1]; + if (key instanceof QName) { + key = key.text; + } + + if (qnames[key] === undefined) { + add_qname(key); + } + + if (value instanceof QName && qnames[value.text] === undefined) { + add_qname(value.text); + } + }); + }); + return [qnames, namespaces]; +} + +function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) { + var tag = elem.tag; + var text = elem.text; + var items; + var i; + + var newlines = indent || (indent === 0); + write(Array(indent + 1).join(indent_string)); + + if (tag === Comment) { + write(sprintf("", _escape_cdata(text, encoding))); + } + else if (tag === ProcessingInstruction) { + write(sprintf("", _escape_cdata(text, encoding))); + } + else if (tag === CData) { + text = text || ''; + write(sprintf("", text)); + } + else { + tag = qnames[tag]; + if (tag === undefined) { + if (text) { + write(_escape_text(text, encoding)); + } + elem.iter(function(e) { + _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string); + }); + } + else { + write("<" + tag); + items = elem.items(); + + if (items || namespaces) { + items.sort(); // lexical order + + items.forEach(function(item) { + var k = item[0], + v = item[1]; + + if (k instanceof QName) { + k = k.text; + } + + if (v instanceof QName) { + v = qnames[v.text]; + } + else { + v = _escape_attrib(v, encoding); + } + write(sprintf(" %s=\"%s\"", qnames[k], v)); + }); + + if (namespaces) { + items = utils.items(namespaces); + items.sort(function(a, b) { return a[1] < b[1]; }); + + items.forEach(function(item) { + var k = item[1], + v = item[0]; + + if (k) { + k = ':' + k; + } + + write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding))); + }); + } + } + + if (text || elem.len()) { + if (text && text.toString().match(/^\s*$/)) { + text = null; + } + + write(">"); + if (!text && newlines) { + write("\n"); + } + + if (text) { + write(_escape_text(text, encoding)); + } + elem._children.forEach(function(e) { + _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string); + }); + + if (!text && indent) { + write(Array(indent + 1).join(indent_string)); + } + write(""); + } + else { + write(" />"); + } + } + } + + if (newlines) { + write("\n"); + } +} + +function parse(source, parser) { + var tree = new ElementTree(); + tree.parse(source, parser); + return tree; +} + +function tostring(element, options) { + return new ElementTree(element).write(options); +} + +exports.PI = ProcessingInstruction; +exports.Comment = Comment; +exports.CData = CData; +exports.ProcessingInstruction = ProcessingInstruction; +exports.SubElement = SubElement; +exports.QName = QName; +exports.ElementTree = ElementTree; +exports.ElementPath = ElementPath; +exports.Element = function(tag, attrib) { + return new Element(tag, attrib); +}; + +exports.XML = function(data) { + var et = new ElementTree(); + return et.parse(data); +}; + +exports.parse = parse; +exports.register_namespace = register_namespace; +exports.tostring = tostring; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/errors.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/errors.js new file mode 100644 index 0000000..e8742be --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/errors.js @@ -0,0 +1,31 @@ +/** + * Copyright 2011 Rackspace + * + * 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. + * + */ + +var util = require('util'); + +var sprintf = require('./sprintf').sprintf; + +function SyntaxError(token, msg) { + msg = msg || sprintf('Syntax Error at token %s', token.toString()); + this.token = token; + this.message = msg; + Error.call(this, msg); +} + +util.inherits(SyntaxError, Error); + +exports.SyntaxError = SyntaxError; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parser.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parser.js new file mode 100644 index 0000000..7307ee4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parser.js @@ -0,0 +1,33 @@ +/* + * Copyright 2011 Rackspace + * + * 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. + * + */ + +/* TODO: support node-expat C++ module optionally */ + +var util = require('util'); +var parsers = require('./parsers/index'); + +function get_parser(name) { + if (name === 'sax') { + return parsers.sax; + } + else { + throw new Error('Invalid parser: ' + name); + } +} + + +exports.get_parser = get_parser; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/index.js new file mode 100644 index 0000000..5eac5c8 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/index.js @@ -0,0 +1 @@ +exports.sax = require('./sax'); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/sax.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/sax.js new file mode 100644 index 0000000..69b0a59 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/parsers/sax.js @@ -0,0 +1,56 @@ +var util = require('util'); + +var sax = require('sax'); + +var TreeBuilder = require('./../treebuilder').TreeBuilder; + +function XMLParser(target) { + this.parser = sax.parser(true); + + this.target = (target) ? target : new TreeBuilder(); + + this.parser.onopentag = this._handleOpenTag.bind(this); + this.parser.ontext = this._handleText.bind(this); + this.parser.oncdata = this._handleCdata.bind(this); + this.parser.ondoctype = this._handleDoctype.bind(this); + this.parser.oncomment = this._handleComment.bind(this); + this.parser.onclosetag = this._handleCloseTag.bind(this); + this.parser.onerror = this._handleError.bind(this); +} + +XMLParser.prototype._handleOpenTag = function(tag) { + this.target.start(tag.name, tag.attributes); +}; + +XMLParser.prototype._handleText = function(text) { + this.target.data(text); +}; + +XMLParser.prototype._handleCdata = function(text) { + this.target.data(text); +}; + +XMLParser.prototype._handleDoctype = function(text) { +}; + +XMLParser.prototype._handleComment = function(comment) { +}; + +XMLParser.prototype._handleCloseTag = function(tag) { + this.target.end(tag); +}; + +XMLParser.prototype._handleError = function(err) { + throw err; +}; + +XMLParser.prototype.feed = function(chunk) { + this.parser.write(chunk); +}; + +XMLParser.prototype.close = function() { + this.parser.close(); + return this.target.close(); +}; + +exports.XMLParser = XMLParser; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/sprintf.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/sprintf.js new file mode 100644 index 0000000..f802c1b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/sprintf.js @@ -0,0 +1,86 @@ +/* + * Copyright 2011 Rackspace + * + * 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. + * + */ + +var cache = {}; + + +// Do any others need escaping? +var TO_ESCAPE = { + '\'': '\\\'', + '\n': '\\n' +}; + + +function populate(formatter) { + var i, type, + key = formatter, + prev = 0, + arg = 1, + builder = 'return \''; + + for (i = 0; i < formatter.length; i++) { + if (formatter[i] === '%') { + type = formatter[i + 1]; + + switch (type) { + case 's': + builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \''; + prev = i + 2; + arg++; + break; + case 'j': + builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \''; + prev = i + 2; + arg++; + break; + case '%': + builder += formatter.slice(prev, i + 1); + prev = i + 2; + i++; + break; + } + + + } else if (TO_ESCAPE[formatter[i]]) { + builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]]; + prev = i + 1; + } + } + + builder += formatter.slice(prev) + '\';'; + cache[key] = new Function(builder); +} + + +/** + * A fast version of sprintf(), which currently only supports the %s and %j. + * This caches a formatting function for each format string that is used, so + * you should only use this sprintf() will be called many times with a single + * format string and a limited number of format strings will ever be used (in + * general this means that format strings should be string literals). + * + * @param {String} formatter A format string. + * @param {...String} var_args Values that will be formatted by %s and %j. + * @return {String} The formatted output. + */ +exports.sprintf = function(formatter, var_args) { + if (!cache[formatter]) { + populate(formatter); + } + + return cache[formatter].apply(null, arguments); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/treebuilder.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/treebuilder.js new file mode 100644 index 0000000..393a98f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/treebuilder.js @@ -0,0 +1,60 @@ +function TreeBuilder(element_factory) { + this._data = []; + this._elem = []; + this._last = null; + this._tail = null; + if (!element_factory) { + /* evil circular dep */ + element_factory = require('./elementtree').Element; + } + this._factory = element_factory; +} + +TreeBuilder.prototype.close = function() { + return this._last; +}; + +TreeBuilder.prototype._flush = function() { + if (this._data) { + if (this._last !== null) { + var text = this._data.join(""); + if (this._tail) { + this._last.tail = text; + } + else { + this._last.text = text; + } + } + this._data = []; + } +}; + +TreeBuilder.prototype.data = function(data) { + this._data.push(data); +}; + +TreeBuilder.prototype.start = function(tag, attrs) { + this._flush(); + var elem = this._factory(tag, attrs); + this._last = elem; + + if (this._elem.length) { + this._elem[this._elem.length - 1].append(elem); + } + + this._elem.push(elem); + + this._tail = null; +}; + +TreeBuilder.prototype.end = function(tag) { + this._flush(); + this._last = this._elem.pop(); + if (this._last.tag !== tag) { + throw new Error("end tag mismatch"); + } + this._tail = 1; + return this._last; +}; + +exports.TreeBuilder = TreeBuilder; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/utils.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/utils.js new file mode 100644 index 0000000..b08a670 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/lib/utils.js @@ -0,0 +1,72 @@ +/** + * Copyright 2011 Rackspace + * + * 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. + * + */ + +/** + * @param {Object} hash. + * @param {Array} ignored. + */ +function items(hash, ignored) { + ignored = ignored || null; + var k, rv = []; + + function is_ignored(key) { + if (!ignored || ignored.length === 0) { + return false; + } + + return ignored.indexOf(key); + } + + for (k in hash) { + if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) { + rv.push([k, hash[k]]); + } + } + + return rv; +} + + +function findall(re, str) { + var match, matches = []; + + while ((match = re.exec(str))) { + matches.push(match); + } + + return matches; +} + +function merge(a, b) { + var c = {}, attrname; + + for (attrname in a) { + if (a.hasOwnProperty(attrname)) { + c[attrname] = a[attrname]; + } + } + for (attrname in b) { + if (b.hasOwnProperty(attrname)) { + c[attrname] = b[attrname]; + } + } + return c; +} + +exports.items = items; +exports.findall = findall; +exports.merge = merge; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/package.json new file mode 100644 index 0000000..4dcc9d9 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/package.json @@ -0,0 +1,81 @@ +{ + "_from": "elementtree@0.1.6", + "_id": "elementtree@0.1.6", + "_inBundle": true, + "_integrity": "sha1-KsTEbqMFFsjEy9teOsdBjlkt4gw=", + "_location": "/cordova-android/elementtree", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "elementtree@0.1.6", + "name": "elementtree", + "escapedName": "elementtree", + "rawSpec": "0.1.6", + "saveSpec": null, + "fetchSpec": "0.1.6" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz", + "_shasum": "2ac4c46ea30516c8c4cbdb5e3ac7418e592de20c", + "_spec": "elementtree@0.1.6", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Rackspace US, Inc." + }, + "bugs": { + "url": "https://github.com/racker/node-elementtree/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Paul Querna", + "email": "paul.querna@rackspace.com" + }, + { + "name": "Tomaz Muraus", + "email": "tomaz.muraus@rackspace.com" + } + ], + "dependencies": { + "sax": "0.3.5" + }, + "deprecated": false, + "description": "XML Serialization and Parsing module based on Python's ElementTree.", + "devDependencies": { + "whiskey": "0.8.x" + }, + "directories": { + "lib": "lib" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/racker/node-elementtree", + "keywords": [ + "xml", + "sax", + "parser", + "seralization", + "elementtree" + ], + "licenses": [ + { + "type": "Apache", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + ], + "main": "lib/elementtree.js", + "name": "elementtree", + "repository": { + "type": "git", + "url": "git://github.com/racker/node-elementtree.git" + }, + "scripts": { + "test": "make test" + }, + "version": "0.1.6" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml1.xml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml1.xml new file mode 100644 index 0000000..72c33ae --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml1.xml @@ -0,0 +1,17 @@ + + + dd + test_object_1 + 4281c348eaf83e70ddce0e07221c3d28 + 14 + application/octetstream + 2009-02-03T05:26:32.612278 + + + test_object_2 + b039efe731ad111bc1b0ef221c3849d0 + 64 + application/octetstream + 2009-02-03T05:26:32.612278 + + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml2.xml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml2.xml new file mode 100644 index 0000000..5f94bbd --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/data/xml2.xml @@ -0,0 +1,14 @@ + + + + Hello World + + + + + + + + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/test-simple.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/test-simple.js new file mode 100644 index 0000000..1fc04b8 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/elementtree/tests/test-simple.js @@ -0,0 +1,339 @@ +/** + * Copyright 2011 Rackspace + * + * 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. + * + */ + +var fs = require('fs'); +var path = require('path'); + +var sprintf = require('./../lib/sprintf').sprintf; +var et = require('elementtree'); +var XML = et.XML; +var ElementTree = et.ElementTree; +var Element = et.Element; +var SubElement = et.SubElement; +var SyntaxError = require('./../lib/errors').SyntaxError; + +function readFile(name) { + return fs.readFileSync(path.join(__dirname, '/data/', name), 'utf8'); +} + +exports['test_simplest'] = function(test, assert) { + /* Ported from */ + var Element = et.Element; + var root = Element('root'); + root.append(Element('one')); + root.append(Element('two')); + root.append(Element('three')); + assert.equal(3, root.len()); + assert.equal('one', root.getItem(0).tag); + assert.equal('two', root.getItem(1).tag); + assert.equal('three', root.getItem(2).tag); + test.finish(); +}; + + +exports['test_attribute_values'] = function(test, assert) { + var XML = et.XML; + var root = XML(''); + assert.equal('Alpha', root.attrib['alpha']); + assert.equal('Beta', root.attrib['beta']); + assert.equal('Gamma', root.attrib['gamma']); + test.finish(); +}; + + +exports['test_findall'] = function(test, assert) { + var XML = et.XML; + var root = XML(''); + + assert.equal(root.findall("c").length, 1); + assert.equal(root.findall(".//c").length, 2); + assert.equal(root.findall(".//b").length, 3); + assert.equal(root.findall(".//b")[0]._children.length, 1); + assert.equal(root.findall(".//b")[1]._children.length, 0); + assert.equal(root.findall(".//b")[2]._children.length, 0); + assert.deepEqual(root.findall('.//b')[0], root.getchildren()[0]); + + test.finish(); +}; + +exports['test_find'] = function(test, assert) { + var a = Element('a'); + var b = SubElement(a, 'b'); + var c = SubElement(a, 'c'); + + assert.deepEqual(a.find('./b/..'), a); + test.finish(); +}; + +exports['test_elementtree_find_qname'] = function(test, assert) { + var tree = new et.ElementTree(XML('')); + assert.deepEqual(tree.find(new et.QName('c')), tree.getroot()._children[2]); + test.finish(); +}; + +exports['test_attrib_ns_clear'] = function(test, assert) { + var attribNS = '{http://foo/bar}x'; + + var par = Element('par'); + par.set(attribNS, 'a'); + var child = SubElement(par, 'child'); + child.set(attribNS, 'b'); + + assert.equal('a', par.get(attribNS)); + assert.equal('b', child.get(attribNS)); + + par.clear(); + assert.equal(null, par.get(attribNS)); + assert.equal('b', child.get(attribNS)); + test.finish(); +}; + +exports['test_create_tree_and_parse_simple'] = function(test, assert) { + var i = 0; + var e = new Element('bar', {}); + var expected = "\n" + + 'ponies'; + + SubElement(e, "blah", {a: 11}); + SubElement(e, "blah", {a: 12}); + var se = et.SubElement(e, "gag", {a: '13', b: 'abc'}); + se.text = 'ponies'; + + se.itertext(function(text) { + assert.equal(text, 'ponies'); + i++; + }); + + assert.equal(i, 1); + var etree = new ElementTree(e); + var xml = etree.write(); + assert.equal(xml, expected); + test.finish(); +}; + +exports['test_write_with_options'] = function(test, assert) { + var i = 0; + var e = new Element('bar', {}); + var expected1 = "\n" + + '\n' + + ' \n' + + ' test\n' + + ' \n' + + ' \n' + + ' ponies\n' + + '\n'; + var expected2 = "\n" + + '\n' + + ' \n' + + ' test\n' + + ' \n' + + ' \n' + + ' ponies\n' + + '\n'; + + var expected3 = "\n" + + '\n' + + ' \n' + + ' Hello World\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' Test & Test & Test\n' + + ' \n' + + '\n'; + + var se1 = SubElement(e, "blah", {a: 11}); + var se2 = SubElement(se1, "baz", {d: 11}); + se2.text = 'test'; + SubElement(e, "blah", {a: 12}); + var se = et.SubElement(e, "gag", {a: '13', b: 'abc'}); + se.text = 'ponies'; + + se.itertext(function(text) { + assert.equal(text, 'ponies'); + i++; + }); + + assert.equal(i, 1); + var etree = new ElementTree(e); + var xml1 = etree.write({'indent': 4}); + var xml2 = etree.write({'indent': 2}); + assert.equal(xml1, expected1); + assert.equal(xml2, expected2); + + var file = readFile('xml2.xml'); + var etree2 = et.parse(file); + var xml3 = etree2.write({'indent': 4}); + assert.equal(xml3, expected3); + test.finish(); +}; + +exports['test_parse_and_find_2'] = function(test, assert) { + var data = readFile('xml1.xml'); + var etree = et.parse(data); + + assert.equal(etree.findall('./object').length, 2); + assert.equal(etree.findall('[@name]').length, 1); + assert.equal(etree.findall('[@name="test_container_1"]').length, 1); + assert.equal(etree.findall('[@name=\'test_container_1\']').length, 1); + assert.equal(etree.findall('./object')[0].findtext('name'), 'test_object_1'); + assert.equal(etree.findtext('./object/name'), 'test_object_1'); + assert.equal(etree.findall('.//bytes').length, 2); + assert.equal(etree.findall('*/bytes').length, 2); + assert.equal(etree.findall('*/foobar').length, 0); + + test.finish(); +}; + +exports['test_namespaced_attribute'] = function(test, assert) { + var data = readFile('xml1.xml'); + var etree = et.parse(data); + + assert.equal(etree.findall('*/bytes[@android:type="cool"]').length, 1); + + test.finish(); +} + +exports['test_syntax_errors'] = function(test, assert) { + var expressions = [ './/@bar', '[@bar', '[@foo=bar]', '[@', '/bar' ]; + var errCount = 0; + var data = readFile('xml1.xml'); + var etree = et.parse(data); + + expressions.forEach(function(expression) { + try { + etree.findall(expression); + } + catch (err) { + errCount++; + } + }); + + assert.equal(errCount, expressions.length); + test.finish(); +}; + +exports['test_register_namespace'] = function(test, assert){ + var prefix = 'TESTPREFIX'; + var namespace = 'http://seriously.unknown/namespace/URI'; + var errCount = 0; + + var etree = Element(sprintf('{%s}test', namespace)); + assert.equal(et.tostring(etree, { 'xml_declaration': false}), + sprintf('', namespace)); + + et.register_namespace(prefix, namespace); + var etree = Element(sprintf('{%s}test', namespace)); + assert.equal(et.tostring(etree, { 'xml_declaration': false}), + sprintf('<%s:test xmlns:%s="%s" />', prefix, prefix, namespace)); + + try { + et.register_namespace('ns25', namespace); + } + catch (err) { + errCount++; + } + + assert.equal(errCount, 1, 'Reserved prefix used, but exception was not thrown'); + test.finish(); +}; + +exports['test_tostring'] = function(test, assert) { + var a = Element('a'); + var b = SubElement(a, 'b'); + var c = SubElement(a, 'c'); + c.text = 543; + + assert.equal(et.tostring(a, { 'xml_declaration': false }), '543'); + assert.equal(et.tostring(c, { 'xml_declaration': false }), '543'); + test.finish(); +}; + +exports['test_escape'] = function(test, assert) { + var a = Element('a'); + var b = SubElement(a, 'b'); + b.text = '&&&&<>"\n\r'; + + assert.equal(et.tostring(a, { 'xml_declaration': false }), '&&&&<>\"\n\r'); + test.finish(); +}; + +exports['test_find_null'] = function(test, assert) { + var root = Element('root'); + var node = SubElement(root, 'node'); + var leaf = SubElement(node, 'leaf'); + leaf.text = 'ipsum'; + + assert.equal(root.find('node/leaf'), leaf); + assert.equal(root.find('no-such-node/leaf'), null); + test.finish(); +}; + +exports['test_findtext_null'] = function(test, assert) { + var root = Element('root'); + var node = SubElement(root, 'node'); + var leaf = SubElement(node, 'leaf'); + leaf.text = 'ipsum'; + + assert.equal(root.findtext('node/leaf'), 'ipsum'); + assert.equal(root.findtext('no-such-node/leaf'), null); + test.finish(); +}; + +exports['test_remove'] = function(test, assert) { + var root = Element('root'); + var node1 = SubElement(root, 'node1'); + var node2 = SubElement(root, 'node2'); + var node3 = SubElement(root, 'node3'); + + assert.equal(root.len(), 3); + + root.remove(node2); + + assert.equal(root.len(), 2); + assert.equal(root.getItem(0).tag, 'node1') + assert.equal(root.getItem(1).tag, 'node3') + + test.finish(); +}; + +exports['test_cdata_write'] = function(test, assert) { + var root, etree, xml, values, value, i; + + values = [ + 'if(0>1) then true;', + 'ponies hello', + '' + ]; + + for (i = 0; i < values.length; i++) { + value = values[i]; + + root = Element('root'); + root.append(et.CData(value)); + etree = new ElementTree(root); + xml = etree.write({'xml_declaration': false}); + + assert.equal(xml, sprintf('', value)); + } + + test.finish(); +}; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/README.md new file mode 100644 index 0000000..063cf95 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/README.md @@ -0,0 +1,377 @@ +[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies) + +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +![](oh-my-glob.gif) + +## Usage + +```javascript +var glob = require("glob") + +// options is optional +glob("**/*.js", options, function (er, files) { + // files is an array of filenames. + // If the `nonull` option is set, and nothing + // was found, then files is ["**/*.js"] + // er is an error object or null. +}) +``` + +## Glob Primer + +"Globs" are the patterns you type when you do stuff like `ls *.js` on +the command line, or put `build/*` in a `.gitignore` file. + +Before parsing the path part patterns, braced sections are expanded +into a set. Braced sections start with `{` and end with `}`, with any +number of comma-delimited sections within. Braced sections may contain +slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. + +The following characters have special magic meaning when used in a +path portion: + +* `*` Matches 0 or more characters in a single path portion +* `?` Matches 1 character +* `[...]` Matches a range of characters, similar to a RegExp range. + If the first character of the range is `!` or `^` then it matches + any character not in the range. +* `!(pattern|pattern|pattern)` Matches anything that does not match + any of the patterns provided. +* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the + patterns provided. +* `+(pattern|pattern|pattern)` Matches one or more occurrences of the + patterns provided. +* `*(a|b|c)` Matches zero or more occurrences of the patterns provided +* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns + provided +* `**` If a "globstar" is alone in a path portion, then it matches + zero or more directories and subdirectories searching for matches. + It does not crawl symlinked directories. + +### Dots + +If a file or directory path portion has a `.` as the first character, +then it will not match any glob pattern unless that pattern's +corresponding path part also has a `.` as its first character. + +For example, the pattern `a/.*/c` would match the file at `a/.b/c`. +However the pattern `a/*/c` would not, because `*` does not start with +a dot character. + +You can make glob treat dots as normal characters by setting +`dot:true` in the options. + +### Basename Matching + +If you set `matchBase:true` in the options, and the pattern has no +slashes in it, then it will seek for any file anywhere in the tree +with a matching basename. For example, `*.js` would match +`test/simple/basic.js`. + +### Negation + +The intent for negation would be for a pattern starting with `!` to +match everything that *doesn't* match the supplied pattern. However, +the implementation is weird, and for the time being, this should be +avoided. The behavior is deprecated in version 5, and will be removed +entirely in version 6. + +### Empty Sets + +If no matching files are found, then an empty array is returned. This +differs from the shell, where the pattern itself is returned. For +example: + + $ echo a*s*d*f + a*s*d*f + +To get the bash-style behavior, set the `nonull:true` in the options. + +### See Also: + +* `man sh` +* `man bash` (Search for "Pattern Matching") +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob.hasMagic(pattern, [options]) + +Returns `true` if there are any special characters in the pattern, and +`false` otherwise. + +Note that the options affect the results. If `noext:true` is set in +the options object, then `+(a|b)` will not be considered a magic +pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` +then that is considered magical, unless `nobrace:true` is set in the +options. + +## glob(pattern, [options], cb) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* `cb` {Function} + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* return: {Array} filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instantiating the `glob.Glob` class. + +```javascript +var Glob = require("glob").Glob +var mg = new Glob(pattern, options, cb) +``` + +It's an EventEmitter, and starts walking the filesystem to find matches +immediately. + +### new glob.Glob(pattern, [options], [cb]) + +* `pattern` {String} pattern to search for +* `options` {Object} +* `cb` {Function} Called when an error occurs, or matches are found + * `err` {Error | null} + * `matches` {Array} filenames found matching the pattern + +Note that if the `sync` flag is set in the options, then matches will +be immediately available on the `g.found` member. + +### Properties + +* `minimatch` The minimatch object that the glob uses. +* `options` The options object passed in. +* `aborted` Boolean which is set to true when calling `abort()`. There + is no way at this time to continue a glob search after aborting, but + you can re-use the statCache to avoid having to duplicate syscalls. +* `cache` Convenience object. Each field has the following possible + values: + * `false` - Path does not exist + * `true` - Path exists + * `'DIR'` - Path exists, and is not a directory + * `'FILE'` - Path exists, and is a directory + * `[file, entries, ...]` - Path exists, is a directory, and the + array value is the results of `fs.readdir` +* `statCache` Cache of `fs.stat` results, to prevent statting the same + path multiple times. +* `symlinks` A record of which paths are symbolic links, which is + relevant in resolving `**` patterns. +* `realpathCache` An optional object which is passed to `fs.realpath` + to minimize unnecessary syscalls. It is stored on the instantiated + Glob object, and may be re-used. + +### Events + +* `end` When the matching is finished, this is emitted with all the + matches found. If the `nonull` option is set, and no match was found, + then the `matches` list contains the original pattern. The matches + are sorted, unless the `nosort` flag is set. +* `match` Every time a match is found, this is emitted with the matched. +* `error` Emitted when an unexpected error is encountered, or whenever + any fs error occurs if `options.strict` is set. +* `abort` When `abort()` is called, this event is raised. + +### Methods + +* `pause` Temporarily stop the search +* `resume` Resume the search +* `abort` Stop the search forever + +### Options + +All the options that can be passed to Minimatch can also be passed to +Glob to change pattern matching behavior. Also, some have been added, +or have glob-specific ramifications. + +All options are false by default, unless otherwise noted. + +All options are added to the Glob object, as well. + +If you are running many `glob` operations, you can pass a Glob object +as the `options` argument to a subsequent operation to shortcut some +`stat` and `readdir` calls. At the very least, you may pass in shared +`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that +parallel glob operations will be sped up by sharing information about +the filesystem. + +* `cwd` The current working directory in which to search. Defaults + to `process.cwd()`. +* `root` The place where patterns starting with `/` will be mounted + onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix + systems, and `C:\` or some such on Windows.) +* `dot` Include `.dot` files in normal matches and `globstar` matches. + Note that an explicit dot in a portion of the pattern will always + match dot files. +* `nomount` By default, a pattern starting with a forward-slash will be + "mounted" onto the root setting, so that a valid filesystem path is + returned. Set this flag to disable that behavior. +* `mark` Add a `/` character to directory matches. Note that this + requires additional stat calls. +* `nosort` Don't sort the results. +* `stat` Set to true to stat *all* results. This reduces performance + somewhat, and is completely unnecessary, unless `readdir` is presumed + to be an untrustworthy indicator of file existence. +* `silent` When an unusual error is encountered when attempting to + read a directory, a warning will be printed to stderr. Set the + `silent` option to true to suppress these warnings. +* `strict` When an unusual error is encountered when attempting to + read a directory, the process will just continue on in search of + other matches. Set the `strict` option to raise an error in these + cases. +* `cache` See `cache` property above. Pass in a previously generated + cache object to save some fs calls. +* `statCache` A cache of results of filesystem information, to prevent + unnecessary stat calls. While it should not normally be necessary + to set this, you may pass the statCache from one glob() call to the + options object of another, if you know that the filesystem will not + change between calls. (See "Race Conditions" below.) +* `symlinks` A cache of known symbolic links. You may pass in a + previously generated `symlinks` object to save `lstat` calls when + resolving `**` matches. +* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. +* `nounique` In some cases, brace-expanded patterns can result in the + same file showing up multiple times in the result set. By default, + this implementation prevents duplicates in the result set. Set this + flag to disable that behavior. +* `nonull` Set to never return an empty set, instead returning a set + containing the pattern itself. This is the default in glob(3). +* `debug` Set to enable debug logging in minimatch and glob. +* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. +* `noglobstar` Do not match `**` against multiple filenames. (Ie, + treat it as a normal `*` instead.) +* `noext` Do not match `+(a|b)` "extglob" patterns. +* `nocase` Perform a case-insensitive match. Note: on + case-insensitive filesystems, non-magic patterns will match by + default, since `stat` and `readdir` will not raise errors. +* `matchBase` Perform a basename-only match if the pattern does not + contain any slash characters. That is, `*.js` would be treated as + equivalent to `**/*.js`, matching all js files in all directories. +* `nodir` Do not match directories, only files. (Note: to match + *only* directories, simply put a `/` at the end of the pattern.) +* `ignore` Add a pattern or an array of patterns to exclude matches. +* `follow` Follow symlinked directories when expanding `**` patterns. + Note that this can result in a lot of duplicate references in the + presence of cyclic links. +* `realpath` Set to true to call `fs.realpath` on all of the results. + In the case of a symlink that cannot be resolved, the full absolute + path to the matched entry is returned (though it will usually be a + broken symlink) +* `nonegate` Suppress deprecated `negate` behavior. (See below.) + Default=true +* `nocomment` Suppress deprecated `comment` behavior. (See below.) + Default=true + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between node-glob and other +implementations, and are intentional. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.3, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +Note that symlinked directories are not crawled as part of a `**`, +though their contents may match against subsequent portions of the +pattern. This prevents infinite loops and duplicates and the like. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then glob returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. + +### Comments and Negation + +**Note**: In version 5 of this module, negation and comments are +**disabled** by default. You can explicitly set `nonegate:false` or +`nocomment:false` to re-enable them. They are going away entirely in +version 6. + +The intent for negation would be for a pattern starting with `!` to +match everything that *doesn't* match the supplied pattern. However, +the implementation is weird. It is better to use the `ignore` option +to set a pattern or set of patterns to exclude from matches. If you +want the "everything except *x*" type of behavior, you can use `**` as +the main pattern, and set an `ignore` for the things to exclude. + +The comments feature is added in minimatch, primarily to more easily +support use cases like ignore files, where a `#` at the start of a +line makes the pattern "empty". However, in the context of a +straightforward filesystem globber, "comments" don't make much sense. + +## Windows + +**Please only use forward-slashes in glob expressions.** + +Though windows uses either `/` or `\` as its path separator, only `/` +characters are used by this glob implementation. You must use +forward-slashes **only** in glob expressions. Back-slashes will always +be interpreted as escape characters, not path separators. + +Results from absolute patterns such as `/foo/*` are mounted onto the +root setting using `path.join`. On windows, this will by default result +in `/foo/*` matching `C:\foo\bar.txt`. + +## Race Conditions + +Glob searching, by its very nature, is susceptible to race conditions, +since it relies on directory walking and such. + +As a result, it is possible that a file that exists when glob looks for +it may have been deleted or modified by the time it returns the result. + +As part of its internal implementation, this program caches all stat +and readdir calls that it makes, in order to cut down on system +overhead. However, this also makes it even more susceptible to races, +especially if the cache or statCache objects are reused between glob +calls. + +Users are thus advised not to use a glob result as a guarantee of +filesystem state in the face of rapid changes. For the vast majority +of operations, this is never a problem. + +## Contributing + +Any change to behavior (including bugfixes) must come with a test. + +Patches that fail tests or reduce performance will be rejected. + +``` +# to run tests +npm test + +# to re-generate test fixtures +npm run test-regen + +# to benchmark against bash/zsh +npm run bench + +# to profile javascript +npm run prof +``` diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/common.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/common.js new file mode 100644 index 0000000..e36a631 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/common.js @@ -0,0 +1,245 @@ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/glob.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/glob.js new file mode 100644 index 0000000..022d2ac --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/glob.js @@ -0,0 +1,752 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/package.json new file mode 100644 index 0000000..4f1aac1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/package.json @@ -0,0 +1,76 @@ +{ + "_from": "glob@^5.0.13", + "_id": "glob@5.0.15", + "_inBundle": true, + "_integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "_location": "/cordova-android/glob", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "glob@^5.0.13", + "name": "glob", + "escapedName": "glob", + "rawSpec": "^5.0.13", + "saveSpec": null, + "fetchSpec": "^5.0.13" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "_shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1", + "_spec": "glob@^5.0.13", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "bundleDependencies": false, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "deprecated": false, + "description": "a little globber", + "devDependencies": { + "mkdirp": "0", + "rimraf": "^2.2.8", + "tap": "^1.1.4", + "tick": "0.0.6" + }, + "engines": { + "node": "*" + }, + "files": [ + "glob.js", + "sync.js", + "common.js" + ], + "homepage": "https://github.com/isaacs/node-glob#readme", + "license": "ISC", + "main": "glob.js", + "name": "glob", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "scripts": { + "bench": "bash benchmark.sh", + "benchclean": "node benchclean.js", + "prepublish": "npm run benchclean", + "prof": "bash prof.sh && cat profile.txt", + "profclean": "rm -f v8.log profile.txt", + "test": "tap test/*.js --cov", + "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js" + }, + "version": "5.0.15" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/sync.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/sync.js new file mode 100644 index 0000000..09883d2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/glob/sync.js @@ -0,0 +1,460 @@ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/LICENSE new file mode 100644 index 0000000..05eeeb8 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/README.md new file mode 100644 index 0000000..6dc8929 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/README.md @@ -0,0 +1,37 @@ +# inflight + +Add callbacks to requests in flight to avoid async duplication + +## USAGE + +```javascript +var inflight = require('inflight') + +// some request that does some stuff +function req(key, callback) { + // key is any random string. like a url or filename or whatever. + // + // will return either a falsey value, indicating that the + // request for this key is already in flight, or a new callback + // which when called will call all callbacks passed to inflightk + // with the same key + callback = inflight(key, callback) + + // If we got a falsey value back, then there's already a req going + if (!callback) return + + // this is where you'd fetch the url or whatever + // callback is also once()-ified, so it can safely be assigned + // to multiple events etc. First call wins. + setTimeout(function() { + callback(null, key) + }, 100) +} + +// only assigns a single setTimeout +// when it dings, all cbs get called +req('foo', cb1) +req('foo', cb2) +req('foo', cb3) +req('foo', cb4) +``` diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/inflight.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/inflight.js new file mode 100644 index 0000000..48202b3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/inflight.js @@ -0,0 +1,54 @@ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/package.json new file mode 100644 index 0000000..6fb0823 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inflight/package.json @@ -0,0 +1,59 @@ +{ + "_from": "inflight@^1.0.4", + "_id": "inflight@1.0.6", + "_inBundle": true, + "_integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "_location": "/cordova-android/inflight", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "inflight@^1.0.4", + "name": "inflight", + "escapedName": "inflight", + "rawSpec": "^1.0.4", + "saveSpec": null, + "fetchSpec": "^1.0.4" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "_shasum": "49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "_spec": "inflight@^1.0.4", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/inflight/issues" + }, + "bundleDependencies": false, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + }, + "deprecated": false, + "description": "Add callbacks to requests in flight to avoid async duplication", + "devDependencies": { + "tap": "^7.1.2" + }, + "files": [ + "inflight.js" + ], + "homepage": "https://github.com/isaacs/inflight", + "license": "ISC", + "main": "inflight.js", + "name": "inflight", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/inflight.git" + }, + "scripts": { + "test": "tap test.js --100" + }, + "version": "1.0.6" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits.js new file mode 100644 index 0000000..3b94763 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits.js @@ -0,0 +1,7 @@ +try { + var util = require('util'); + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + module.exports = require('./inherits_browser.js'); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits_browser.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/package.json new file mode 100644 index 0000000..41a09ac --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/inherits/package.json @@ -0,0 +1,62 @@ +{ + "_from": "inherits@2", + "_id": "inherits@2.0.3", + "_inBundle": true, + "_integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "_location": "/cordova-android/inherits", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "inherits@2", + "name": "inherits", + "escapedName": "inherits", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "_shasum": "633c2c83e3da42a502f52466022480f4208261de", + "_spec": "inherits@2", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "browser": "./inherits_browser.js", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "devDependencies": { + "tap": "^7.1.0" + }, + "files": [ + "inherits.js", + "inherits_browser.js" + ], + "homepage": "https://github.com/isaacs/inherits#readme", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "license": "ISC", + "main": "./inherits.js", + "name": "inherits", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits.git" + }, + "scripts": { + "test": "node test" + }, + "version": "2.0.3" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/README.md new file mode 100644 index 0000000..ad72b81 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/README.md @@ -0,0 +1,209 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instantiating the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself if this option is set. When not set, an empty list +is returned if there are no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/minimatch.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/minimatch.js new file mode 100644 index 0000000..5b5f8cf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/minimatch.js @@ -0,0 +1,923 @@ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/package.json new file mode 100644 index 0000000..4706bb5 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/minimatch/package.json @@ -0,0 +1,65 @@ +{ + "_from": "minimatch@^3.0.0", + "_id": "minimatch@3.0.4", + "_inBundle": true, + "_integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "_location": "/cordova-android/minimatch", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "minimatch@^3.0.0", + "name": "minimatch", + "escapedName": "minimatch", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "_shasum": "5166e286457f03306064be5497e8dbb0c3d32083", + "_spec": "minimatch@^3.0.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "bundleDependencies": false, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "deprecated": false, + "description": "a glob matcher in javascript", + "devDependencies": { + "tap": "^10.3.2" + }, + "engines": { + "node": "*" + }, + "files": [ + "minimatch.js" + ], + "homepage": "https://github.com/isaacs/minimatch#readme", + "license": "ISC", + "main": "minimatch.js", + "name": "minimatch", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --cov" + }, + "version": "3.0.4" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/README.md new file mode 100644 index 0000000..5aba088 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/README.md @@ -0,0 +1,209 @@ +If you want to write an option parser, and have it be good, there are +two ways to do it. The Right Way, and the Wrong Way. + +The Wrong Way is to sit down and write an option parser. We've all done +that. + +The Right Way is to write some complex configurable program with so many +options that you go half-insane just trying to manage them all, and put +it off with duct-tape solutions until you see exactly to the core of the +problem, and finally snap and write an awesome option parser. + +If you want to write an option parser, don't write an option parser. +Write a package manager, or a source control system, or a service +restarter, or an operating system. You probably won't end up with a +good one of those, but if you don't give up, and you are relentless and +diligent enough in your procrastination, you may just end up with a very +nice option parser. + +## USAGE + + // my-program.js + var nopt = require("nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + , "many" : [String, Array] + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag"] + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + console.log(parsed) + +This would give you support for any of the following: + +```bash +$ node my-program.js --foo "blerp" --no-flag +{ "foo" : "blerp", "flag" : false } + +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag +{ bar: 7, foo: "Mr. Hand", flag: true } + +$ node my-program.js --foo "blerp" -f -----p +{ foo: "blerp", flag: true, pick: true } + +$ node my-program.js -fp --foofoo +{ foo: "Mr. Foo", flag: true, pick: true } + +$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } + +$ node my-program.js --blatzk -fp # unknown opts are ok. +{ blatzk: true, flag: true, pick: true } + +$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value +{ blatzk: 1000, flag: true, pick: true } + +$ node my-program.js --no-blatzk -fp # unless they start with "no-" +{ blatzk: false, flag: true, pick: true } + +$ node my-program.js --baz b/a/z # known paths are resolved. +{ baz: "/Users/isaacs/b/a/z" } + +# if Array is one of the types, then it can take many +# values, and will always be an array. The other types provided +# specify what types are allowed in the list. + +$ node my-program.js --many 1 --many null --many foo +{ many: ["1", "null", "foo"] } + +$ node my-program.js --many foo +{ many: ["foo"] } +``` + +Read the tests at the bottom of `lib/nopt.js` for more examples of +what this puppy can do. + +## Types + +The following types are supported, and defined on `nopt.typeDefs` + +* String: A normal string. No parsing is done. +* path: A file system path. Gets resolved against cwd if not absolute. +* url: A url. If it doesn't parse, it isn't accepted. +* Number: Must be numeric. +* Date: Must parse as a date. If it does, and `Date` is one of the options, + then it will return a Date object, not a string. +* Boolean: Must be either `true` or `false`. If an option is a boolean, + then it does not need a value, and its presence will imply `true` as + the value. To negate boolean flags, do `--no-whatever` or `--whatever + false` +* NaN: Means that the option is strictly not allowed. Any value will + fail. +* Stream: An object matching the "Stream" class in node. Valuable + for use when validating programmatically. (npm uses this to let you + supply any WriteStream on the `outfd` and `logfd` config options.) +* Array: If `Array` is specified as one of the types, then the value + will be parsed as a list of options. This means that multiple values + can be specified, and that the value will always be an array. + +If a type is an array of values not on this list, then those are +considered valid values. For instance, in the example above, the +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, +and any other value will be rejected. + +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be +interpreted as their JavaScript equivalents. + +You can also mix types and values, or multiple types, in a list. For +instance `{ blah: [Number, null] }` would allow a value to be set to +either a Number or null. When types are ordered, this implies a +preference, and the first type that can be used to properly interpret +the value will be used. + +To define a new type, add it to `nopt.typeDefs`. Each item in that +hash is an object with a `type` member and a `validate` method. The +`type` member is an object that matches what goes in the type list. The +`validate` method is a function that gets called with `validate(data, +key, val)`. Validate methods should assign `data[key]` to the valid +value of `val` if it can be handled properly, or return boolean +`false` if it cannot. + +You can also call `nopt.clean(data, types, typeDefs)` to clean up a +config object and remove its invalid properties. + +## Error Handling + +By default, nopt outputs a warning to standard error when invalid +options are found. You can change this behavior by assigning a method +to `nopt.invalidHandler`. This method will be called with +the offending `nopt.invalidHandler(key, val, types)`. + +If no `nopt.invalidHandler` is assigned, then it will console.error +its whining. If it is assigned to boolean `false` then the warning is +suppressed. + +## Abbreviations + +Yes, they are supported. If you define options like this: + +```javascript +{ "foolhardyelephants" : Boolean +, "pileofmonkeys" : Boolean } +``` + +Then this will work: + +```bash +node program.js --foolhar --pil +node program.js --no-f --pileofmon +# etc. +``` + +## Shorthands + +Shorthands are a hash of shorter option names to a snippet of args that +they expand to. + +If multiple one-character shorthands are all combined, and the +combination does not unambiguously match any other option or shorthand, +then they will be broken up into their constituent parts. For example: + +```json +{ "s" : ["--loglevel", "silent"] +, "g" : "--global" +, "f" : "--force" +, "p" : "--parseable" +, "l" : "--long" +} +``` + +```bash +npm ls -sgflp +# just like doing this: +npm ls --loglevel silent --global --force --long --parseable +``` + +## The Rest of the args + +The config object returned by nopt is given a special member called +`argv`, which is an object with the following fields: + +* `remain`: The remaining args after all the parsing has occurred. +* `original`: The args as they originally appeared. +* `cooked`: The args after flags and shorthands are expanded. + +## Slicing + +Node programs are called with more or less the exact argv as it appears +in C land, after the v8 and node-specific options have been plucked off. +As such, `argv[0]` is always `node` and `argv[1]` is always the +JavaScript program being run. + +That's usually not very useful to you. So they're sliced off by +default. If you want them, then you can pass in `0` as the last +argument, or any other number that you'd like to slice off the start of +the list. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/bin/nopt.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/bin/nopt.js new file mode 100644 index 0000000..3232d4c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/bin/nopt.js @@ -0,0 +1,54 @@ +#!/usr/bin/env node +var nopt = require("../lib/nopt") + , path = require("path") + , types = { num: Number + , bool: Boolean + , help: Boolean + , list: Array + , "num-list": [Number, Array] + , "str-list": [String, Array] + , "bool-list": [Boolean, Array] + , str: String + , clear: Boolean + , config: Boolean + , length: Number + , file: path + } + , shorthands = { s: [ "--str", "astring" ] + , b: [ "--bool" ] + , nb: [ "--no-bool" ] + , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ] + , "?": ["--help"] + , h: ["--help"] + , H: ["--help"] + , n: [ "--num", "125" ] + , c: ["--config"] + , l: ["--length"] + , f: ["--file"] + } + , parsed = nopt( types + , shorthands + , process.argv + , 2 ) + +console.log("parsed", parsed) + +if (parsed.help) { + console.log("") + console.log("nopt cli tester") + console.log("") + console.log("types") + console.log(Object.keys(types).map(function M (t) { + var type = types[t] + if (Array.isArray(type)) { + return [t, type.map(function (type) { return type.name })] + } + return [t, type && type.name] + }).reduce(function (s, i) { + s[i[0]] = i[1] + return s + }, {})) + console.log("") + console.log("shorthands") + console.log(shorthands) +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/examples/my-program.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/examples/my-program.js new file mode 100644 index 0000000..142447e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/examples/my-program.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +//process.env.DEBUG_NOPT = 1 + +// my-program.js +var nopt = require("../lib/nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag", "true"] + , "g" : ["--flag"] + , "s" : "--flag" + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + +console.log("parsed =\n"+ require("util").inspect(parsed)) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/lib/nopt.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/lib/nopt.js new file mode 100644 index 0000000..5309a00 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/lib/nopt.js @@ -0,0 +1,414 @@ +// info about each config option. + +var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG + ? function () { console.error.apply(console, arguments) } + : function () {} + +var url = require("url") + , path = require("path") + , Stream = require("stream").Stream + , abbrev = require("abbrev") + +module.exports = exports = nopt +exports.clean = clean + +exports.typeDefs = + { String : { type: String, validate: validateString } + , Boolean : { type: Boolean, validate: validateBoolean } + , url : { type: url, validate: validateUrl } + , Number : { type: Number, validate: validateNumber } + , path : { type: path, validate: validatePath } + , Stream : { type: Stream, validate: validateStream } + , Date : { type: Date, validate: validateDate } + } + +function nopt (types, shorthands, args, slice) { + args = args || process.argv + types = types || {} + shorthands = shorthands || {} + if (typeof slice !== "number") slice = 2 + + debug(types, shorthands, args, slice) + + args = args.slice(slice) + var data = {} + , key + , remain = [] + , cooked = args + , original = args.slice(0) + + parse(args, data, remain, types, shorthands) + // now data is full + clean(data, types, exports.typeDefs) + data.argv = {remain:remain,cooked:cooked,original:original} + Object.defineProperty(data.argv, 'toString', { value: function () { + return this.original.map(JSON.stringify).join(" ") + }, enumerable: false }) + return data +} + +function clean (data, types, typeDefs) { + typeDefs = typeDefs || exports.typeDefs + var remove = {} + , typeDefault = [false, true, null, String, Array] + + Object.keys(data).forEach(function (k) { + if (k === "argv") return + var val = data[k] + , isArray = Array.isArray(val) + , type = types[k] + if (!isArray) val = [val] + if (!type) type = typeDefault + if (type === Array) type = typeDefault.concat(Array) + if (!Array.isArray(type)) type = [type] + + debug("val=%j", val) + debug("types=", type) + val = val.map(function (val) { + // if it's an unknown value, then parse false/true/null/numbers/dates + if (typeof val === "string") { + debug("string %j", val) + val = val.trim() + if ((val === "null" && ~type.indexOf(null)) + || (val === "true" && + (~type.indexOf(true) || ~type.indexOf(Boolean))) + || (val === "false" && + (~type.indexOf(false) || ~type.indexOf(Boolean)))) { + val = JSON.parse(val) + debug("jsonable %j", val) + } else if (~type.indexOf(Number) && !isNaN(val)) { + debug("convert to number", val) + val = +val + } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) { + debug("convert to date", val) + val = new Date(val) + } + } + + if (!types.hasOwnProperty(k)) { + return val + } + + // allow `--no-blah` to set 'blah' to null if null is allowed + if (val === false && ~type.indexOf(null) && + !(~type.indexOf(false) || ~type.indexOf(Boolean))) { + val = null + } + + var d = {} + d[k] = val + debug("prevalidated val", d, val, types[k]) + if (!validate(d, k, val, types[k], typeDefs)) { + if (exports.invalidHandler) { + exports.invalidHandler(k, val, types[k], data) + } else if (exports.invalidHandler !== false) { + debug("invalid: "+k+"="+val, types[k]) + } + return remove + } + debug("validated val", d, val, types[k]) + return d[k] + }).filter(function (val) { return val !== remove }) + + if (!val.length) delete data[k] + else if (isArray) { + debug(isArray, data[k], val) + data[k] = val + } else data[k] = val[0] + + debug("k=%s val=%j", k, val, data[k]) + }) +} + +function validateString (data, k, val) { + data[k] = String(val) +} + +function validatePath (data, k, val) { + if (val === true) return false + if (val === null) return true + + val = String(val) + var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\// + if (val.match(homePattern) && process.env.HOME) { + val = path.resolve(process.env.HOME, val.substr(2)) + } + data[k] = path.resolve(String(val)) + return true +} + +function validateNumber (data, k, val) { + debug("validate Number %j %j %j", k, val, isNaN(val)) + if (isNaN(val)) return false + data[k] = +val +} + +function validateDate (data, k, val) { + debug("validate Date %j %j %j", k, val, Date.parse(val)) + var s = Date.parse(val) + if (isNaN(s)) return false + data[k] = new Date(val) +} + +function validateBoolean (data, k, val) { + if (val instanceof Boolean) val = val.valueOf() + else if (typeof val === "string") { + if (!isNaN(val)) val = !!(+val) + else if (val === "null" || val === "false") val = false + else val = true + } else val = !!val + data[k] = val +} + +function validateUrl (data, k, val) { + val = url.parse(String(val)) + if (!val.host) return false + data[k] = val.href +} + +function validateStream (data, k, val) { + if (!(val instanceof Stream)) return false + data[k] = val +} + +function validate (data, k, val, type, typeDefs) { + // arrays are lists of types. + if (Array.isArray(type)) { + for (var i = 0, l = type.length; i < l; i ++) { + if (type[i] === Array) continue + if (validate(data, k, val, type[i], typeDefs)) return true + } + delete data[k] + return false + } + + // an array of anything? + if (type === Array) return true + + // NaN is poisonous. Means that something is not allowed. + if (type !== type) { + debug("Poison NaN", k, val, type) + delete data[k] + return false + } + + // explicit list of values + if (val === type) { + debug("Explicitly allowed %j", val) + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + return true + } + + // now go through the list of typeDefs, validate against each one. + var ok = false + , types = Object.keys(typeDefs) + for (var i = 0, l = types.length; i < l; i ++) { + debug("test type %j %j %j", k, val, types[i]) + var t = typeDefs[types[i]] + if (t && type === t.type) { + var d = {} + ok = false !== t.validate(d, k, val) + val = d[k] + if (ok) { + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + break + } + } + } + debug("OK? %j (%j %j %j)", ok, k, val, types[i]) + + if (!ok) delete data[k] + return ok +} + +function parse (args, data, remain, types, shorthands) { + debug("parse", args, data, remain) + + var key = null + , abbrevs = abbrev(Object.keys(types)) + , shortAbbr = abbrev(Object.keys(shorthands)) + + for (var i = 0; i < args.length; i ++) { + var arg = args[i] + debug("arg", arg) + + if (arg.match(/^-{2,}$/)) { + // done with keys. + // the rest are args. + remain.push.apply(remain, args.slice(i + 1)) + args[i] = "--" + break + } + var hadEq = false + if (arg.charAt(0) === "-" && arg.length > 1) { + if (arg.indexOf("=") !== -1) { + hadEq = true + var v = arg.split("=") + arg = v.shift() + v = v.join("=") + args.splice.apply(args, [i, 1].concat([arg, v])) + } + + // see if it's a shorthand + // if so, splice and back up to re-parse it. + var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs) + debug("arg=%j shRes=%j", arg, shRes) + if (shRes) { + debug(arg, shRes) + args.splice.apply(args, [i, 1].concat(shRes)) + if (arg !== shRes[0]) { + i -- + continue + } + } + arg = arg.replace(/^-+/, "") + var no = null + while (arg.toLowerCase().indexOf("no-") === 0) { + no = !no + arg = arg.substr(3) + } + + if (abbrevs[arg]) arg = abbrevs[arg] + + var isArray = types[arg] === Array || + Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 + + // allow unknown things to be arrays if specified multiple times. + if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) { + if (!Array.isArray(data[arg])) + data[arg] = [data[arg]] + isArray = true + } + + var val + , la = args[i + 1] + + var isBool = typeof no === 'boolean' || + types[arg] === Boolean || + Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || + (typeof types[arg] === 'undefined' && !hadEq) || + (la === "false" && + (types[arg] === null || + Array.isArray(types[arg]) && ~types[arg].indexOf(null))) + + if (isBool) { + // just set and move along + val = !no + // however, also support --bool true or --bool false + if (la === "true" || la === "false") { + val = JSON.parse(la) + la = null + if (no) val = !val + i ++ + } + + // also support "foo":[Boolean, "bar"] and "--foo bar" + if (Array.isArray(types[arg]) && la) { + if (~types[arg].indexOf(la)) { + // an explicit type + val = la + i ++ + } else if ( la === "null" && ~types[arg].indexOf(null) ) { + // null allowed + val = null + i ++ + } else if ( !la.match(/^-{2,}[^-]/) && + !isNaN(la) && + ~types[arg].indexOf(Number) ) { + // number + val = +la + i ++ + } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { + // string + val = la + i ++ + } + } + + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + continue + } + + if (types[arg] === String && la === undefined) + la = "" + + if (la && la.match(/^-{2,}$/)) { + la = undefined + i -- + } + + val = la === undefined ? true : la + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + i ++ + continue + } + remain.push(arg) + } +} + +function resolveShort (arg, shorthands, shortAbbr, abbrevs) { + // handle single-char shorthands glommed together, like + // npm ls -glp, but only if there is one dash, and only if + // all of the chars are single-char shorthands, and it's + // not a match to some other abbrev. + arg = arg.replace(/^-+/, '') + + // if it's an exact known option, then don't go any further + if (abbrevs[arg] === arg) + return null + + // if it's an exact known shortopt, same deal + if (shorthands[arg]) { + // make it an array, if it's a list of words + if (shorthands[arg] && !Array.isArray(shorthands[arg])) + shorthands[arg] = shorthands[arg].split(/\s+/) + + return shorthands[arg] + } + + // first check to see if this arg is a set of single-char shorthands + var singles = shorthands.___singles + if (!singles) { + singles = Object.keys(shorthands).filter(function (s) { + return s.length === 1 + }).reduce(function (l,r) { + l[r] = true + return l + }, {}) + shorthands.___singles = singles + debug('shorthand singles', singles) + } + + var chrs = arg.split("").filter(function (c) { + return singles[c] + }) + + if (chrs.join("") === arg) return chrs.map(function (c) { + return shorthands[c] + }).reduce(function (l, r) { + return l.concat(r) + }, []) + + + // if it's an arg abbrev, and not a literal shorthand, then prefer the arg + if (abbrevs[arg] && !shorthands[arg]) + return null + + // if it's an abbr for a shorthand, then use that + if (shortAbbr[arg]) + arg = shortAbbr[arg] + + // make it an array, if it's a list of words + if (shorthands[arg] && !Array.isArray(shorthands[arg])) + shorthands[arg] = shorthands[arg].split(/\s+/) + + return shorthands[arg] +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/package.json new file mode 100644 index 0000000..400a93b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/package.json @@ -0,0 +1,60 @@ +{ + "_from": "nopt@3.0.1", + "_id": "nopt@3.0.1", + "_inBundle": true, + "_integrity": "sha1-vOXEJEajKR9HYio3CrvxWPu6y/0=", + "_location": "/cordova-android/nopt", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "nopt@3.0.1", + "name": "nopt", + "escapedName": "nopt", + "rawSpec": "3.0.1", + "saveSpec": null, + "fetchSpec": "3.0.1" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "_shasum": "bce5c42446a3291f47622a370abbf158fbbacbfd", + "_spec": "nopt@3.0.1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bin": { + "nopt": "./bin/nopt.js" + }, + "bugs": { + "url": "https://github.com/isaacs/nopt/issues" + }, + "bundleDependencies": false, + "dependencies": { + "abbrev": "1" + }, + "deprecated": false, + "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", + "devDependencies": { + "tap": "~0.4.8" + }, + "homepage": "https://github.com/isaacs/nopt#readme", + "license": { + "type": "MIT", + "url": "https://github.com/isaacs/nopt/raw/master/LICENSE" + }, + "main": "lib/nopt.js", + "name": "nopt", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/isaacs/nopt.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "version": "3.0.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/test/basic.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/test/basic.js new file mode 100644 index 0000000..2f9088c --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/nopt/test/basic.js @@ -0,0 +1,251 @@ +var nopt = require("../") + , test = require('tap').test + + +test("passing a string results in a string", function (t) { + var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0) + t.same(parsed.key, "myvalue") + t.end() +}) + +// https://github.com/npm/nopt/issues/31 +test("Empty String results in empty string, not true", function (t) { + var parsed = nopt({ empty: String }, {}, ["--empty"], 0) + t.same(parsed.empty, "") + t.end() +}) + +test("~ path is resolved to $HOME", function (t) { + var path = require("path") + if (!process.env.HOME) process.env.HOME = "/tmp" + var parsed = nopt({key: path}, {}, ["--key=~/val"], 0) + t.same(parsed.key, path.resolve(process.env.HOME, "val")) + t.end() +}) + +// https://github.com/npm/nopt/issues/24 +test("Unknown options are not parsed as numbers", function (t) { + var parsed = nopt({"parse-me": Number}, null, ['--leave-as-is=1.20', '--parse-me=1.20'], 0) + t.equal(parsed['leave-as-is'], '1.20') + t.equal(parsed['parse-me'], 1.2) + t.end() +}); + +test("other tests", function (t) { + + var util = require("util") + , Stream = require("stream") + , path = require("path") + , url = require("url") + + , shorthands = + { s : ["--loglevel", "silent"] + , d : ["--loglevel", "info"] + , dd : ["--loglevel", "verbose"] + , ddd : ["--loglevel", "silly"] + , noreg : ["--no-registry"] + , reg : ["--registry"] + , "no-reg" : ["--no-registry"] + , silent : ["--loglevel", "silent"] + , verbose : ["--loglevel", "verbose"] + , h : ["--usage"] + , H : ["--usage"] + , "?" : ["--usage"] + , help : ["--usage"] + , v : ["--version"] + , f : ["--force"] + , desc : ["--description"] + , "no-desc" : ["--no-description"] + , "local" : ["--no-global"] + , l : ["--long"] + , p : ["--parseable"] + , porcelain : ["--parseable"] + , g : ["--global"] + } + + , types = + { aoa: Array + , nullstream: [null, Stream] + , date: Date + , str: String + , browser : String + , cache : path + , color : ["always", Boolean] + , depth : Number + , description : Boolean + , dev : Boolean + , editor : path + , force : Boolean + , global : Boolean + , globalconfig : path + , group : [String, Number] + , gzipbin : String + , logfd : [Number, Stream] + , loglevel : ["silent","win","error","warn","info","verbose","silly"] + , long : Boolean + , "node-version" : [false, String] + , npaturl : url + , npat : Boolean + , "onload-script" : [false, String] + , outfd : [Number, Stream] + , parseable : Boolean + , pre: Boolean + , prefix: path + , proxy : url + , "rebuild-bundle" : Boolean + , registry : url + , searchopts : String + , searchexclude: [null, String] + , shell : path + , t: [Array, String] + , tag : String + , tar : String + , tmp : path + , "unsafe-perm" : Boolean + , usage : Boolean + , user : String + , username : String + , userconfig : path + , version : Boolean + , viewer: path + , _exit : Boolean + , path: path + } + + ; [["-v", {version:true}, []] + ,["---v", {version:true}, []] + ,["ls -s --no-reg connect -d", + {loglevel:"info",registry:null},["ls","connect"]] + ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]] + ,["ls --registry blargle", {}, ["ls"]] + ,["--no-registry", {registry:null}, []] + ,["--no-color true", {color:false}, []] + ,["--no-color false", {color:true}, []] + ,["--no-color", {color:false}, []] + ,["--color false", {color:false}, []] + ,["--color --logfd 7", {logfd:7,color:true}, []] + ,["--color=true", {color:true}, []] + ,["--logfd=10", {logfd:10}, []] + ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] + ,["--tmp=tmp -tar=gtar", + {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] + ,["--logfd x", {}, []] + ,["a -true -- -no-false", {true:true},["a","-no-false"]] + ,["a -no-false", {false:false},["a"]] + ,["a -no-no-true", {true:true}, ["a"]] + ,["a -no-no-no-false", {false:false}, ["a"]] + ,["---NO-no-No-no-no-no-nO-no-no"+ + "-No-no-no-no-no-no-no-no-no"+ + "-no-no-no-no-NO-NO-no-no-no-no-no-no"+ + "-no-body-can-do-the-boogaloo-like-I-do" + ,{"body-can-do-the-boogaloo-like-I-do":false}, []] + ,["we are -no-strangers-to-love "+ + "--you-know=the-rules --and=so-do-i "+ + "---im-thinking-of=a-full-commitment "+ + "--no-you-would-get-this-from-any-other-guy "+ + "--no-gonna-give-you-up "+ + "-no-gonna-let-you-down=true "+ + "--no-no-gonna-run-around false "+ + "--desert-you=false "+ + "--make-you-cry false "+ + "--no-tell-a-lie "+ + "--no-no-and-hurt-you false" + ,{"strangers-to-love":false + ,"you-know":"the-rules" + ,"and":"so-do-i" + ,"you-would-get-this-from-any-other-guy":false + ,"gonna-give-you-up":false + ,"gonna-let-you-down":false + ,"gonna-run-around":false + ,"desert-you":false + ,"make-you-cry":false + ,"tell-a-lie":false + ,"and-hurt-you":false + },["we", "are"]] + ,["-t one -t two -t three" + ,{t: ["one", "two", "three"]} + ,[]] + ,["-t one -t null -t three four five null" + ,{t: ["one", "null", "three"]} + ,["four", "five", "null"]] + ,["-t foo" + ,{t:["foo"]} + ,[]] + ,["--no-t" + ,{t:["false"]} + ,[]] + ,["-no-no-t" + ,{t:["true"]} + ,[]] + ,["-aoa one -aoa null -aoa 100" + ,{aoa:["one", null, '100']} + ,[]] + ,["-str 100" + ,{str:"100"} + ,[]] + ,["--color always" + ,{color:"always"} + ,[]] + ,["--no-nullstream" + ,{nullstream:null} + ,[]] + ,["--nullstream false" + ,{nullstream:null} + ,[]] + ,["--notadate=2011-01-25" + ,{notadate: "2011-01-25"} + ,[]] + ,["--date 2011-01-25" + ,{date: new Date("2011-01-25")} + ,[]] + ,["-cl 1" + ,{config: true, length: 1} + ,[] + ,{config: Boolean, length: Number, clear: Boolean} + ,{c: "--config", l: "--length"}] + ,["--acount bla" + ,{"acount":true} + ,["bla"] + ,{account: Boolean, credentials: Boolean, options: String} + ,{a:"--account", c:"--credentials",o:"--options"}] + ,["--clear" + ,{clear:true} + ,[] + ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean} + ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}] + ,["--file -" + ,{"file":"-"} + ,[] + ,{file:String} + ,{}] + ,["--file -" + ,{"file":true} + ,["-"] + ,{file:Boolean} + ,{}] + ,["--path" + ,{"path":null} + ,[]] + ,["--path ." + ,{"path":process.cwd()} + ,[]] + ].forEach(function (test) { + var argv = test[0].split(/\s+/) + , opts = test[1] + , rem = test[2] + , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0) + , parsed = actual.argv + delete actual.argv + for (var i in opts) { + var e = JSON.stringify(opts[i]) + , a = JSON.stringify(actual[i] === undefined ? null : actual[i]) + if (e && typeof e === "object") { + t.deepEqual(e, a) + } else { + t.equal(e, a) + } + } + t.deepEqual(rem, parsed.remain) + }) + t.end() +}) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/README.md new file mode 100644 index 0000000..1f1ffca --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/README.md @@ -0,0 +1,79 @@ +# once + +Only call a function once. + +## usage + +```javascript +var once = require('once') + +function load (file, cb) { + cb = once(cb) + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Or add to the Function.prototype in a responsible way: + +```javascript +// only has to be done once +require('once').proto() + +function load (file, cb) { + cb = cb.once() + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Ironically, the prototype feature makes this module twice as +complicated as necessary. + +To check whether you function has been called, use `fn.called`. Once the +function is called for the first time the return value of the original +function is saved in `fn.value` and subsequent calls will continue to +return this value. + +```javascript +var once = require('once') + +function load (cb) { + cb = once(cb) + var stream = createStream() + stream.once('data', cb) + stream.once('end', function () { + if (!cb.called) cb(new Error('not found')) + }) +} +``` + +## `once.strict(func)` + +Throw an error if the function is called twice. + +Some functions are expected to be called only once. Using `once` for them would +potentially hide logical errors. + +In the example below, the `greet` function has to call the callback only once: + +```javascript +function greet (name, cb) { + // return is missing from the if statement + // when no name is passed, the callback is called twice + if (!name) cb('Hello anonymous') + cb('Hello ' + name) +} + +function log (msg) { + console.log(msg) +} + +// this will print 'Hello anonymous' but the logical error will be missed +greet(null, once(msg)) + +// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time +greet(null, once.strict(msg)) +``` diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/once.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/once.js new file mode 100644 index 0000000..2354067 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/once.js @@ -0,0 +1,42 @@ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/package.json new file mode 100644 index 0000000..df50daa --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/once/package.json @@ -0,0 +1,68 @@ +{ + "_from": "once@^1.3.0", + "_id": "once@1.4.0", + "_inBundle": true, + "_integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "_location": "/cordova-android/once", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "once@^1.3.0", + "name": "once", + "escapedName": "once", + "rawSpec": "^1.3.0", + "saveSpec": null, + "fetchSpec": "^1.3.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob", + "/cordova-android/inflight" + ], + "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "_spec": "once@^1.3.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/once/issues" + }, + "bundleDependencies": false, + "dependencies": { + "wrappy": "1" + }, + "deprecated": false, + "description": "Run a function exactly one time", + "devDependencies": { + "tap": "^7.0.1" + }, + "directories": { + "test": "test" + }, + "files": [ + "once.js" + ], + "homepage": "https://github.com/isaacs/once#readme", + "keywords": [ + "once", + "function", + "one", + "single" + ], + "license": "ISC", + "main": "once.js", + "name": "once", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/once.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "version": "1.4.0" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/index.js new file mode 100644 index 0000000..22aa6c3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/index.js @@ -0,0 +1,20 @@ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/license b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/package.json new file mode 100644 index 0000000..abaa590 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/package.json @@ -0,0 +1,76 @@ +{ + "_from": "path-is-absolute@^1.0.0", + "_id": "path-is-absolute@1.0.1", + "_inBundle": true, + "_integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "_location": "/cordova-android/path-is-absolute", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "path-is-absolute@^1.0.0", + "name": "path-is-absolute", + "escapedName": "path-is-absolute", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/glob" + ], + "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "_shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "_spec": "path-is-absolute@^1.0.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/glob", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/path-is-absolute/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Node.js 0.12 path.isAbsolute() ponyfill", + "devDependencies": { + "xo": "^0.16.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/path-is-absolute#readme", + "keywords": [ + "path", + "paths", + "file", + "dir", + "absolute", + "isabsolute", + "is-absolute", + "built-in", + "util", + "utils", + "core", + "ponyfill", + "polyfill", + "shim", + "is", + "detect", + "check" + ], + "license": "MIT", + "name": "path-is-absolute", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/path-is-absolute.git" + }, + "scripts": { + "test": "xo && node test.js" + }, + "version": "1.0.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/readme.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/readme.md new file mode 100644 index 0000000..8dbdf5f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/path-is-absolute/readme.md @@ -0,0 +1,59 @@ +# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) + +> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com) + + +## Install + +``` +$ npm install --save path-is-absolute +``` + + +## Usage + +```js +const pathIsAbsolute = require('path-is-absolute'); + +// Running on Linux +pathIsAbsolute('/home/foo'); +//=> true +pathIsAbsolute('C:/Users/foo'); +//=> false + +// Running on Windows +pathIsAbsolute('C:/Users/foo'); +//=> true +pathIsAbsolute('/home/foo'); +//=> false + +// Running on any OS +pathIsAbsolute.posix('/home/foo'); +//=> true +pathIsAbsolute.posix('C:/Users/foo'); +//=> false +pathIsAbsolute.win32('C:/Users/foo'); +//=> true +pathIsAbsolute.win32('/home/foo'); +//=> false +``` + + +## API + +See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). + +### pathIsAbsolute(path) + +### pathIsAbsolute.posix(path) + +POSIX specific version. + +### pathIsAbsolute.win32(path) + +Windows specific version. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.jshintrc b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.jshintrc new file mode 100644 index 0000000..3f42622 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.jshintrc @@ -0,0 +1,4 @@ +{ + "laxbreak": true, + "laxcomma": true +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.travis.yml new file mode 100644 index 0000000..26e2bba --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/.travis.yml @@ -0,0 +1,43 @@ +sudo: false + +language: node_js + +node_js: +- '0.10' +- '0.12' +- '1' +- '2' +- '3' +- '4' +- '5' +- '6' + +env: + global: + - secure: xlLmWO7akYQjmDgrv6/b/ZMGILF8FReD+k6A/u8pYRD2JW29hhwvRwIQGcKp9+zmJdn4i5M4D1/qJkCeI3pdhAYBDHvzHOHSEwLJz1ESB2Crv6fa69CtpIufQkWvIxmZoU49tCaLpMBaIroGihJ4DAXdIVOIz6Ur9vXLDhGsE4c= + - secure: aQ46RdxL10xR5ZJJTMUKdH5k4tdrzgZ87nlwHC+pTr6bfRw3UKYC+6Rm7yQpg9wq0Io9O9dYCP007gQGSWstbjr1+jXNu/ubtNG+q5cpWBQZZZ013VHh9QJTf1MnetsZxbv8Yhrjg590s6vruT0oqesOnB2CizO/BsKxnY37Nos= + +matrix: + include: + - node_js: '0.10' + env: BROWSER_NAME=chrome BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=chrome BROWSER_VERSION=29 + - node_js: '0.10' + env: BROWSER_NAME=firefox BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=opera BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=latest + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=7 + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=6 + - node_js: '0.10' + env: BROWSER_NAME=safari BROWSER_VERSION=5 + - node_js: '0.10' + env: BROWSER_NAME=ie BROWSER_VERSION=11 + - node_js: '0.10' + env: BROWSER_NAME=ie BROWSER_VERSION=10 + - node_js: '0.10' + env: BROWSER_NAME=ie BROWSER_VERSION=9 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/History.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/History.md new file mode 100644 index 0000000..1ce9406 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/History.md @@ -0,0 +1,149 @@ +2.1.0 / 2017-05-04 +================== + +* [[`e4f06669bb`]](https://github.com/TooTallNate/plist.js/commit/e4f06669bb51d2e65654df7c39aab52bc3bf4e8a) - update license (extend copyright term) (Mike Reinstein) +* [[`edc6e41035`]](https://github.com/TooTallNate/plist.js/commit/edc6e4103546b1d7518a577e7c202c305a8abec0) - update module deps (Mike Reinstein) +* [[`85d11c48ef`](https://github.com/TooTallNate/plist.js/commit/85d11c48eff02312cbdd67f46fd8e74b0d372ca1)] - Harden test-cases and implementation to align with other implementations (Björn Brauer) +* [[`7619537eaa`]](https://github.com/TooTallNate/plist.js/commit/7619537eaa9e3e5a80829e759c004d2e017a07d2) review feedback: early returns and constants for nodeTypes (Björn Brauer) + +2.0.1 / 2016-08-16 +================== + +* [[`de136c8388`](https://github.com/TooTallNate/plist/commit/de136c8388)] - bad npm release… (Nathan Rajlich) + +2.0.0 / 2016-08-16 +================== + +* [[`90deef5d43`](https://github.com/TooTallNate/plist/commit/90deef5d43)] - remove deprecated functions (Nathan Rajlich) +* [[`d475cd8ce9`](https://github.com/TooTallNate/plist/commit/d475cd8ce9)] - Added travis ci support for node 6 (Amila Welihinda) +* [[`04c8ee7646`](https://github.com/TooTallNate/plist/commit/04c8ee7646)] - update dependencies (Mitchell Hentges) +* [[`97c02b3f05`](https://github.com/TooTallNate/plist/commit/97c02b3f05)] - **travis**: add `sudo: false` and test more node versions (Nathan Rajlich) +* [[`54c821ec29`](https://github.com/TooTallNate/plist/commit/54c821ec29)] - #71 - fixed and added test (Andrew Goldis) +* [[`4afb7c5079`](https://github.com/TooTallNate/plist/commit/4afb7c5079)] - fix `Cannot read property 'nodeValue' of undefined exception` that is thrown when a `` construct appears in plist (Chris Kinsman) +* [[`f360d7d685`](https://github.com/TooTallNate/plist/commit/f360d7d685)] - #66 - fixed empty keys and added tests (Andrew Goldis) +* [[`421c7f26e9`](https://github.com/TooTallNate/plist/commit/421c7f26e9)] - #66 - fixed empty key (Andrew Goldis) +* [[`a88aa4dca7`](https://github.com/TooTallNate/plist/commit/a88aa4dca7)] - add verbose examples (mrzmyr) + +1.2.0 / 2015-11-10 +================== + + * package: update "browserify" to v12.0.1 + * package: update "zuul" to v3.7.2 + * package: update "xmlbuilder" to v4.0.0 + * package: update "util-deprecate" to v1.0.2 + * package: update "mocha" to v2.3.3 + * package: update "base64-js" to v0.0.8 + * build: omit undefined values + * travis: add node 4.0 and 4.1 to test matrix + +1.1.0 / 2014-08-27 +================== + + * package: update "browserify" to v5.10.1 + * package: update "zuul" to v1.10.2 + * README: add "Sauce Test Status" build badge + * travis: use new "plistjs" sauce credentials + * travis: set up zuul saucelabs automated testing + +1.0.1 / 2014-06-25 +================== + + * add .zuul.yml file for browser testing + * remove Testling stuff + * build: fix global variable `val` leak + * package: use --check-leaks when running mocha tests + * README: update examples to use preferred API + * package: add "browser" keyword + +1.0.0 / 2014-05-20 +================== + + * package: remove "android-browser" + * test: add build() test + * test: re-add the empty string build() test + * test: remove "fixtures" and legacy "tests" dir + * test: add some more build() tests + * test: add a parse() CDATA test + * test: starting on build() tests + * test: more parse() tests + * package: attempt to fix "android-browser" testling + * parse: better with newline handling + * README: add Testling badge + * test: add node tests + * test: add a parse() test + * travis: don't test node v0.6 or v0.8 + * test: some more parse() tests + * test: add simple parsing test + * build: add support for an optional "opts" object + * package: test mobile devices + * test: use multiline to inline the XML + * package: beautify + * package: fix "mocha" harness + * package: more testling browsers + * build: add the "version=1.0" attribute + * beginnings of "mocha" tests + * build: more JSDocs + * tests: add test that ensures that empty string conversion works + * build: update "xmlbuilder" to v2.2.1 + * parse: ignore comment and cdata nodes + * tests: make the "Newlines" test actually contain a newline + * parse: lint + * test travis + * README: add Travis CI badge + * add .travis.yml file + * build: updated DTD to reflect name change + * parse: return falsey values in an Array plist + * build: fix encoding a typed array in the browser + * build: add support for Typed Arrays and ArrayBuffers + * build: more lint + * build: slight cleanup and optimizations + * build: use .txt() for the "date" value + * parse: always return a Buffer for nodes + * build: don't interpret Strings as base64 + * dist: commit prebuilt plist*.js files + * parse: fix typo in deprecate message + * parse: fix parse() return value + * parse: add jsdoc comments for the deprecated APIs + * parse: add `parse()` function + * node, parse: use `util-deprecate` module + * re-implemented parseFile to be asynchronous + * node: fix jsdoc comment + * Makefile: fix "node" require stubbing + * examples: add "browser" example + * package: tweak "main" + * package: remove "engines" field + * Makefile: fix --exclude command for browserify + * package: update "description" + * lib: more styling + * Makefile: add -build.js and -parse.js dist files + * lib: separate out the parse and build logic into their own files + * Makefile: add makefile with browserify build rules + * package: add "browserify" as a dev dependency + * plist: tabs to spaces (again) + * add a .jshintrc file + * LICENSE: update + * node-webkit support + * Ignore tests/ in .npmignore file + * Remove duplicate devDependencies key + * Remove trailing whitespace + * adding recent contributors. Bumping npm package number (patch release) + * Fixed node.js string handling + * bumping version number + * Fixed global variable plist leak + * patch release 0.4.1 + * removed temporary debug output file + * flipping the cases for writing data and string elements in build(). removed the 125 length check. Added validation of base64 encoding for data fields when parsing. added unit tests. + * fixed syntax errors in README examples (issue #20) + * added Sync versions of calls. added deprecation warnings for old method calls. updated documentation. If the resulting object from parseStringSync is an array with 1 element, return just the element. If a plist string or file doesnt have a tag as the document root element, fail noisily (issue #15) + * incrementing package version + * added cross platform base64 encode/decode for data elements (issue #17.) Comments and hygiene. + * refactored the code to use a DOM parser instead of SAX. closes issues #5 and #16 + * rolling up package version + * updated base64 detection regexp. updated README. hygiene. + * refactored the build function. Fixes issue #14 + * refactored tests. Modified tests from issue #9. thanks @sylvinus + * upgrade xmlbuilder package version. this is why .end() was needed in last commit; breaking change to xmlbuilder lib. :/ + * bug fix in build function, forgot to call .end() Refactored tests to use nodeunit + * Implemented support for real, identity tests + * Refactored base64 detection - still sloppy, fixed date building. Passing tests OK. + * Implemented basic plist builder that turns an existing JS object into plist XML. date, real and data types still need to be implemented. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/LICENSE new file mode 100644 index 0000000..92e3423 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2010-2017 Nathan Rajlich + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/Makefile b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/Makefile new file mode 100644 index 0000000..62695e0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/Makefile @@ -0,0 +1,76 @@ + +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) + +# BIN directory +BIN := $(THIS_DIR)/node_modules/.bin + +# applications +NODE ?= node +NPM ?= $(NODE) $(shell which npm) +BROWSERIFY ?= $(NODE) $(BIN)/browserify +MOCHA ?= $(NODE) $(BIN)/mocha +ZUUL ?= $(NODE) $(BIN)/zuul + +REPORTER ?= spec + +all: dist/plist.js dist/plist-build.js dist/plist-parse.js + +install: node_modules + +clean: + @rm -rf node_modules dist + +dist: + @mkdir -p $@ + +dist/plist-build.js: node_modules lib/build.js dist + @$(BROWSERIFY) \ + --standalone plist \ + lib/build.js > $@ + +dist/plist-parse.js: node_modules lib/parse.js dist + @$(BROWSERIFY) \ + --standalone plist \ + lib/parse.js > $@ + +dist/plist.js: node_modules lib/*.js dist + @$(BROWSERIFY) \ + --standalone plist \ + --ignore lib/node.js \ + lib/plist.js > $@ + +node_modules: package.json + @NODE_ENV= $(NPM) install + @touch node_modules + +test: + @if [ "x$(BROWSER_NAME)" = "x" ]; then \ + $(MAKE) test-node; \ + else \ + $(MAKE) test-zuul; \ + fi + +test-node: + @$(MOCHA) \ + --reporter $(REPORTER) \ + test/*.js + +test-zuul: + @if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \ + $(ZUUL) \ + --ui mocha-bdd \ + --browser-name $(BROWSER_NAME) \ + --browser-version $(BROWSER_VERSION) \ + test/*.js; \ + else \ + $(ZUUL) \ + --ui mocha-bdd \ + --browser-name $(BROWSER_NAME) \ + --browser-version $(BROWSER_VERSION) \ + --browser-platform "$(BROWSER_PLATFORM)" \ + test/*.js; \ + fi + +.PHONY: all install clean test test-node test-zuul diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/README.md new file mode 100644 index 0000000..81545ae --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/README.md @@ -0,0 +1,141 @@ +plist.js +======== +### Mac OS X Plist parser/builder for Node.js and browsers + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/plistjs.svg)](https://saucelabs.com/u/plistjs) + +[![Build Status](https://travis-ci.org/TooTallNate/plist.js.svg?branch=master)](https://travis-ci.org/TooTallNate/plist.js) + +Provides facilities for reading and writing Mac OS X Plist (property list) +files. These are often used in programming OS X and iOS applications, as +well as the iTunes configuration XML file. + +Plist files represent stored programming "object"s. They are very similar +to JSON. A valid Plist file is representable as a native JavaScript Object +and vice-versa. + + +## Usage + +### Node.js + +Install using `npm`: + +``` bash +$ npm install --save plist +``` + +Then `require()` the _plist_ module in your file: + +``` js +var plist = require('plist'); + +// now use the `parse()` and `build()` functions +var val = plist.parse('Hello World!'); +console.log(val); // "Hello World!" +``` + + +### Browser + +Include the `dist/plist.js` in a ` + +``` + + +## API + +### Parsing + +Parsing a plist from filename: + +``` javascript +var fs = require('fs'); +var plist = require('plist'); + +var obj = plist.parse(fs.readFileSync('myPlist.plist', 'utf8')); +console.log(JSON.stringify(obj)); +``` + +Parsing a plist from string payload: + +``` javascript +var plist = require('plist'); + +var xml = + '' + + '' + + '' + + 'metadata' + + '' + + 'bundle-identifier' + + 'com.company.app' + + 'bundle-version' + + '0.1.1' + + 'kind' + + 'software' + + 'title' + + 'AppName' + + '' + + ''; + +console.log(plist.parse(xml)); + +// [ +// "metadata", +// { +// "bundle-identifier": "com.company.app", +// "bundle-version": "0.1.1", +// "kind": "software", +// "title": "AppName" +// } +// ] +``` + +### Building + +Given an existing JavaScript Object, you can turn it into an XML document +that complies with the plist DTD: + +``` javascript +var plist = require('plist'); + +var json = [ + "metadata", + { + "bundle-identifier": "com.company.app", + "bundle-version": "0.1.1", + "kind": "software", + "title": "AppName" + } +]; + +console.log(plist.build(json)); + +// +// +// +// metadata +// +// bundle-identifier +// com.company.app +// bundle-version +// 0.1.1 +// kind +// software +// title +// AppName +// +// +``` + +## License + +[(The MIT License)](LICENSE) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/dist/plist-build.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/dist/plist-build.js new file mode 100644 index 0000000..4fcd378 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/dist/plist-build.js @@ -0,0 +1,3982 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;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 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],3:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} + +},{}],4:[function(require,module,exports){ +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; +} + +module.exports = last; + +},{}],5:[function(require,module,exports){ +var arrayEvery = require('../internal/arrayEvery'), + baseCallback = require('../internal/baseCallback'), + baseEvery = require('../internal/baseEvery'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * The predicate is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.every(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = baseCallback(predicate, thisArg, 3); + } + return func(collection, predicate); +} + +module.exports = every; + +},{"../internal/arrayEvery":7,"../internal/baseCallback":11,"../internal/baseEvery":15,"../internal/isIterateeCall":40,"../lang/isArray":49}],6:[function(require,module,exports){ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as an array. + * + * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.restParam(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ +function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; +} + +module.exports = restParam; + +},{}],7:[function(require,module,exports){ +/** + * A specialized version of `_.every` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ +function arrayEvery(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; +} + +module.exports = arrayEvery; + +},{}],8:[function(require,module,exports){ +/** + * A specialized version of `_.some` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +module.exports = arraySome; + +},{}],9:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** + * A specialized version of `_.assign` for customizing assigned values without + * support for argument juggling, multiple sources, and `this` binding `customizer` + * functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + */ +function assignWith(object, source, customizer) { + var index = -1, + props = keys(source), + length = props.length; + + while (++index < length) { + var key = props[index], + value = object[key], + result = customizer(value, source[key], key, object, source); + + if ((result === result ? (result !== value) : (value === value)) || + (value === undefined && !(key in object))) { + object[key] = result; + } + } + return object; +} + +module.exports = assignWith; + +},{"../object/keys":58}],10:[function(require,module,exports){ +var baseCopy = require('./baseCopy'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} + +module.exports = baseAssign; + +},{"../object/keys":58,"./baseCopy":12}],11:[function(require,module,exports){ +var baseMatches = require('./baseMatches'), + baseMatchesProperty = require('./baseMatchesProperty'), + bindCallback = require('./bindCallback'), + identity = require('../utility/identity'), + property = require('../utility/property'); + +/** + * The base implementation of `_.callback` which supports specifying the + * number of arguments to provide to `func`. + * + * @private + * @param {*} [func=_.identity] The value to convert to a callback. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function baseCallback(func, thisArg, argCount) { + var type = typeof func; + if (type == 'function') { + return thisArg === undefined + ? func + : bindCallback(func, thisArg, argCount); + } + if (func == null) { + return identity; + } + if (type == 'object') { + return baseMatches(func); + } + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); +} + +module.exports = baseCallback; + +},{"../utility/identity":61,"../utility/property":62,"./baseMatches":22,"./baseMatchesProperty":23,"./bindCallback":28}],12:[function(require,module,exports){ +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ +function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; +} + +module.exports = baseCopy; + +},{}],13:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; +}()); + +module.exports = baseCreate; + +},{"../lang/isObject":53}],14:[function(require,module,exports){ +var baseForOwn = require('./baseForOwn'), + createBaseEach = require('./createBaseEach'); + +/** + * The base implementation of `_.forEach` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object|string} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +module.exports = baseEach; + +},{"./baseForOwn":17,"./createBaseEach":30}],15:[function(require,module,exports){ +var baseEach = require('./baseEach'); + +/** + * The base implementation of `_.every` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ +function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; +} + +module.exports = baseEvery; + +},{"./baseEach":14}],16:[function(require,module,exports){ +var createBaseFor = require('./createBaseFor'); + +/** + * The base implementation of `baseForIn` and `baseForOwn` which iterates + * over `object` properties returned by `keysFunc` invoking `iteratee` for + * each property. Iteratee functions may exit iteration early by explicitly + * returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +module.exports = baseFor; + +},{"./createBaseFor":31}],17:[function(require,module,exports){ +var baseFor = require('./baseFor'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.forOwn` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return baseFor(object, iteratee, keys); +} + +module.exports = baseForOwn; + +},{"../object/keys":58,"./baseFor":16}],18:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * The base implementation of `get` without support for string paths + * and default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path of the property to get. + * @param {string} [pathKey] The key representation of path. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[path[index++]]; + } + return (index && index == length) ? object : undefined; +} + +module.exports = baseGet; + +},{"./toObject":46}],19:[function(require,module,exports){ +var baseIsEqualDeep = require('./baseIsEqualDeep'), + isObject = require('../lang/isObject'), + isObjectLike = require('./isObjectLike'); + +/** + * The base implementation of `_.isEqual` without support for `this` binding + * `customizer` functions. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); +} + +module.exports = baseIsEqual; + +},{"../lang/isObject":53,"./baseIsEqualDeep":20,"./isObjectLike":43}],20:[function(require,module,exports){ +var equalArrays = require('./equalArrays'), + equalByTag = require('./equalByTag'), + equalObjects = require('./equalObjects'), + isArray = require('../lang/isArray'), + isTypedArray = require('../lang/isTypedArray'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing objects. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA=[]] Tracks traversed `value` objects. + * @param {Array} [stackB=[]] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + // Assume cyclic values are equal. + // For more information on detecting circular references see https://es5.github.io/#JO. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + // Add `object` and `other` to the stack of traversed objects. + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; +} + +module.exports = baseIsEqualDeep; + +},{"../lang/isArray":49,"../lang/isTypedArray":55,"./equalArrays":32,"./equalByTag":33,"./equalObjects":34}],21:[function(require,module,exports){ +var baseIsEqual = require('./baseIsEqual'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.isMatch` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} matchData The propery names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparing objects. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = toObject(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { + return false; + } + } + } + return true; +} + +module.exports = baseIsMatch; + +},{"./baseIsEqual":19,"./toObject":46}],22:[function(require,module,exports){ +var baseIsMatch = require('./baseIsMatch'), + getMatchData = require('./getMatchData'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.matches` which does not clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + var key = matchData[0][0], + value = matchData[0][1]; + + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; + } + return function(object) { + return baseIsMatch(object, matchData); + }; +} + +module.exports = baseMatches; + +},{"./baseIsMatch":21,"./getMatchData":36,"./toObject":46}],23:[function(require,module,exports){ +var baseGet = require('./baseGet'), + baseIsEqual = require('./baseIsEqual'), + baseSlice = require('./baseSlice'), + isArray = require('../lang/isArray'), + isKey = require('./isKey'), + isStrictComparable = require('./isStrictComparable'), + last = require('../array/last'), + toObject = require('./toObject'), + toPath = require('./toPath'); + +/** + * The base implementation of `_.matchesProperty` which does not clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to compare. + * @returns {Function} Returns the new function. + */ +function baseMatchesProperty(path, srcValue) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(srcValue), + pathKey = (path + ''); + + path = toPath(path); + return function(object) { + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === srcValue + ? (srcValue !== undefined || (key in object)) + : baseIsEqual(srcValue, object[key], undefined, true); + }; +} + +module.exports = baseMatchesProperty; + +},{"../array/last":4,"../lang/isArray":49,"./baseGet":18,"./baseIsEqual":19,"./baseSlice":26,"./isKey":41,"./isStrictComparable":44,"./toObject":46,"./toPath":47}],24:[function(require,module,exports){ +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +module.exports = baseProperty; + +},{}],25:[function(require,module,exports){ +var baseGet = require('./baseGet'), + toPath = require('./toPath'); + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + */ +function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; +} + +module.exports = basePropertyDeep; + +},{"./baseGet":18,"./toPath":47}],26:[function(require,module,exports){ +/** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; +} + +module.exports = baseSlice; + +},{}],27:[function(require,module,exports){ +/** + * Converts `value` to a string if it's not one. An empty string is returned + * for `null` or `undefined` values. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + return value == null ? '' : (value + ''); +} + +module.exports = baseToString; + +},{}],28:[function(require,module,exports){ +var identity = require('../utility/identity'); + +/** + * A specialized version of `baseCallback` which only supports `this` binding + * and specifying the number of arguments to provide to `func`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; +} + +module.exports = bindCallback; + +},{"../utility/identity":61}],29:[function(require,module,exports){ +var bindCallback = require('./bindCallback'), + isIterateeCall = require('./isIterateeCall'), + restParam = require('../function/restParam'); + +/** + * Creates a `_.assign`, `_.defaults`, or `_.merge` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 ? sources[length - 2] : undefined, + guard = length > 2 ? sources[2] : undefined, + thisArg = length > 1 ? sources[length - 1] : undefined; + + if (typeof customizer == 'function') { + customizer = bindCallback(customizer, thisArg, 5); + length -= 2; + } else { + customizer = typeof thisArg == 'function' ? thisArg : undefined; + length -= (customizer ? 1 : 0); + } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, customizer); + } + } + return object; + }); +} + +module.exports = createAssigner; + +},{"../function/restParam":6,"./bindCallback":28,"./isIterateeCall":40}],30:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'), + toObject = require('./toObject'); + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + return eachFunc(collection, iteratee); + } + var index = fromRight ? length : -1, + iterable = toObject(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +module.exports = createBaseEach; + +},{"./getLength":35,"./isLength":42,"./toObject":46}],31:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * Creates a base function for `_.forIn` or `_.forInRight`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var iterable = toObject(object), + props = keysFunc(object), + length = props.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + var key = props[index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +module.exports = createBaseFor; + +},{"./toObject":46}],32:[function(require,module,exports){ +var arraySome = require('./arraySome'); + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing arrays. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; + + if (result !== undefined) { + if (result) { + continue; + } + return false; + } + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; + } + } + return true; +} + +module.exports = equalArrays; + +},{"./arraySome":8}],33:[function(require,module,exports){ +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + // Coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + // Treat `NaN` vs. `NaN` as equal. + return (object != +object) + ? other != +other + : object == +other; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings primitives and string + // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. + return object == (other + ''); + } + return false; +} + +module.exports = equalByTag; + +},{}],34:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; + + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; +} + +module.exports = equalObjects; + +},{"../object/keys":58}],35:[function(require,module,exports){ +var baseProperty = require('./baseProperty'); + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +module.exports = getLength; + +},{"./baseProperty":24}],36:[function(require,module,exports){ +var isStrictComparable = require('./isStrictComparable'), + pairs = require('../object/pairs'); + +/** + * Gets the propery names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = pairs(object), + length = result.length; + + while (length--) { + result[length][2] = isStrictComparable(result[length][1]); + } + return result; +} + +module.exports = getMatchData; + +},{"../object/pairs":60,"./isStrictComparable":44}],37:[function(require,module,exports){ +var isNative = require('../lang/isNative'); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +module.exports = getNative; + +},{"../lang/isNative":52}],38:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +module.exports = isArrayLike; + +},{"./getLength":35,"./isLength":42}],39:[function(require,module,exports){ +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +module.exports = isIndex; + +},{}],40:[function(require,module,exports){ +var isArrayLike = require('./isArrayLike'), + isIndex = require('./isIndex'), + isObject = require('../lang/isObject'); + +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; +} + +module.exports = isIterateeCall; + +},{"../lang/isObject":53,"./isArrayLike":38,"./isIndex":39}],41:[function(require,module,exports){ +var isArray = require('../lang/isArray'), + toObject = require('./toObject'); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); +} + +module.exports = isKey; + +},{"../lang/isArray":49,"./toObject":46}],42:[function(require,module,exports){ +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +module.exports = isLength; + +},{}],43:[function(require,module,exports){ +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isObjectLike; + +},{}],44:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +module.exports = isStrictComparable; + +},{"../lang/isObject":53}],45:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('./isIndex'), + isLength = require('./isLength'), + keysIn = require('../object/keysIn'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} + +module.exports = shimKeys; + +},{"../lang/isArguments":48,"../lang/isArray":49,"../object/keysIn":59,"./isIndex":39,"./isLength":42}],46:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Converts `value` to an object if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Object} Returns the object. + */ +function toObject(value) { + return isObject(value) ? value : Object(value); +} + +module.exports = toObject; + +},{"../lang/isObject":53}],47:[function(require,module,exports){ +var baseToString = require('./baseToString'), + isArray = require('../lang/isArray'); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `value` to property path array if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array} Returns the property path array. + */ +function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +} + +module.exports = toPath; + +},{"../lang/isArray":49,"./baseToString":27}],48:[function(require,module,exports){ +var isArrayLike = require('../internal/isArrayLike'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Native method references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is classified as an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); +} + +module.exports = isArguments; + +},{"../internal/isArrayLike":38,"../internal/isObjectLike":43}],49:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; + +module.exports = isArray; + +},{"../internal/getNative":37,"../internal/isLength":42,"../internal/isObjectLike":43}],50:[function(require,module,exports){ +var isArguments = require('./isArguments'), + isArray = require('./isArray'), + isArrayLike = require('../internal/isArrayLike'), + isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'), + isString = require('./isString'), + keys = require('../object/keys'); + +/** + * Checks if `value` is empty. A value is considered empty unless it's an + * `arguments` object, array, string, or jQuery-like collection with a length + * greater than `0` or an object with own enumerable properties. + * + * @static + * @memberOf _ + * @category Lang + * @param {Array|Object|string} value The value to inspect. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || + (isObjectLike(value) && isFunction(value.splice)))) { + return !value.length; + } + return !keys(value).length; +} + +module.exports = isEmpty; + +},{"../internal/isArrayLike":38,"../internal/isObjectLike":43,"../object/keys":58,"./isArguments":48,"./isArray":49,"./isFunction":51,"./isString":54}],51:[function(require,module,exports){ +var isObject = require('./isObject'); + +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 which returns 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +module.exports = isFunction; + +},{"./isObject":53}],52:[function(require,module,exports){ +var isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = isNative; + +},{"../internal/isObjectLike":43,"./isFunction":51}],53:[function(require,module,exports){ +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = isObject; + +},{}],54:[function(require,module,exports){ +var isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); +} + +module.exports = isString; + +},{"../internal/isObjectLike":43}],55:[function(require,module,exports){ +var isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dateTag] = typedArrayTags[errorTag] = +typedArrayTags[funcTag] = typedArrayTags[mapTag] = +typedArrayTags[numberTag] = typedArrayTags[objectTag] = +typedArrayTags[regexpTag] = typedArrayTags[setTag] = +typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +function isTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; +} + +module.exports = isTypedArray; + +},{"../internal/isLength":42,"../internal/isObjectLike":43}],56:[function(require,module,exports){ +var assignWith = require('../internal/assignWith'), + baseAssign = require('../internal/baseAssign'), + createAssigner = require('../internal/createAssigner'); + +/** + * Assigns own enumerable properties of source object(s) to the destination + * object. Subsequent sources overwrite property assignments of previous sources. + * If `customizer` is provided it's invoked to produce the assigned values. + * The `customizer` is bound to `thisArg` and invoked with five arguments: + * (objectValue, sourceValue, key, object, source). + * + * **Note:** This method mutates `object` and is based on + * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign). + * + * @static + * @memberOf _ + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); + * // => { 'user': 'fred', 'age': 40 } + * + * // using a customizer callback + * var defaults = _.partialRight(_.assign, function(value, other) { + * return _.isUndefined(value) ? other : value; + * }); + * + * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); + * // => { 'user': 'barney', 'age': 36 } + */ +var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); +}); + +module.exports = assign; + +},{"../internal/assignWith":9,"../internal/baseAssign":10,"../internal/createAssigner":29}],57:[function(require,module,exports){ +var baseAssign = require('../internal/baseAssign'), + baseCreate = require('../internal/baseCreate'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; +} + +module.exports = create; + +},{"../internal/baseAssign":10,"../internal/baseCreate":13,"../internal/isIterateeCall":40}],58:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isArrayLike = require('../internal/isArrayLike'), + isObject = require('../lang/isObject'), + shimKeys = require('../internal/shimKeys'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; +}; + +module.exports = keys; + +},{"../internal/getNative":37,"../internal/isArrayLike":38,"../internal/shimKeys":45,"../lang/isObject":53}],59:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('../internal/isIndex'), + isLength = require('../internal/isLength'), + isObject = require('../lang/isObject'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = keysIn; + +},{"../internal/isIndex":39,"../internal/isLength":42,"../lang/isArguments":48,"../lang/isArray":49,"../lang/isObject":53}],60:[function(require,module,exports){ +var keys = require('./keys'), + toObject = require('../internal/toObject'); + +/** + * Creates a two dimensional array of the key-value pairs for `object`, + * e.g. `[[key1, value1], [key2, value2]]`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the new array of key-value pairs. + * @example + * + * _.pairs({ 'barney': 36, 'fred': 40 }); + * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) + */ +function pairs(object) { + object = toObject(object); + + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + var key = props[index]; + result[index] = [key, object[key]]; + } + return result; +} + +module.exports = pairs; + +},{"../internal/toObject":46,"./keys":58}],61:[function(require,module,exports){ +/** + * This method returns the first argument provided to it. + * + * @static + * @memberOf _ + * @category Utility + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'user': 'fred' }; + * + * _.identity(object) === object; + * // => true + */ +function identity(value) { + return value; +} + +module.exports = identity; + +},{}],62:[function(require,module,exports){ +var baseProperty = require('../internal/baseProperty'), + basePropertyDeep = require('../internal/basePropertyDeep'), + isKey = require('../internal/isKey'); + +/** + * Creates a function that returns the property value at `path` on a + * given object. + * + * @static + * @memberOf _ + * @category Utility + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + * @example + * + * var objects = [ + * { 'a': { 'b': { 'c': 2 } } }, + * { 'a': { 'b': { 'c': 1 } } } + * ]; + * + * _.map(objects, _.property('a.b.c')); + * // => [2, 1] + * + * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); + * // => [1, 2] + */ +function property(path) { + return isKey(path) ? baseProperty(path) : basePropertyDeep(path); +} + +module.exports = property; + +},{"../internal/baseProperty":24,"../internal/basePropertyDeep":25,"../internal/isKey":41}],63:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, create; + + create = require('lodash/object/create'); + + module.exports = XMLAttribute = (function() { + function XMLAttribute(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing attribute name of element " + parent.name); + } + if (value == null) { + throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); + } + this.name = this.stringify.attName(name); + this.value = this.stringify.attValue(value); + } + + XMLAttribute.prototype.clone = function() { + return create(XMLAttribute.prototype, this); + }; + + XMLAttribute.prototype.toString = function(options, level) { + return ' ' + this.name + '="' + this.value + '"'; + }; + + return XMLAttribute; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],64:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier; + + XMLStringifier = require('./XMLStringifier'); + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLElement = require('./XMLElement'); + + module.exports = XMLBuilder = (function() { + function XMLBuilder(name, options) { + var root, temp; + if (name == null) { + throw new Error("Root element needs a name"); + } + if (options == null) { + options = {}; + } + this.options = options; + this.stringify = new XMLStringifier(options); + temp = new XMLElement(this, 'doc'); + root = temp.element(name); + root.isRoot = true; + root.documentObject = this; + this.rootObject = root; + if (!options.headless) { + root.declaration(options); + if ((options.pubID != null) || (options.sysID != null)) { + root.doctype(options); + } + } + } + + XMLBuilder.prototype.root = function() { + return this.rootObject; + }; + + XMLBuilder.prototype.end = function(options) { + return this.toString(options); + }; + + XMLBuilder.prototype.toString = function(options) { + var indent, newline, offset, pretty, r, ref, ref1, ref2; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + r = ''; + if (this.xmldec != null) { + r += this.xmldec.toString(options); + } + if (this.doctype != null) { + r += this.doctype.toString(options); + } + r += this.rootObject.toString(options); + if (pretty && r.slice(-newline.length) === newline) { + r = r.slice(0, -newline.length); + } + return r; + }; + + return XMLBuilder; + + })(); + +}).call(this); + +},{"./XMLDeclaration":71,"./XMLDocType":72,"./XMLElement":73,"./XMLStringifier":77}],65:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLCData = (function(superClass) { + extend(XMLCData, superClass); + + function XMLCData(parent, text) { + XMLCData.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing CDATA text"); + } + this.text = this.stringify.cdata(text); + } + + XMLCData.prototype.clone = function() { + return create(XMLCData.prototype, this); + }; + + XMLCData.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLCData; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/object/create":57}],66:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLComment, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLComment = (function(superClass) { + extend(XMLComment, superClass); + + function XMLComment(parent, text) { + XMLComment.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing comment text"); + } + this.text = this.stringify.comment(text); + } + + XMLComment.prototype.clone = function() { + return create(XMLComment.prototype, this); + }; + + XMLComment.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLComment; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/object/create":57}],67:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDAttList, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDAttList = (function() { + function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { + this.stringify = parent.stringify; + if (elementName == null) { + throw new Error("Missing DTD element name"); + } + if (attributeName == null) { + throw new Error("Missing DTD attribute name"); + } + if (!attributeType) { + throw new Error("Missing DTD attribute type"); + } + if (!defaultValueType) { + throw new Error("Missing DTD attribute default"); + } + if (defaultValueType.indexOf('#') !== 0) { + defaultValueType = '#' + defaultValueType; + } + if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { + throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); + } + if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { + throw new Error("Default value only applies to #FIXED or #DEFAULT"); + } + this.elementName = this.stringify.eleName(elementName); + this.attributeName = this.stringify.attName(attributeName); + this.attributeType = this.stringify.dtdAttType(attributeType); + this.defaultValue = this.stringify.dtdAttDefault(defaultValue); + this.defaultValueType = defaultValueType; + } + + XMLDTDAttList.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDAttList; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],68:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDElement, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDElement = (function() { + function XMLDTDElement(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing DTD element name"); + } + if (!value) { + value = '(#PCDATA)'; + } + if (Array.isArray(value)) { + value = '(' + value.join(',') + ')'; + } + this.name = this.stringify.eleName(name); + this.value = this.stringify.dtdElementValue(value); + } + + XMLDTDElement.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDElement; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],69:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDEntity, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + module.exports = XMLDTDEntity = (function() { + function XMLDTDEntity(parent, pe, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing entity name"); + } + if (value == null) { + throw new Error("Missing entity value"); + } + this.pe = !!pe; + this.name = this.stringify.eleName(name); + if (!isObject(value)) { + this.value = this.stringify.dtdEntityValue(value); + } else { + if (!value.pubID && !value.sysID) { + throw new Error("Public and/or system identifiers are required for an external entity"); + } + if (value.pubID && !value.sysID) { + throw new Error("System identifier is required for a public external entity"); + } + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + if (value.nData != null) { + this.nData = this.stringify.dtdNData(value.nData); + } + if (this.pe && this.nData) { + throw new Error("Notation declaration is not allowed in a parameter entity"); + } + } + } + + XMLDTDEntity.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDEntity; + + })(); + +}).call(this); + +},{"lodash/lang/isObject":53,"lodash/object/create":57}],70:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDNotation, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDNotation = (function() { + function XMLDTDNotation(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing notation name"); + } + if (!value.pubID && !value.sysID) { + throw new Error("Public or system identifiers are required for an external entity"); + } + this.name = this.stringify.eleName(name); + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + } + + XMLDTDNotation.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDNotation; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],71:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDeclaration, XMLNode, create, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLDeclaration = (function(superClass) { + extend(XMLDeclaration, superClass); + + function XMLDeclaration(parent, version, encoding, standalone) { + var ref; + XMLDeclaration.__super__.constructor.call(this, parent); + if (isObject(version)) { + ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; + } + if (!version) { + version = '1.0'; + } + this.version = this.stringify.xmlVersion(version); + if (encoding != null) { + this.encoding = this.stringify.xmlEncoding(encoding); + } + if (standalone != null) { + this.standalone = this.stringify.xmlStandalone(standalone); + } + } + + XMLDeclaration.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDeclaration; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/lang/isObject":53,"lodash/object/create":57}],72:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLDocType = (function() { + function XMLDocType(parent, pubID, sysID) { + var ref, ref1; + this.documentObject = parent; + this.stringify = this.documentObject.stringify; + this.children = []; + if (isObject(pubID)) { + ref = pubID, pubID = ref.pubID, sysID = ref.sysID; + } + if (sysID == null) { + ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; + } + if (pubID != null) { + this.pubID = this.stringify.dtdPubID(pubID); + } + if (sysID != null) { + this.sysID = this.stringify.dtdSysID(sysID); + } + } + + XMLDocType.prototype.element = function(name, value) { + var child; + child = new XMLDTDElement(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var child; + child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.entity = function(name, value) { + var child; + child = new XMLDTDEntity(this, false, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.pEntity = function(name, value) { + var child; + child = new XMLDTDEntity(this, true, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.notation = function(name, value) { + var child; + child = new XMLDTDNotation(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.instruction = function(target, value) { + var child; + child = new XMLProcessingInstruction(this, target, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.root = function() { + return this.documentObject.root(); + }; + + XMLDocType.prototype.document = function() { + return this.documentObject; + }; + + XMLDocType.prototype.toString = function(options, level) { + var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ' 0) { + r += ' ['; + if (pretty) { + r += newline; + } + ref3 = this.children; + for (i = 0, len = ref3.length; i < len; i++) { + child = ref3[i]; + r += child.toString(options, level + 1); + } + r += ']'; + } + r += '>'; + if (pretty) { + r += newline; + } + return r; + }; + + XMLDocType.prototype.ele = function(name, value) { + return this.element(name, value); + }; + + XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); + }; + + XMLDocType.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocType.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocType.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + XMLDocType.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLDocType.prototype.com = function(value) { + return this.comment(value); + }; + + XMLDocType.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocType.prototype.up = function() { + return this.root(); + }; + + XMLDocType.prototype.doc = function() { + return this.document(); + }; + + return XMLDocType; + + })(); + +}).call(this); + +},{"./XMLCData":65,"./XMLComment":66,"./XMLDTDAttList":67,"./XMLDTDElement":68,"./XMLDTDEntity":69,"./XMLDTDNotation":70,"./XMLProcessingInstruction":75,"lodash/lang/isObject":53,"lodash/object/create":57}],73:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + every = require('lodash/collection/every'); + + XMLNode = require('./XMLNode'); + + XMLAttribute = require('./XMLAttribute'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLElement = (function(superClass) { + extend(XMLElement, superClass); + + function XMLElement(parent, name, attributes) { + XMLElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing element name"); + } + this.name = this.stringify.eleName(name); + this.children = []; + this.instructions = []; + this.attributes = {}; + if (attributes != null) { + this.attribute(attributes); + } + } + + XMLElement.prototype.clone = function() { + var att, attName, clonedSelf, i, len, pi, ref, ref1; + clonedSelf = create(XMLElement.prototype, this); + if (clonedSelf.isRoot) { + clonedSelf.documentObject = null; + } + clonedSelf.attributes = {}; + ref = this.attributes; + for (attName in ref) { + if (!hasProp.call(ref, attName)) continue; + att = ref[attName]; + clonedSelf.attributes[attName] = att.clone(); + } + clonedSelf.instructions = []; + ref1 = this.instructions; + for (i = 0, len = ref1.length; i < len; i++) { + pi = ref1[i]; + clonedSelf.instructions.push(pi.clone()); + } + clonedSelf.children = []; + this.children.forEach(function(child) { + var clonedChild; + clonedChild = child.clone(); + clonedChild.parent = clonedSelf; + return clonedSelf.children.push(clonedChild); + }); + return clonedSelf; + }; + + XMLElement.prototype.attribute = function(name, value) { + var attName, attValue; + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLElement.prototype.removeAttribute = function(name) { + var attName, i, len; + if (name == null) { + throw new Error("Missing attribute name"); + } + name = name.valueOf(); + if (Array.isArray(name)) { + for (i = 0, len = name.length; i < len; i++) { + attName = name[i]; + delete this.attributes[attName]; + } + } else { + delete this.attributes[name]; + } + return this; + }; + + XMLElement.prototype.instruction = function(target, value) { + var i, insTarget, insValue, instruction, len; + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (i = 0, len = target.length; i < len; i++) { + insTarget = target[i]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + instruction = new XMLProcessingInstruction(this, target, value); + this.instructions.push(instruction); + } + return this; + }; + + XMLElement.prototype.toString = function(options, level) { + var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + ref3 = this.instructions; + for (i = 0, len = ref3.length; i < len; i++) { + instruction = ref3[i]; + r += instruction.toString(options, level); + } + if (pretty) { + r += space; + } + r += '<' + this.name; + ref4 = this.attributes; + for (name in ref4) { + if (!hasProp.call(ref4, name)) continue; + att = ref4[name]; + r += att.toString(options); + } + if (this.children.length === 0 || every(this.children, function(e) { + return e.value === ''; + })) { + r += '/>'; + if (pretty) { + r += newline; + } + } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) { + r += '>'; + r += this.children[0].value; + r += ''; + r += newline; + } else { + r += '>'; + if (pretty) { + r += newline; + } + ref5 = this.children; + for (j = 0, len1 = ref5.length; j < len1; j++) { + child = ref5[j]; + r += child.toString(options, level + 1); + } + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + } + return r; + }; + + XMLElement.prototype.att = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLElement.prototype.a = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + return XMLElement; + + })(XMLNode); + +}).call(this); + +},{"./XMLAttribute":63,"./XMLNode":74,"./XMLProcessingInstruction":75,"lodash/collection/every":5,"lodash/lang/isFunction":51,"lodash/lang/isObject":53,"lodash/object/create":57}],74:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject, + hasProp = {}.hasOwnProperty; + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + isEmpty = require('lodash/lang/isEmpty'); + + XMLElement = null; + + XMLCData = null; + + XMLComment = null; + + XMLDeclaration = null; + + XMLDocType = null; + + XMLRaw = null; + + XMLText = null; + + module.exports = XMLNode = (function() { + function XMLNode(parent) { + this.parent = parent; + this.options = this.parent.options; + this.stringify = this.parent.stringify; + if (XMLElement === null) { + XMLElement = require('./XMLElement'); + XMLCData = require('./XMLCData'); + XMLComment = require('./XMLComment'); + XMLDeclaration = require('./XMLDeclaration'); + XMLDocType = require('./XMLDocType'); + XMLRaw = require('./XMLRaw'); + XMLText = require('./XMLText'); + } + } + + XMLNode.prototype.element = function(name, attributes, text) { + var childNode, item, j, k, key, lastChild, len, len1, ref, val; + lastChild = null; + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + if (name != null) { + name = name.valueOf(); + } + if (Array.isArray(name)) { + for (j = 0, len = name.length; j < len; j++) { + item = name[j]; + lastChild = this.element(item); + } + } else if (isFunction(name)) { + lastChild = this.element(name.apply()); + } else if (isObject(name)) { + for (key in name) { + if (!hasProp.call(name, key)) continue; + val = name[key]; + if (isFunction(val)) { + val = val.apply(); + } + if ((isObject(val)) && (isEmpty(val))) { + val = null; + } + if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { + lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); + } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) { + lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val); + } else if (Array.isArray(val)) { + for (k = 0, len1 = val.length; k < len1; k++) { + item = val[k]; + childNode = {}; + childNode[key] = item; + lastChild = this.element(childNode); + } + } else if (isObject(val)) { + lastChild = this.element(key); + lastChild.element(val); + } else { + lastChild = this.element(key, val); + } + } + } else { + if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { + lastChild = this.text(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { + lastChild = this.cdata(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { + lastChild = this.comment(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { + lastChild = this.raw(text); + } else { + lastChild = this.node(name, attributes, text); + } + } + if (lastChild == null) { + throw new Error("Could not create any elements with: " + name); + } + return lastChild; + }; + + XMLNode.prototype.insertBefore = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.insertAfter = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.remove = function() { + var i, ref; + if (this.isRoot) { + throw new Error("Cannot remove the root element"); + } + i = this.parent.children.indexOf(this); + [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref; + return this.parent; + }; + + XMLNode.prototype.node = function(name, attributes, text) { + var child, ref; + if (name != null) { + name = name.valueOf(); + } + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + child = new XMLElement(this, name, attributes); + if (text != null) { + child.text(text); + } + this.children.push(child); + return child; + }; + + XMLNode.prototype.text = function(value) { + var child; + child = new XMLText(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.raw = function(value) { + var child; + child = new XMLRaw(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.declaration = function(version, encoding, standalone) { + var doc, xmldec; + doc = this.document(); + xmldec = new XMLDeclaration(doc, version, encoding, standalone); + doc.xmldec = xmldec; + return doc.root(); + }; + + XMLNode.prototype.doctype = function(pubID, sysID) { + var doc, doctype; + doc = this.document(); + doctype = new XMLDocType(doc, pubID, sysID); + doc.doctype = doctype; + return doctype; + }; + + XMLNode.prototype.up = function() { + if (this.isRoot) { + throw new Error("The root node has no parent. Use doc() if you need to get the document object."); + } + return this.parent; + }; + + XMLNode.prototype.root = function() { + var child; + if (this.isRoot) { + return this; + } + child = this.parent; + while (!child.isRoot) { + child = child.parent; + } + return child; + }; + + XMLNode.prototype.document = function() { + return this.root().documentObject; + }; + + XMLNode.prototype.end = function(options) { + return this.document().toString(options); + }; + + XMLNode.prototype.prev = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i < 1) { + throw new Error("Already at the first node"); + } + return this.parent.children[i - 1]; + }; + + XMLNode.prototype.next = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i === -1 || i === this.parent.children.length - 1) { + throw new Error("Already at the last node"); + } + return this.parent.children[i + 1]; + }; + + XMLNode.prototype.importXMLBuilder = function(xmlbuilder) { + var clonedRoot; + clonedRoot = xmlbuilder.root().clone(); + clonedRoot.parent = this; + clonedRoot.isRoot = false; + this.children.push(clonedRoot); + return this; + }; + + XMLNode.prototype.ele = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.txt = function(value) { + return this.text(value); + }; + + XMLNode.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.com = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.doc = function() { + return this.document(); + }; + + XMLNode.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLNode.prototype.dtd = function(pubID, sysID) { + return this.doctype(pubID, sysID); + }; + + XMLNode.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.t = function(value) { + return this.text(value); + }; + + XMLNode.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.c = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.r = function(value) { + return this.raw(value); + }; + + XMLNode.prototype.u = function() { + return this.up(); + }; + + return XMLNode; + + })(); + +}).call(this); + +},{"./XMLCData":65,"./XMLComment":66,"./XMLDeclaration":71,"./XMLDocType":72,"./XMLElement":73,"./XMLRaw":76,"./XMLText":78,"lodash/lang/isEmpty":50,"lodash/lang/isFunction":51,"lodash/lang/isObject":53}],75:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLProcessingInstruction, create; + + create = require('lodash/object/create'); + + module.exports = XMLProcessingInstruction = (function() { + function XMLProcessingInstruction(parent, target, value) { + this.stringify = parent.stringify; + if (target == null) { + throw new Error("Missing instruction target"); + } + this.target = this.stringify.insTarget(target); + if (value) { + this.value = this.stringify.insValue(value); + } + } + + XMLProcessingInstruction.prototype.clone = function() { + return create(XMLProcessingInstruction.prototype, this); + }; + + XMLProcessingInstruction.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLProcessingInstruction; + + })(); + +}).call(this); + +},{"lodash/object/create":57}],76:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLNode, XMLRaw, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLRaw = (function(superClass) { + extend(XMLRaw, superClass); + + function XMLRaw(parent, text) { + XMLRaw.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing raw text"); + } + this.value = this.stringify.raw(text); + } + + XMLRaw.prototype.clone = function() { + return create(XMLRaw.prototype, this); + }; + + XMLRaw.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += this.value; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLRaw; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":74,"lodash/object/create":57}],77:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLStringifier, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + hasProp = {}.hasOwnProperty; + + module.exports = XMLStringifier = (function() { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref, value; + this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0; + ref = (options != null ? options.stringify : void 0) || {}; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function(val) { + val = '' + val || ''; + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function(val) { + val = '' + val || ''; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function(val) { + val = '' + val || ''; + if (val.match(/]]>/)) { + throw new Error("Invalid CDATA text: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function(val) { + val = '' + val || ''; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attName = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attValue = function(val) { + val = '' + val || ''; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.insValue = function(val) { + val = '' + val || ''; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function(val) { + val = '' + val || ''; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function(val) { + val = '' + val || ''; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function(val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdSysID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdElementValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttType = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttDefault = function(val) { + if (val != null) { + return '' + val || ''; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdNData = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.convertAttKey = '@'; + + XMLStringifier.prototype.convertPIKey = '?'; + + XMLStringifier.prototype.convertTextKey = '#text'; + + XMLStringifier.prototype.convertCDataKey = '#cdata'; + + XMLStringifier.prototype.convertCommentKey = '#comment'; + + XMLStringifier.prototype.convertRawKey = '#raw'; + + XMLStringifier.prototype.assertLegalChar = function(str) { + var chars, chr; + if (this.allowSurrogateChars) { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; + } else { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; + } + chr = str.match(chars); + if (chr) { + throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); + } + return str; + }; + + XMLStringifier.prototype.elEscape = function(str) { + return str.replace(/&/g, '&').replace(//g, '>').replace(/\r/g, ' '); + }; + + XMLStringifier.prototype.attEscape = function(str) { + return str.replace(/&/g, '&').replace(/, + * and raw CDATA nodes. + * + * @param {Element} node + * @returns {Boolean} + * @api private + */ + +function shouldIgnoreNode (node) { + return node.nodeType === 3 // text + || node.nodeType === 8 // comment + || node.nodeType === 4; // cdata +} + + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @returns {Mixed} the decoded value from the Plist XML + * @api public + */ + +function parse (xml) { + var doc = new DOMParser().parseFromString(xml); + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + var plist = parsePlistXML(doc.documentElement); + + // the root node gets interpreted as an Array, + // so pull out the inner data first + if (plist.length == 1) plist = plist[0]; + + return plist; +} + +/** + * Parses a Plist XML string. Returns an Object. Takes a `callback` function. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated not actually async. use parse() instead + */ + +function parseString (xml, callback) { + var doc, error, plist; + try { + doc = new DOMParser().parseFromString(xml); + plist = parsePlistXML(doc.documentElement); + } catch(e) { + error = e; + } + callback(error, plist); +} + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated use parse() instead + */ + +function parseStringSync (xml) { + var doc = new DOMParser().parseFromString(xml); + var plist; + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + plist = parsePlistXML(doc.documentElement); + + // if the plist is an array with 1 element, pull it out of the array + if (plist.length == 1) { + plist = plist[0]; + } + return plist; +} + +/** + * Convert an XML based plist document into a JSON representation. + * + * @param {Object} xml_node - current XML node in the plist + * @returns {Mixed} built up JSON object + * @api private + */ + +function parsePlistXML (node) { + var i, new_obj, key, val, new_arr, res, d; + + if (!node) + return null; + + if (node.nodeName === 'plist') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + new_arr.push( parsePlistXML(node.childNodes[i])); + } + } + return new_arr; + + } else if (node.nodeName === 'dict') { + new_obj = {}; + key = null; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + if (key === null) { + key = parsePlistXML(node.childNodes[i]); + } else { + new_obj[key] = parsePlistXML(node.childNodes[i]); + key = null; + } + } + } + return new_obj; + + } else if (node.nodeName === 'array') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + res = parsePlistXML(node.childNodes[i]); + if (null != res) new_arr.push(res); + } + } + return new_arr; + + } else if (node.nodeName === '#text') { + // TODO: what should we do with text types? (CDATA sections) + + } else if (node.nodeName === 'key') { + return node.childNodes[0].nodeValue; + + } else if (node.nodeName === 'string') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + res += node.childNodes[d].nodeValue; + } + return res; + + } else if (node.nodeName === 'integer') { + // parse as base 10 integer + return parseInt(node.childNodes[0].nodeValue, 10); + + } else if (node.nodeName === 'real') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue; + } + } + return parseFloat(res); + + } else if (node.nodeName === 'data') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue.replace(/\s+/g, ''); + } + } + + // decode base64 data to a Buffer instance + return new Buffer(res, 'base64'); + + } else if (node.nodeName === 'date') { + return new Date(node.childNodes[0].nodeValue); + + } else if (node.nodeName === 'true') { + return true; + + } else if (node.nodeName === 'false') { + return false; + } +} + +}).call(this,require("buffer").Buffer) +},{"buffer":3,"util-deprecate":6,"xmldom":7}],2:[function(require,module,exports){ +var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],3:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('is-array') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 +Buffer.poolSize = 8192 // not used by this implementation + +var rootParent = {} + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +function typedArraySupport () { + function Bar () {} + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + arr.constructor = Bar + return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +/** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ +function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + this.length = 0 + this.parent = undefined + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) +} + +function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that +} + +function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) +} + +function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that +} + +function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Duplicate of fromArray() to keep fromArray() monomorphic. +function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that +} + +function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. +// Returns a zero-length buffer for inputs that don't conform to the spec. +function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array +} + +function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that +} + +function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf +} + +function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +// pre-set for values that may exist in the future +Buffer.prototype.length = undefined +Buffer.prototype.parent = undefined + +function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') +} + +// `get` is deprecated +Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) +} + +// `set` is deprecated +Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len +} + +// fill(value, start=0, end=buffer.length) +Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this +} + +/** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ +Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } +} + +// HELPER FUNCTIONS +// ================ + +var BP = Buffer.prototype + +/** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ +Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr +} + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":2,"ieee754":4,"is-array":5}],4:[function(require,module,exports){ +exports.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) +} + +exports.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 +} + +},{}],5:[function(require,module,exports){ + +/** + * isArray + */ + +var isArray = Array.isArray; + +/** + * toString + */ + +var str = Object.prototype.toString; + +/** + * Whether or not the given `val` + * is an array. + * + * example: + * + * isArray([]); + * // > true + * isArray(arguments); + * // > false + * isArray(''); + * // > false + * + * @param {mixed} val + * @return {bool} + */ + +module.exports = isArray || function (val) { + return !! val && '[object Array]' == str.call(val); +}; + +},{}],6:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],7:[function(require,module,exports){ +function DOMParser(options){ + this.options = options ||{locator:{}}; + +} +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid document source"); + } + return domBuilder.document; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn){ + if(isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + }else{ + var i=arguments.length; + while(--i){ + if(fn = errorImpl[arguments[i]]){ + break; + } + } + } + } + errorHandler[key] = fn && function(msg){ + fn(msg+_locator(locator)); + }||function(){}; + } + build('warning','warn'); + build('error','warn','warning'); + build('fatalError','warn','warning','error'); + return errorHandler; +} +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.document = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.document.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.document; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + if( attr.getOffset){ + position(attr.getOffset(1),attr) + } + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.document.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(this.currentElement && chars){ + if (this.cdata) { + var charNode = this.document.createCDATASection(chars); + this.currentElement.appendChild(charNode); + } else { + var charNode = this.document.createTextNode(chars); + this.currentElement.appendChild(charNode); + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.document.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.document.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.document.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn(error,_locator(this.locator)); + }, + error:function(error) { + console.error(error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error(error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.document.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +} + +},{"./dom":8,"./sax":9}],8:[function(require,module,exports){ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + } +}; +function LiveNodeList(node,refresh){ + this._node = node; + this._refresh = refresh + _updateLiveList(this); +} +function _updateLiveList(list){ + var inc = list._node._inc || list._node.ownerDocument._inc; + if(list._inc != inc){ + var ls = list._refresh(list._node); + //console.log(ls.length) + __set__(list,'length',ls.length); + copy(ls,list); + list._inc = inc; + } +} +LiveNodeList.prototype.item = function(i){ + _updateLiveList(this); + return this[i]; +} + +_extends(LiveNodeList,NodeList); +/** + * + * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes. + * NamedNodeMap objects in the DOM are live. + * used for attributes or DocumentType entities + */ +function NamedNodeMap() { +}; + +function _findNodeIndex(list,node){ + var i = list.length; + while(i--){ + if(list[i] === node){return i} + } +} + +function _addNamedNode(el,list,newAttr,oldAttr){ + if(oldAttr){ + list[_findNodeIndex(list,oldAttr)] = newAttr; + }else{ + list[list.length++] = newAttr; + } + if(el){ + newAttr.ownerElement = el; + var doc = el.ownerDocument; + if(doc){ + oldAttr && _onRemoveAttribute(doc,el,oldAttr); + _onAddAttribute(doc,el,newAttr); + } + } +} +function _removeNamedNode(el,list,attr){ + var i = _findNodeIndex(list,attr); + if(i>=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + var i = this.length; + while(i--){ + var attr = this[i]; + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + doc.implementation = this; + doc.childNodes = new NodeList(); + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == 1){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == 1){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + //if(!(newChild instanceof CharacterData)){ + throw new Error(ExceptionMessage[3]) + //} + return Node.prototype.appendChild.apply(this,arguments) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node){ + var buf = []; + serializeToString(node,buf); + return buf.join(''); +} +Node.prototype.toString =function(){ + return XMLSerializer.prototype.serializeToString(this); +} +function serializeToString(node,buf){ + switch(node.nodeType){ + case ELEMENT_NODE: + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + var isHTML = htmlns === node.namespaceURI + buf.push('<',nodeName); + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + if(child){ + buf.push(child.data); + } + }else{ + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + function position(start,m){ + while(start>=endPos && (m = linePattern.exec(source))){ + startPos = m.index; + endPos = startPos + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = start-startPos+1; + } + var startPos = 0; + var endPos = 0; + var linePattern = /.+(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + var i = source.indexOf('<',start); + if(i<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.document; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(i>start){ + appendText(i); + } + switch(source.charAt(i+1)){ + case '/': + var end = source.indexOf('>',i+3); + var tagName = source.substring(i+2,end); + var config = parseStack.pop(); + var localNSMap = config.localNSMap; + + if(config.tagName != tagName){ + errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); + } + domBuilder.endElement(config.uri,config.localName,tagName); + if(localNSMap){ + for(var prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) ; + } + } + end++; + break; + // end elment + case '?':// + locator&&position(i); + end = parseInstruction(source,i,domBuilder); + break; + case '!':// 0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_E; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_V){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_E + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + s = S_C; + el.closed = true; + case S_V: + case S_ATTR: + case S_ATTR_S: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + break;//normal + case S_V://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_S: + if(s === S_ATTR_S){ + value = attrName; + } + if(s == S_V){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_S; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_S; + break; + case S_V: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_E: + s = S_S; + break; + //case S_S: + //case S_EQ: + //case S_ATTR_S: + // void();break; + //case S_C: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_V +//S_ATTR_S, S_E, S_S, S_C + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_V:void();break; + case S_ATTR_S: + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!') + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_E: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_S: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_V; + start = p; + break; + case S_C: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + } + p++; + } +} +/** + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function appendElement(el,domBuilder,parseStack){ + var tagName = el.tagName; + var localNSMap = null; + var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + parseStack.push(el); + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = closeMap[tagName] = source.lastIndexOf('') + } + return pos',start+4); + //append comment source.substring(4,end)//, + * and raw CDATA nodes. + * + * @param {Element} node + * @returns {Boolean} + * @api private + */ + +function shouldIgnoreNode (node) { + return node.nodeType === 3 // text + || node.nodeType === 8 // comment + || node.nodeType === 4; // cdata +} + + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @returns {Mixed} the decoded value from the Plist XML + * @api public + */ + +function parse (xml) { + var doc = new DOMParser().parseFromString(xml); + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + var plist = parsePlistXML(doc.documentElement); + + // the root node gets interpreted as an Array, + // so pull out the inner data first + if (plist.length == 1) plist = plist[0]; + + return plist; +} + +/** + * Parses a Plist XML string. Returns an Object. Takes a `callback` function. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated not actually async. use parse() instead + */ + +function parseString (xml, callback) { + var doc, error, plist; + try { + doc = new DOMParser().parseFromString(xml); + plist = parsePlistXML(doc.documentElement); + } catch(e) { + error = e; + } + callback(error, plist); +} + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @param {Function} callback - callback function + * @returns {Mixed} the decoded value from the Plist XML + * @api public + * @deprecated use parse() instead + */ + +function parseStringSync (xml) { + var doc = new DOMParser().parseFromString(xml); + var plist; + if (doc.documentElement.nodeName !== 'plist') { + throw new Error('malformed document. First element should be '); + } + plist = parsePlistXML(doc.documentElement); + + // if the plist is an array with 1 element, pull it out of the array + if (plist.length == 1) { + plist = plist[0]; + } + return plist; +} + +/** + * Convert an XML based plist document into a JSON representation. + * + * @param {Object} xml_node - current XML node in the plist + * @returns {Mixed} built up JSON object + * @api private + */ + +function parsePlistXML (node) { + var i, new_obj, key, val, new_arr, res, d; + + if (!node) + return null; + + if (node.nodeName === 'plist') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + new_arr.push( parsePlistXML(node.childNodes[i])); + } + } + return new_arr; + + } else if (node.nodeName === 'dict') { + new_obj = {}; + key = null; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + if (key === null) { + key = parsePlistXML(node.childNodes[i]); + } else { + new_obj[key] = parsePlistXML(node.childNodes[i]); + key = null; + } + } + } + return new_obj; + + } else if (node.nodeName === 'array') { + new_arr = []; + for (i=0; i < node.childNodes.length; i++) { + // ignore comment nodes (text) + if (!shouldIgnoreNode(node.childNodes[i])) { + res = parsePlistXML(node.childNodes[i]); + if (null != res) new_arr.push(res); + } + } + return new_arr; + + } else if (node.nodeName === '#text') { + // TODO: what should we do with text types? (CDATA sections) + + } else if (node.nodeName === 'key') { + return node.childNodes[0].nodeValue; + + } else if (node.nodeName === 'string') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + res += node.childNodes[d].nodeValue; + } + return res; + + } else if (node.nodeName === 'integer') { + // parse as base 10 integer + return parseInt(node.childNodes[0].nodeValue, 10); + + } else if (node.nodeName === 'real') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue; + } + } + return parseFloat(res); + + } else if (node.nodeName === 'data') { + res = ''; + for (d=0; d < node.childNodes.length; d++) { + if (node.childNodes[d].nodeType === 3) { + res += node.childNodes[d].nodeValue.replace(/\s+/g, ''); + } + } + + // decode base64 data to a Buffer instance + return new Buffer(res, 'base64'); + + } else if (node.nodeName === 'date') { + return new Date(node.childNodes[0].nodeValue); + + } else if (node.nodeName === 'true') { + return true; + + } else if (node.nodeName === 'false') { + return false; + } +} + +}).call(this,require("buffer").Buffer) +},{"buffer":7,"util-deprecate":70,"xmldom":88}],4:[function(require,module,exports){ + +var i; + +/** + * Parser functions. + */ + +var parserFunctions = require('./parse'); +for (i in parserFunctions) exports[i] = parserFunctions[i]; + +/** + * Builder functions. + */ + +var builderFunctions = require('./build'); +for (i in builderFunctions) exports[i] = builderFunctions[i]; + +/** + * Add Node.js-specific functions (they're deprecated…). + */ + +var nodeFunctions = require('./node'); +for (i in nodeFunctions) exports[i] = nodeFunctions[i]; + +},{"./build":1,"./node":2,"./parse":3}],5:[function(require,module,exports){ +var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 +}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) + +},{}],6:[function(require,module,exports){ + +},{}],7:[function(require,module,exports){ +(function (global){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +var base64 = require('base64-js') +var ieee754 = require('ieee754') +var isArray = require('is-array') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 +Buffer.poolSize = 8192 // not used by this implementation + +var rootParent = {} + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + +function typedArraySupport () { + function Bar () {} + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + arr.constructor = Bar + return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} + +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} + +/** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ +function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + this.length = 0 + this.parent = undefined + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) +} + +function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that +} + +function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) +} + +function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that +} + +function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Duplicate of fromArray() to keep fromArray() monomorphic. +function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that +} + +function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. +// Returns a zero-length buffer for inputs that don't conform to the spec. +function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array +} + +function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that +} + +function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf +} + +function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +// pre-set for values that may exist in the future +Buffer.prototype.length = undefined +Buffer.prototype.parent = undefined + +function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') +} + +// `get` is deprecated +Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) +} + +// `set` is deprecated +Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len +} + +// fill(value, start=0, end=buffer.length) +Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this +} + +/** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ +Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } +} + +// HELPER FUNCTIONS +// ================ + +var BP = Buffer.prototype + +/** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ +Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr +} + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"base64-js":5,"ieee754":8,"is-array":9}],8:[function(require,module,exports){ +exports.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) +} + +exports.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 +} + +},{}],9:[function(require,module,exports){ + +/** + * isArray + */ + +var isArray = Array.isArray; + +/** + * toString + */ + +var str = Object.prototype.toString; + +/** + * Whether or not the given `val` + * is an array. + * + * example: + * + * isArray([]); + * // > true + * isArray(arguments); + * // > false + * isArray(''); + * // > false + * + * @param {mixed} val + * @return {bool} + */ + +module.exports = isArray || function (val) { + return !! val && '[object Array]' == str.call(val); +}; + +},{}],10:[function(require,module,exports){ +/** + * Determine if an object is Buffer + * + * Author: Feross Aboukhadijeh + * License: MIT + * + * `npm install is-buffer` + */ + +module.exports = function (obj) { + return !!(obj != null && + (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) + (obj.constructor && + typeof obj.constructor.isBuffer === 'function' && + obj.constructor.isBuffer(obj)) + )) +} + +},{}],11:[function(require,module,exports){ +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; +} + +module.exports = last; + +},{}],12:[function(require,module,exports){ +var arrayEvery = require('../internal/arrayEvery'), + baseCallback = require('../internal/baseCallback'), + baseEvery = require('../internal/baseEvery'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * The predicate is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.every(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = baseCallback(predicate, thisArg, 3); + } + return func(collection, predicate); +} + +module.exports = every; + +},{"../internal/arrayEvery":14,"../internal/baseCallback":18,"../internal/baseEvery":22,"../internal/isIterateeCall":47,"../lang/isArray":56}],13:[function(require,module,exports){ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as an array. + * + * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.restParam(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ +function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; +} + +module.exports = restParam; + +},{}],14:[function(require,module,exports){ +/** + * A specialized version of `_.every` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ +function arrayEvery(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; +} + +module.exports = arrayEvery; + +},{}],15:[function(require,module,exports){ +/** + * A specialized version of `_.some` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +module.exports = arraySome; + +},{}],16:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** + * A specialized version of `_.assign` for customizing assigned values without + * support for argument juggling, multiple sources, and `this` binding `customizer` + * functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + */ +function assignWith(object, source, customizer) { + var index = -1, + props = keys(source), + length = props.length; + + while (++index < length) { + var key = props[index], + value = object[key], + result = customizer(value, source[key], key, object, source); + + if ((result === result ? (result !== value) : (value === value)) || + (value === undefined && !(key in object))) { + object[key] = result; + } + } + return object; +} + +module.exports = assignWith; + +},{"../object/keys":65}],17:[function(require,module,exports){ +var baseCopy = require('./baseCopy'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); +} + +module.exports = baseAssign; + +},{"../object/keys":65,"./baseCopy":19}],18:[function(require,module,exports){ +var baseMatches = require('./baseMatches'), + baseMatchesProperty = require('./baseMatchesProperty'), + bindCallback = require('./bindCallback'), + identity = require('../utility/identity'), + property = require('../utility/property'); + +/** + * The base implementation of `_.callback` which supports specifying the + * number of arguments to provide to `func`. + * + * @private + * @param {*} [func=_.identity] The value to convert to a callback. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function baseCallback(func, thisArg, argCount) { + var type = typeof func; + if (type == 'function') { + return thisArg === undefined + ? func + : bindCallback(func, thisArg, argCount); + } + if (func == null) { + return identity; + } + if (type == 'object') { + return baseMatches(func); + } + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); +} + +module.exports = baseCallback; + +},{"../utility/identity":68,"../utility/property":69,"./baseMatches":29,"./baseMatchesProperty":30,"./bindCallback":35}],19:[function(require,module,exports){ +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ +function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; +} + +module.exports = baseCopy; + +},{}],20:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; +}()); + +module.exports = baseCreate; + +},{"../lang/isObject":60}],21:[function(require,module,exports){ +var baseForOwn = require('./baseForOwn'), + createBaseEach = require('./createBaseEach'); + +/** + * The base implementation of `_.forEach` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object|string} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +module.exports = baseEach; + +},{"./baseForOwn":24,"./createBaseEach":37}],22:[function(require,module,exports){ +var baseEach = require('./baseEach'); + +/** + * The base implementation of `_.every` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ +function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; +} + +module.exports = baseEvery; + +},{"./baseEach":21}],23:[function(require,module,exports){ +var createBaseFor = require('./createBaseFor'); + +/** + * The base implementation of `baseForIn` and `baseForOwn` which iterates + * over `object` properties returned by `keysFunc` invoking `iteratee` for + * each property. Iteratee functions may exit iteration early by explicitly + * returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +module.exports = baseFor; + +},{"./createBaseFor":38}],24:[function(require,module,exports){ +var baseFor = require('./baseFor'), + keys = require('../object/keys'); + +/** + * The base implementation of `_.forOwn` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return baseFor(object, iteratee, keys); +} + +module.exports = baseForOwn; + +},{"../object/keys":65,"./baseFor":23}],25:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * The base implementation of `get` without support for string paths + * and default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path of the property to get. + * @param {string} [pathKey] The key representation of path. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[path[index++]]; + } + return (index && index == length) ? object : undefined; +} + +module.exports = baseGet; + +},{"./toObject":53}],26:[function(require,module,exports){ +var baseIsEqualDeep = require('./baseIsEqualDeep'), + isObject = require('../lang/isObject'), + isObjectLike = require('./isObjectLike'); + +/** + * The base implementation of `_.isEqual` without support for `this` binding + * `customizer` functions. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); +} + +module.exports = baseIsEqual; + +},{"../lang/isObject":60,"./baseIsEqualDeep":27,"./isObjectLike":50}],27:[function(require,module,exports){ +var equalArrays = require('./equalArrays'), + equalByTag = require('./equalByTag'), + equalObjects = require('./equalObjects'), + isArray = require('../lang/isArray'), + isTypedArray = require('../lang/isTypedArray'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing objects. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA=[]] Tracks traversed `value` objects. + * @param {Array} [stackB=[]] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + // Assume cyclic values are equal. + // For more information on detecting circular references see https://es5.github.io/#JO. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + // Add `object` and `other` to the stack of traversed objects. + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; +} + +module.exports = baseIsEqualDeep; + +},{"../lang/isArray":56,"../lang/isTypedArray":62,"./equalArrays":39,"./equalByTag":40,"./equalObjects":41}],28:[function(require,module,exports){ +var baseIsEqual = require('./baseIsEqual'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.isMatch` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} matchData The propery names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparing objects. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = toObject(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { + return false; + } + } + } + return true; +} + +module.exports = baseIsMatch; + +},{"./baseIsEqual":26,"./toObject":53}],29:[function(require,module,exports){ +var baseIsMatch = require('./baseIsMatch'), + getMatchData = require('./getMatchData'), + toObject = require('./toObject'); + +/** + * The base implementation of `_.matches` which does not clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + var key = matchData[0][0], + value = matchData[0][1]; + + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; + } + return function(object) { + return baseIsMatch(object, matchData); + }; +} + +module.exports = baseMatches; + +},{"./baseIsMatch":28,"./getMatchData":43,"./toObject":53}],30:[function(require,module,exports){ +var baseGet = require('./baseGet'), + baseIsEqual = require('./baseIsEqual'), + baseSlice = require('./baseSlice'), + isArray = require('../lang/isArray'), + isKey = require('./isKey'), + isStrictComparable = require('./isStrictComparable'), + last = require('../array/last'), + toObject = require('./toObject'), + toPath = require('./toPath'); + +/** + * The base implementation of `_.matchesProperty` which does not clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to compare. + * @returns {Function} Returns the new function. + */ +function baseMatchesProperty(path, srcValue) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(srcValue), + pathKey = (path + ''); + + path = toPath(path); + return function(object) { + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === srcValue + ? (srcValue !== undefined || (key in object)) + : baseIsEqual(srcValue, object[key], undefined, true); + }; +} + +module.exports = baseMatchesProperty; + +},{"../array/last":11,"../lang/isArray":56,"./baseGet":25,"./baseIsEqual":26,"./baseSlice":33,"./isKey":48,"./isStrictComparable":51,"./toObject":53,"./toPath":54}],31:[function(require,module,exports){ +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +module.exports = baseProperty; + +},{}],32:[function(require,module,exports){ +var baseGet = require('./baseGet'), + toPath = require('./toPath'); + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + */ +function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; +} + +module.exports = basePropertyDeep; + +},{"./baseGet":25,"./toPath":54}],33:[function(require,module,exports){ +/** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; +} + +module.exports = baseSlice; + +},{}],34:[function(require,module,exports){ +/** + * Converts `value` to a string if it's not one. An empty string is returned + * for `null` or `undefined` values. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + return value == null ? '' : (value + ''); +} + +module.exports = baseToString; + +},{}],35:[function(require,module,exports){ +var identity = require('../utility/identity'); + +/** + * A specialized version of `baseCallback` which only supports `this` binding + * and specifying the number of arguments to provide to `func`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; +} + +module.exports = bindCallback; + +},{"../utility/identity":68}],36:[function(require,module,exports){ +var bindCallback = require('./bindCallback'), + isIterateeCall = require('./isIterateeCall'), + restParam = require('../function/restParam'); + +/** + * Creates a `_.assign`, `_.defaults`, or `_.merge` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 ? sources[length - 2] : undefined, + guard = length > 2 ? sources[2] : undefined, + thisArg = length > 1 ? sources[length - 1] : undefined; + + if (typeof customizer == 'function') { + customizer = bindCallback(customizer, thisArg, 5); + length -= 2; + } else { + customizer = typeof thisArg == 'function' ? thisArg : undefined; + length -= (customizer ? 1 : 0); + } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, customizer); + } + } + return object; + }); +} + +module.exports = createAssigner; + +},{"../function/restParam":13,"./bindCallback":35,"./isIterateeCall":47}],37:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'), + toObject = require('./toObject'); + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + return eachFunc(collection, iteratee); + } + var index = fromRight ? length : -1, + iterable = toObject(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +module.exports = createBaseEach; + +},{"./getLength":42,"./isLength":49,"./toObject":53}],38:[function(require,module,exports){ +var toObject = require('./toObject'); + +/** + * Creates a base function for `_.forIn` or `_.forInRight`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var iterable = toObject(object), + props = keysFunc(object), + length = props.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + var key = props[index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +module.exports = createBaseFor; + +},{"./toObject":53}],39:[function(require,module,exports){ +var arraySome = require('./arraySome'); + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing arrays. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; + + if (result !== undefined) { + if (result) { + continue; + } + return false; + } + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; + } + } + return true; +} + +module.exports = equalArrays; + +},{"./arraySome":15}],40:[function(require,module,exports){ +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + // Coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + // Treat `NaN` vs. `NaN` as equal. + return (object != +object) + ? other != +other + : object == +other; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings primitives and string + // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. + return object == (other + ''); + } + return false; +} + +module.exports = equalByTag; + +},{}],41:[function(require,module,exports){ +var keys = require('../object/keys'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; + + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; +} + +module.exports = equalObjects; + +},{"../object/keys":65}],42:[function(require,module,exports){ +var baseProperty = require('./baseProperty'); + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +module.exports = getLength; + +},{"./baseProperty":31}],43:[function(require,module,exports){ +var isStrictComparable = require('./isStrictComparable'), + pairs = require('../object/pairs'); + +/** + * Gets the propery names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = pairs(object), + length = result.length; + + while (length--) { + result[length][2] = isStrictComparable(result[length][1]); + } + return result; +} + +module.exports = getMatchData; + +},{"../object/pairs":67,"./isStrictComparable":51}],44:[function(require,module,exports){ +var isNative = require('../lang/isNative'); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +module.exports = getNative; + +},{"../lang/isNative":59}],45:[function(require,module,exports){ +var getLength = require('./getLength'), + isLength = require('./isLength'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +module.exports = isArrayLike; + +},{"./getLength":42,"./isLength":49}],46:[function(require,module,exports){ +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +module.exports = isIndex; + +},{}],47:[function(require,module,exports){ +var isArrayLike = require('./isArrayLike'), + isIndex = require('./isIndex'), + isObject = require('../lang/isObject'); + +/** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; +} + +module.exports = isIterateeCall; + +},{"../lang/isObject":60,"./isArrayLike":45,"./isIndex":46}],48:[function(require,module,exports){ +var isArray = require('../lang/isArray'), + toObject = require('./toObject'); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); +} + +module.exports = isKey; + +},{"../lang/isArray":56,"./toObject":53}],49:[function(require,module,exports){ +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +module.exports = isLength; + +},{}],50:[function(require,module,exports){ +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isObjectLike; + +},{}],51:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +module.exports = isStrictComparable; + +},{"../lang/isObject":60}],52:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('./isIndex'), + isLength = require('./isLength'), + keysIn = require('../object/keysIn'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} + +module.exports = shimKeys; + +},{"../lang/isArguments":55,"../lang/isArray":56,"../object/keysIn":66,"./isIndex":46,"./isLength":49}],53:[function(require,module,exports){ +var isObject = require('../lang/isObject'); + +/** + * Converts `value` to an object if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Object} Returns the object. + */ +function toObject(value) { + return isObject(value) ? value : Object(value); +} + +module.exports = toObject; + +},{"../lang/isObject":60}],54:[function(require,module,exports){ +var baseToString = require('./baseToString'), + isArray = require('../lang/isArray'); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `value` to property path array if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array} Returns the property path array. + */ +function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +} + +module.exports = toPath; + +},{"../lang/isArray":56,"./baseToString":34}],55:[function(require,module,exports){ +var isArrayLike = require('../internal/isArrayLike'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Native method references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is classified as an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); +} + +module.exports = isArguments; + +},{"../internal/isArrayLike":45,"../internal/isObjectLike":50}],56:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; + +module.exports = isArray; + +},{"../internal/getNative":44,"../internal/isLength":49,"../internal/isObjectLike":50}],57:[function(require,module,exports){ +var isArguments = require('./isArguments'), + isArray = require('./isArray'), + isArrayLike = require('../internal/isArrayLike'), + isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'), + isString = require('./isString'), + keys = require('../object/keys'); + +/** + * Checks if `value` is empty. A value is considered empty unless it's an + * `arguments` object, array, string, or jQuery-like collection with a length + * greater than `0` or an object with own enumerable properties. + * + * @static + * @memberOf _ + * @category Lang + * @param {Array|Object|string} value The value to inspect. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || + (isObjectLike(value) && isFunction(value.splice)))) { + return !value.length; + } + return !keys(value).length; +} + +module.exports = isEmpty; + +},{"../internal/isArrayLike":45,"../internal/isObjectLike":50,"../object/keys":65,"./isArguments":55,"./isArray":56,"./isFunction":58,"./isString":61}],58:[function(require,module,exports){ +var isObject = require('./isObject'); + +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 which returns 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +module.exports = isFunction; + +},{"./isObject":60}],59:[function(require,module,exports){ +var isFunction = require('./isFunction'), + isObjectLike = require('../internal/isObjectLike'); + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = isNative; + +},{"../internal/isObjectLike":50,"./isFunction":58}],60:[function(require,module,exports){ +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = isObject; + +},{}],61:[function(require,module,exports){ +var isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); +} + +module.exports = isString; + +},{"../internal/isObjectLike":50}],62:[function(require,module,exports){ +var isLength = require('../internal/isLength'), + isObjectLike = require('../internal/isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dateTag] = typedArrayTags[errorTag] = +typedArrayTags[funcTag] = typedArrayTags[mapTag] = +typedArrayTags[numberTag] = typedArrayTags[objectTag] = +typedArrayTags[regexpTag] = typedArrayTags[setTag] = +typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +function isTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; +} + +module.exports = isTypedArray; + +},{"../internal/isLength":49,"../internal/isObjectLike":50}],63:[function(require,module,exports){ +var assignWith = require('../internal/assignWith'), + baseAssign = require('../internal/baseAssign'), + createAssigner = require('../internal/createAssigner'); + +/** + * Assigns own enumerable properties of source object(s) to the destination + * object. Subsequent sources overwrite property assignments of previous sources. + * If `customizer` is provided it's invoked to produce the assigned values. + * The `customizer` is bound to `thisArg` and invoked with five arguments: + * (objectValue, sourceValue, key, object, source). + * + * **Note:** This method mutates `object` and is based on + * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign). + * + * @static + * @memberOf _ + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); + * // => { 'user': 'fred', 'age': 40 } + * + * // using a customizer callback + * var defaults = _.partialRight(_.assign, function(value, other) { + * return _.isUndefined(value) ? other : value; + * }); + * + * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); + * // => { 'user': 'barney', 'age': 36 } + */ +var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); +}); + +module.exports = assign; + +},{"../internal/assignWith":16,"../internal/baseAssign":17,"../internal/createAssigner":36}],64:[function(require,module,exports){ +var baseAssign = require('../internal/baseAssign'), + baseCreate = require('../internal/baseCreate'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; +} + +module.exports = create; + +},{"../internal/baseAssign":17,"../internal/baseCreate":20,"../internal/isIterateeCall":47}],65:[function(require,module,exports){ +var getNative = require('../internal/getNative'), + isArrayLike = require('../internal/isArrayLike'), + isObject = require('../lang/isObject'), + shimKeys = require('../internal/shimKeys'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; +}; + +module.exports = keys; + +},{"../internal/getNative":44,"../internal/isArrayLike":45,"../internal/shimKeys":52,"../lang/isObject":60}],66:[function(require,module,exports){ +var isArguments = require('../lang/isArguments'), + isArray = require('../lang/isArray'), + isIndex = require('../internal/isIndex'), + isLength = require('../internal/isLength'), + isObject = require('../lang/isObject'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = keysIn; + +},{"../internal/isIndex":46,"../internal/isLength":49,"../lang/isArguments":55,"../lang/isArray":56,"../lang/isObject":60}],67:[function(require,module,exports){ +var keys = require('./keys'), + toObject = require('../internal/toObject'); + +/** + * Creates a two dimensional array of the key-value pairs for `object`, + * e.g. `[[key1, value1], [key2, value2]]`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the new array of key-value pairs. + * @example + * + * _.pairs({ 'barney': 36, 'fred': 40 }); + * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) + */ +function pairs(object) { + object = toObject(object); + + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + var key = props[index]; + result[index] = [key, object[key]]; + } + return result; +} + +module.exports = pairs; + +},{"../internal/toObject":53,"./keys":65}],68:[function(require,module,exports){ +/** + * This method returns the first argument provided to it. + * + * @static + * @memberOf _ + * @category Utility + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'user': 'fred' }; + * + * _.identity(object) === object; + * // => true + */ +function identity(value) { + return value; +} + +module.exports = identity; + +},{}],69:[function(require,module,exports){ +var baseProperty = require('../internal/baseProperty'), + basePropertyDeep = require('../internal/basePropertyDeep'), + isKey = require('../internal/isKey'); + +/** + * Creates a function that returns the property value at `path` on a + * given object. + * + * @static + * @memberOf _ + * @category Utility + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + * @example + * + * var objects = [ + * { 'a': { 'b': { 'c': 2 } } }, + * { 'a': { 'b': { 'c': 1 } } } + * ]; + * + * _.map(objects, _.property('a.b.c')); + * // => [2, 1] + * + * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); + * // => [1, 2] + */ +function property(path) { + return isKey(path) ? baseProperty(path) : basePropertyDeep(path); +} + +module.exports = property; + +},{"../internal/baseProperty":31,"../internal/basePropertyDeep":32,"../internal/isKey":48}],70:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],71:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, create; + + create = require('lodash/object/create'); + + module.exports = XMLAttribute = (function() { + function XMLAttribute(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing attribute name of element " + parent.name); + } + if (value == null) { + throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); + } + this.name = this.stringify.attName(name); + this.value = this.stringify.attValue(value); + } + + XMLAttribute.prototype.clone = function() { + return create(XMLAttribute.prototype, this); + }; + + XMLAttribute.prototype.toString = function(options, level) { + return ' ' + this.name + '="' + this.value + '"'; + }; + + return XMLAttribute; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],72:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier; + + XMLStringifier = require('./XMLStringifier'); + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLElement = require('./XMLElement'); + + module.exports = XMLBuilder = (function() { + function XMLBuilder(name, options) { + var root, temp; + if (name == null) { + throw new Error("Root element needs a name"); + } + if (options == null) { + options = {}; + } + this.options = options; + this.stringify = new XMLStringifier(options); + temp = new XMLElement(this, 'doc'); + root = temp.element(name); + root.isRoot = true; + root.documentObject = this; + this.rootObject = root; + if (!options.headless) { + root.declaration(options); + if ((options.pubID != null) || (options.sysID != null)) { + root.doctype(options); + } + } + } + + XMLBuilder.prototype.root = function() { + return this.rootObject; + }; + + XMLBuilder.prototype.end = function(options) { + return this.toString(options); + }; + + XMLBuilder.prototype.toString = function(options) { + var indent, newline, offset, pretty, r, ref, ref1, ref2; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + r = ''; + if (this.xmldec != null) { + r += this.xmldec.toString(options); + } + if (this.doctype != null) { + r += this.doctype.toString(options); + } + r += this.rootObject.toString(options); + if (pretty && r.slice(-newline.length) === newline) { + r = r.slice(0, -newline.length); + } + return r; + }; + + return XMLBuilder; + + })(); + +}).call(this); + +},{"./XMLDeclaration":79,"./XMLDocType":80,"./XMLElement":81,"./XMLStringifier":85}],73:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLCData = (function(superClass) { + extend(XMLCData, superClass); + + function XMLCData(parent, text) { + XMLCData.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing CDATA text"); + } + this.text = this.stringify.cdata(text); + } + + XMLCData.prototype.clone = function() { + return create(XMLCData.prototype, this); + }; + + XMLCData.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLCData; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/object/create":64}],74:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLComment, XMLNode, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLComment = (function(superClass) { + extend(XMLComment, superClass); + + function XMLComment(parent, text) { + XMLComment.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing comment text"); + } + this.text = this.stringify.comment(text); + } + + XMLComment.prototype.clone = function() { + return create(XMLComment.prototype, this); + }; + + XMLComment.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLComment; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/object/create":64}],75:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDAttList, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDAttList = (function() { + function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { + this.stringify = parent.stringify; + if (elementName == null) { + throw new Error("Missing DTD element name"); + } + if (attributeName == null) { + throw new Error("Missing DTD attribute name"); + } + if (!attributeType) { + throw new Error("Missing DTD attribute type"); + } + if (!defaultValueType) { + throw new Error("Missing DTD attribute default"); + } + if (defaultValueType.indexOf('#') !== 0) { + defaultValueType = '#' + defaultValueType; + } + if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { + throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); + } + if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { + throw new Error("Default value only applies to #FIXED or #DEFAULT"); + } + this.elementName = this.stringify.eleName(elementName); + this.attributeName = this.stringify.attName(attributeName); + this.attributeType = this.stringify.dtdAttType(attributeType); + this.defaultValue = this.stringify.dtdAttDefault(defaultValue); + this.defaultValueType = defaultValueType; + } + + XMLDTDAttList.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDAttList; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],76:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDElement, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDElement = (function() { + function XMLDTDElement(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing DTD element name"); + } + if (!value) { + value = '(#PCDATA)'; + } + if (Array.isArray(value)) { + value = '(' + value.join(',') + ')'; + } + this.name = this.stringify.eleName(name); + this.value = this.stringify.dtdElementValue(value); + } + + XMLDTDElement.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDElement; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],77:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDEntity, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + module.exports = XMLDTDEntity = (function() { + function XMLDTDEntity(parent, pe, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing entity name"); + } + if (value == null) { + throw new Error("Missing entity value"); + } + this.pe = !!pe; + this.name = this.stringify.eleName(name); + if (!isObject(value)) { + this.value = this.stringify.dtdEntityValue(value); + } else { + if (!value.pubID && !value.sysID) { + throw new Error("Public and/or system identifiers are required for an external entity"); + } + if (value.pubID && !value.sysID) { + throw new Error("System identifier is required for a public external entity"); + } + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + if (value.nData != null) { + this.nData = this.stringify.dtdNData(value.nData); + } + if (this.pe && this.nData) { + throw new Error("Notation declaration is not allowed in a parameter entity"); + } + } + } + + XMLDTDEntity.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDEntity; + + })(); + +}).call(this); + +},{"lodash/lang/isObject":60,"lodash/object/create":64}],78:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDTDNotation, create; + + create = require('lodash/object/create'); + + module.exports = XMLDTDNotation = (function() { + function XMLDTDNotation(parent, name, value) { + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing notation name"); + } + if (!value.pubID && !value.sysID) { + throw new Error("Public or system identifiers are required for an external entity"); + } + this.name = this.stringify.eleName(name); + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + } + + XMLDTDNotation.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDTDNotation; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],79:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLDeclaration, XMLNode, create, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLDeclaration = (function(superClass) { + extend(XMLDeclaration, superClass); + + function XMLDeclaration(parent, version, encoding, standalone) { + var ref; + XMLDeclaration.__super__.constructor.call(this, parent); + if (isObject(version)) { + ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; + } + if (!version) { + version = '1.0'; + } + this.version = this.stringify.xmlVersion(version); + if (encoding != null) { + this.encoding = this.stringify.xmlEncoding(encoding); + } + if (standalone != null) { + this.standalone = this.stringify.xmlStandalone(standalone); + } + } + + XMLDeclaration.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLDeclaration; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/lang/isObject":60,"lodash/object/create":64}],80:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLDocType = (function() { + function XMLDocType(parent, pubID, sysID) { + var ref, ref1; + this.documentObject = parent; + this.stringify = this.documentObject.stringify; + this.children = []; + if (isObject(pubID)) { + ref = pubID, pubID = ref.pubID, sysID = ref.sysID; + } + if (sysID == null) { + ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; + } + if (pubID != null) { + this.pubID = this.stringify.dtdPubID(pubID); + } + if (sysID != null) { + this.sysID = this.stringify.dtdSysID(sysID); + } + } + + XMLDocType.prototype.element = function(name, value) { + var child; + child = new XMLDTDElement(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var child; + child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.entity = function(name, value) { + var child; + child = new XMLDTDEntity(this, false, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.pEntity = function(name, value) { + var child; + child = new XMLDTDEntity(this, true, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.notation = function(name, value) { + var child; + child = new XMLDTDNotation(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.instruction = function(target, value) { + var child; + child = new XMLProcessingInstruction(this, target, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.root = function() { + return this.documentObject.root(); + }; + + XMLDocType.prototype.document = function() { + return this.documentObject; + }; + + XMLDocType.prototype.toString = function(options, level) { + var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ' 0) { + r += ' ['; + if (pretty) { + r += newline; + } + ref3 = this.children; + for (i = 0, len = ref3.length; i < len; i++) { + child = ref3[i]; + r += child.toString(options, level + 1); + } + r += ']'; + } + r += '>'; + if (pretty) { + r += newline; + } + return r; + }; + + XMLDocType.prototype.ele = function(name, value) { + return this.element(name, value); + }; + + XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); + }; + + XMLDocType.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocType.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocType.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + XMLDocType.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLDocType.prototype.com = function(value) { + return this.comment(value); + }; + + XMLDocType.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocType.prototype.up = function() { + return this.root(); + }; + + XMLDocType.prototype.doc = function() { + return this.document(); + }; + + return XMLDocType; + + })(); + +}).call(this); + +},{"./XMLCData":73,"./XMLComment":74,"./XMLDTDAttList":75,"./XMLDTDElement":76,"./XMLDTDEntity":77,"./XMLDTDNotation":78,"./XMLProcessingInstruction":83,"lodash/lang/isObject":60,"lodash/object/create":64}],81:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + every = require('lodash/collection/every'); + + XMLNode = require('./XMLNode'); + + XMLAttribute = require('./XMLAttribute'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + module.exports = XMLElement = (function(superClass) { + extend(XMLElement, superClass); + + function XMLElement(parent, name, attributes) { + XMLElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing element name"); + } + this.name = this.stringify.eleName(name); + this.children = []; + this.instructions = []; + this.attributes = {}; + if (attributes != null) { + this.attribute(attributes); + } + } + + XMLElement.prototype.clone = function() { + var att, attName, clonedSelf, i, len, pi, ref, ref1; + clonedSelf = create(XMLElement.prototype, this); + if (clonedSelf.isRoot) { + clonedSelf.documentObject = null; + } + clonedSelf.attributes = {}; + ref = this.attributes; + for (attName in ref) { + if (!hasProp.call(ref, attName)) continue; + att = ref[attName]; + clonedSelf.attributes[attName] = att.clone(); + } + clonedSelf.instructions = []; + ref1 = this.instructions; + for (i = 0, len = ref1.length; i < len; i++) { + pi = ref1[i]; + clonedSelf.instructions.push(pi.clone()); + } + clonedSelf.children = []; + this.children.forEach(function(child) { + var clonedChild; + clonedChild = child.clone(); + clonedChild.parent = clonedSelf; + return clonedSelf.children.push(clonedChild); + }); + return clonedSelf; + }; + + XMLElement.prototype.attribute = function(name, value) { + var attName, attValue; + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLElement.prototype.removeAttribute = function(name) { + var attName, i, len; + if (name == null) { + throw new Error("Missing attribute name"); + } + name = name.valueOf(); + if (Array.isArray(name)) { + for (i = 0, len = name.length; i < len; i++) { + attName = name[i]; + delete this.attributes[attName]; + } + } else { + delete this.attributes[name]; + } + return this; + }; + + XMLElement.prototype.instruction = function(target, value) { + var i, insTarget, insValue, instruction, len; + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (i = 0, len = target.length; i < len; i++) { + insTarget = target[i]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + instruction = new XMLProcessingInstruction(this, target, value); + this.instructions.push(instruction); + } + return this; + }; + + XMLElement.prototype.toString = function(options, level) { + var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + ref3 = this.instructions; + for (i = 0, len = ref3.length; i < len; i++) { + instruction = ref3[i]; + r += instruction.toString(options, level); + } + if (pretty) { + r += space; + } + r += '<' + this.name; + ref4 = this.attributes; + for (name in ref4) { + if (!hasProp.call(ref4, name)) continue; + att = ref4[name]; + r += att.toString(options); + } + if (this.children.length === 0 || every(this.children, function(e) { + return e.value === ''; + })) { + r += '/>'; + if (pretty) { + r += newline; + } + } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) { + r += '>'; + r += this.children[0].value; + r += ''; + r += newline; + } else { + r += '>'; + if (pretty) { + r += newline; + } + ref5 = this.children; + for (j = 0, len1 = ref5.length; j < len1; j++) { + child = ref5[j]; + r += child.toString(options, level + 1); + } + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + } + return r; + }; + + XMLElement.prototype.att = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLElement.prototype.a = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + return XMLElement; + + })(XMLNode); + +}).call(this); + +},{"./XMLAttribute":71,"./XMLNode":82,"./XMLProcessingInstruction":83,"lodash/collection/every":12,"lodash/lang/isFunction":58,"lodash/lang/isObject":60,"lodash/object/create":64}],82:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject, + hasProp = {}.hasOwnProperty; + + isObject = require('lodash/lang/isObject'); + + isFunction = require('lodash/lang/isFunction'); + + isEmpty = require('lodash/lang/isEmpty'); + + XMLElement = null; + + XMLCData = null; + + XMLComment = null; + + XMLDeclaration = null; + + XMLDocType = null; + + XMLRaw = null; + + XMLText = null; + + module.exports = XMLNode = (function() { + function XMLNode(parent) { + this.parent = parent; + this.options = this.parent.options; + this.stringify = this.parent.stringify; + if (XMLElement === null) { + XMLElement = require('./XMLElement'); + XMLCData = require('./XMLCData'); + XMLComment = require('./XMLComment'); + XMLDeclaration = require('./XMLDeclaration'); + XMLDocType = require('./XMLDocType'); + XMLRaw = require('./XMLRaw'); + XMLText = require('./XMLText'); + } + } + + XMLNode.prototype.element = function(name, attributes, text) { + var childNode, item, j, k, key, lastChild, len, len1, ref, val; + lastChild = null; + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + if (name != null) { + name = name.valueOf(); + } + if (Array.isArray(name)) { + for (j = 0, len = name.length; j < len; j++) { + item = name[j]; + lastChild = this.element(item); + } + } else if (isFunction(name)) { + lastChild = this.element(name.apply()); + } else if (isObject(name)) { + for (key in name) { + if (!hasProp.call(name, key)) continue; + val = name[key]; + if (isFunction(val)) { + val = val.apply(); + } + if ((isObject(val)) && (isEmpty(val))) { + val = null; + } + if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { + lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); + } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) { + lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val); + } else if (Array.isArray(val)) { + for (k = 0, len1 = val.length; k < len1; k++) { + item = val[k]; + childNode = {}; + childNode[key] = item; + lastChild = this.element(childNode); + } + } else if (isObject(val)) { + lastChild = this.element(key); + lastChild.element(val); + } else { + lastChild = this.element(key, val); + } + } + } else { + if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { + lastChild = this.text(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { + lastChild = this.cdata(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { + lastChild = this.comment(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { + lastChild = this.raw(text); + } else { + lastChild = this.node(name, attributes, text); + } + } + if (lastChild == null) { + throw new Error("Could not create any elements with: " + name); + } + return lastChild; + }; + + XMLNode.prototype.insertBefore = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.insertAfter = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.remove = function() { + var i, ref; + if (this.isRoot) { + throw new Error("Cannot remove the root element"); + } + i = this.parent.children.indexOf(this); + [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref; + return this.parent; + }; + + XMLNode.prototype.node = function(name, attributes, text) { + var child, ref; + if (name != null) { + name = name.valueOf(); + } + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref = [attributes, text], text = ref[0], attributes = ref[1]; + } + child = new XMLElement(this, name, attributes); + if (text != null) { + child.text(text); + } + this.children.push(child); + return child; + }; + + XMLNode.prototype.text = function(value) { + var child; + child = new XMLText(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.raw = function(value) { + var child; + child = new XMLRaw(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.declaration = function(version, encoding, standalone) { + var doc, xmldec; + doc = this.document(); + xmldec = new XMLDeclaration(doc, version, encoding, standalone); + doc.xmldec = xmldec; + return doc.root(); + }; + + XMLNode.prototype.doctype = function(pubID, sysID) { + var doc, doctype; + doc = this.document(); + doctype = new XMLDocType(doc, pubID, sysID); + doc.doctype = doctype; + return doctype; + }; + + XMLNode.prototype.up = function() { + if (this.isRoot) { + throw new Error("The root node has no parent. Use doc() if you need to get the document object."); + } + return this.parent; + }; + + XMLNode.prototype.root = function() { + var child; + if (this.isRoot) { + return this; + } + child = this.parent; + while (!child.isRoot) { + child = child.parent; + } + return child; + }; + + XMLNode.prototype.document = function() { + return this.root().documentObject; + }; + + XMLNode.prototype.end = function(options) { + return this.document().toString(options); + }; + + XMLNode.prototype.prev = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i < 1) { + throw new Error("Already at the first node"); + } + return this.parent.children[i - 1]; + }; + + XMLNode.prototype.next = function() { + var i; + if (this.isRoot) { + throw new Error("Root node has no siblings"); + } + i = this.parent.children.indexOf(this); + if (i === -1 || i === this.parent.children.length - 1) { + throw new Error("Already at the last node"); + } + return this.parent.children[i + 1]; + }; + + XMLNode.prototype.importXMLBuilder = function(xmlbuilder) { + var clonedRoot; + clonedRoot = xmlbuilder.root().clone(); + clonedRoot.parent = this; + clonedRoot.isRoot = false; + this.children.push(clonedRoot); + return this; + }; + + XMLNode.prototype.ele = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.txt = function(value) { + return this.text(value); + }; + + XMLNode.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.com = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.doc = function() { + return this.document(); + }; + + XMLNode.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLNode.prototype.dtd = function(pubID, sysID) { + return this.doctype(pubID, sysID); + }; + + XMLNode.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.t = function(value) { + return this.text(value); + }; + + XMLNode.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.c = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.r = function(value) { + return this.raw(value); + }; + + XMLNode.prototype.u = function() { + return this.up(); + }; + + return XMLNode; + + })(); + +}).call(this); + +},{"./XMLCData":73,"./XMLComment":74,"./XMLDeclaration":79,"./XMLDocType":80,"./XMLElement":81,"./XMLRaw":84,"./XMLText":86,"lodash/lang/isEmpty":57,"lodash/lang/isFunction":58,"lodash/lang/isObject":60}],83:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLProcessingInstruction, create; + + create = require('lodash/object/create'); + + module.exports = XMLProcessingInstruction = (function() { + function XMLProcessingInstruction(parent, target, value) { + this.stringify = parent.stringify; + if (target == null) { + throw new Error("Missing instruction target"); + } + this.target = this.stringify.insTarget(target); + if (value) { + this.value = this.stringify.insValue(value); + } + } + + XMLProcessingInstruction.prototype.clone = function() { + return create(XMLProcessingInstruction.prototype, this); + }; + + XMLProcessingInstruction.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += ''; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLProcessingInstruction; + + })(); + +}).call(this); + +},{"lodash/object/create":64}],84:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLNode, XMLRaw, create, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + create = require('lodash/object/create'); + + XMLNode = require('./XMLNode'); + + module.exports = XMLRaw = (function(superClass) { + extend(XMLRaw, superClass); + + function XMLRaw(parent, text) { + XMLRaw.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing raw text"); + } + this.value = this.stringify.raw(text); + } + + XMLRaw.prototype.clone = function() { + return create(XMLRaw.prototype, this); + }; + + XMLRaw.prototype.toString = function(options, level) { + var indent, newline, offset, pretty, r, ref, ref1, ref2, space; + pretty = (options != null ? options.pretty : void 0) || false; + indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; + offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; + newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; + level || (level = 0); + space = new Array(level + offset + 1).join(indent); + r = ''; + if (pretty) { + r += space; + } + r += this.value; + if (pretty) { + r += newline; + } + return r; + }; + + return XMLRaw; + + })(XMLNode); + +}).call(this); + +},{"./XMLNode":82,"lodash/object/create":64}],85:[function(require,module,exports){ +// Generated by CoffeeScript 1.9.1 +(function() { + var XMLStringifier, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + hasProp = {}.hasOwnProperty; + + module.exports = XMLStringifier = (function() { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref, value; + this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0; + ref = (options != null ? options.stringify : void 0) || {}; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function(val) { + val = '' + val || ''; + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function(val) { + val = '' + val || ''; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function(val) { + val = '' + val || ''; + if (val.match(/]]>/)) { + throw new Error("Invalid CDATA text: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function(val) { + val = '' + val || ''; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attName = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attValue = function(val) { + val = '' + val || ''; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.insValue = function(val) { + val = '' + val || ''; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function(val) { + val = '' + val || ''; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function(val) { + val = '' + val || ''; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function(val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdSysID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdElementValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttType = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttDefault = function(val) { + if (val != null) { + return '' + val || ''; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdNData = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.convertAttKey = '@'; + + XMLStringifier.prototype.convertPIKey = '?'; + + XMLStringifier.prototype.convertTextKey = '#text'; + + XMLStringifier.prototype.convertCDataKey = '#cdata'; + + XMLStringifier.prototype.convertCommentKey = '#comment'; + + XMLStringifier.prototype.convertRawKey = '#raw'; + + XMLStringifier.prototype.assertLegalChar = function(str) { + var chars, chr; + if (this.allowSurrogateChars) { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; + } else { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; + } + chr = str.match(chars); + if (chr) { + throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); + } + return str; + }; + + XMLStringifier.prototype.elEscape = function(str) { + return str.replace(/&/g, '&').replace(//g, '>').replace(/\r/g, ' '); + }; + + XMLStringifier.prototype.attEscape = function(str) { + return str.replace(/&/g, '&').replace(/','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid document source"); + } + return domBuilder.document; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn){ + if(isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + }else{ + var i=arguments.length; + while(--i){ + if(fn = errorImpl[arguments[i]]){ + break; + } + } + } + } + errorHandler[key] = fn && function(msg){ + fn(msg+_locator(locator)); + }||function(){}; + } + build('warning','warn'); + build('error','warn','warning'); + build('fatalError','warn','warning','error'); + return errorHandler; +} +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.document = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.document.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.document; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + if( attr.getOffset){ + position(attr.getOffset(1),attr) + } + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.document.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(this.currentElement && chars){ + if (this.cdata) { + var charNode = this.document.createCDATASection(chars); + this.currentElement.appendChild(charNode); + } else { + var charNode = this.document.createTextNode(chars); + this.currentElement.appendChild(charNode); + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.document.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.document.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.document.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn(error,_locator(this.locator)); + }, + error:function(error) { + console.error(error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error(error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.document.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +} + +},{"./dom":89,"./sax":90}],89:[function(require,module,exports){ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + } +}; +function LiveNodeList(node,refresh){ + this._node = node; + this._refresh = refresh + _updateLiveList(this); +} +function _updateLiveList(list){ + var inc = list._node._inc || list._node.ownerDocument._inc; + if(list._inc != inc){ + var ls = list._refresh(list._node); + //console.log(ls.length) + __set__(list,'length',ls.length); + copy(ls,list); + list._inc = inc; + } +} +LiveNodeList.prototype.item = function(i){ + _updateLiveList(this); + return this[i]; +} + +_extends(LiveNodeList,NodeList); +/** + * + * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes. + * NamedNodeMap objects in the DOM are live. + * used for attributes or DocumentType entities + */ +function NamedNodeMap() { +}; + +function _findNodeIndex(list,node){ + var i = list.length; + while(i--){ + if(list[i] === node){return i} + } +} + +function _addNamedNode(el,list,newAttr,oldAttr){ + if(oldAttr){ + list[_findNodeIndex(list,oldAttr)] = newAttr; + }else{ + list[list.length++] = newAttr; + } + if(el){ + newAttr.ownerElement = el; + var doc = el.ownerDocument; + if(doc){ + oldAttr && _onRemoveAttribute(doc,el,oldAttr); + _onAddAttribute(doc,el,newAttr); + } + } +} +function _removeNamedNode(el,list,attr){ + var i = _findNodeIndex(list,attr); + if(i>=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + var i = this.length; + while(i--){ + var attr = this[i]; + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + doc.implementation = this; + doc.childNodes = new NodeList(); + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == 2?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == 1){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == 1){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + //if(!(newChild instanceof CharacterData)){ + throw new Error(ExceptionMessage[3]) + //} + return Node.prototype.appendChild.apply(this,arguments) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node){ + var buf = []; + serializeToString(node,buf); + return buf.join(''); +} +Node.prototype.toString =function(){ + return XMLSerializer.prototype.serializeToString(this); +} +function serializeToString(node,buf){ + switch(node.nodeType){ + case ELEMENT_NODE: + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + var isHTML = htmlns === node.namespaceURI + buf.push('<',nodeName); + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + if(child){ + buf.push(child.data); + } + }else{ + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + function position(start,m){ + while(start>=endPos && (m = linePattern.exec(source))){ + startPos = m.index; + endPos = startPos + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = start-startPos+1; + } + var startPos = 0; + var endPos = 0; + var linePattern = /.+(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + var i = source.indexOf('<',start); + if(i<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.document; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(i>start){ + appendText(i); + } + switch(source.charAt(i+1)){ + case '/': + var end = source.indexOf('>',i+3); + var tagName = source.substring(i+2,end); + var config = parseStack.pop(); + var localNSMap = config.localNSMap; + + if(config.tagName != tagName){ + errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); + } + domBuilder.endElement(config.uri,config.localName,tagName); + if(localNSMap){ + for(var prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) ; + } + } + end++; + break; + // end elment + case '?':// + locator&&position(i); + end = parseInstruction(source,i,domBuilder); + break; + case '!':// 0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_E; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_V){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_E + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + s = S_C; + el.closed = true; + case S_V: + case S_ATTR: + case S_ATTR_S: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_E: + case S_S: + case S_C: + break;//normal + case S_V://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_S: + if(s === S_ATTR_S){ + value = attrName; + } + if(s == S_V){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_S; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_S; + break; + case S_V: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_E: + s = S_S; + break; + //case S_S: + //case S_EQ: + //case S_ATTR_S: + // void();break; + //case S_C: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_V +//S_ATTR_S, S_E, S_S, S_C + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_V:void();break; + case S_ATTR_S: + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!') + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_E: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_S: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_V; + start = p; + break; + case S_C: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + } + p++; + } +} +/** + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function appendElement(el,domBuilder,parseStack){ + var tagName = el.tagName; + var localNSMap = null; + var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + parseStack.push(el); + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = closeMap[tagName] = source.lastIndexOf('') + } + return pos',start+4); + //append comment source.substring(4,end)//, + * and raw CDATA nodes. + * + * @param {Element} node + * @returns {Boolean} + * @api private + */ + +function shouldIgnoreNode (node) { + return node.nodeType === TEXT_NODE + || node.nodeType === COMMENT_NODE + || node.nodeType === CDATA_NODE; +} + +/** + * Check if the node is empty. Some plist file has such node: + * + * this node shoud be ignored. + * + * @see https://github.com/TooTallNate/plist.js/issues/66 + * @param {Element} node + * @returns {Boolean} + * @api private + */ +function isEmptyNode(node){ + if(!node.childNodes || node.childNodes.length === 0) { + return true; + } else { + return false; + } +} + +function invariant(test, message) { + if (!test) { + throw new Error(message); + } +} + +/** + * Parses a Plist XML string. Returns an Object. + * + * @param {String} xml - the XML String to decode + * @returns {Mixed} the decoded value from the Plist XML + * @api public + */ + +function parse (xml) { + var doc = new DOMParser().parseFromString(xml); + invariant( + doc.documentElement.nodeName === 'plist', + 'malformed document. First element should be ' + ); + var plist = parsePlistXML(doc.documentElement); + + // the root node gets interpreted as an Array, + // so pull out the inner data first + if (plist.length == 1) plist = plist[0]; + + return plist; +} + +/** + * Convert an XML based plist document into a JSON representation. + * + * @param {Object} xml_node - current XML node in the plist + * @returns {Mixed} built up JSON object + * @api private + */ + +function parsePlistXML (node) { + var i, new_obj, key, val, new_arr, res, counter, type; + + if (!node) + return null; + + if (node.nodeName === 'plist') { + new_arr = []; + if (isEmptyNode(node)) { + return new_arr; + } + for (i=0; i < node.childNodes.length; i++) { + if (!shouldIgnoreNode(node.childNodes[i])) { + new_arr.push( parsePlistXML(node.childNodes[i])); + } + } + return new_arr; + } else if (node.nodeName === 'dict') { + new_obj = {}; + key = null; + counter = 0; + if (isEmptyNode(node)) { + return new_obj; + } + for (i=0; i < node.childNodes.length; i++) { + if (shouldIgnoreNode(node.childNodes[i])) continue; + if (counter % 2 === 0) { + invariant( + node.childNodes[i].nodeName === 'key', + 'Missing key while parsing .' + ); + key = parsePlistXML(node.childNodes[i]); + } else { + invariant( + node.childNodes[i].nodeName !== 'key', + 'Unexpected key "' + + parsePlistXML(node.childNodes[i]) + + '" while parsing .' + ); + new_obj[key] = parsePlistXML(node.childNodes[i]); + } + counter += 1; + } + if (counter % 2 === 1) { + throw new Error('Missing value for "' + key + '" while parsing '); + } + return new_obj; + + } else if (node.nodeName === 'array') { + new_arr = []; + if (isEmptyNode(node)) { + return new_arr; + } + for (i=0; i < node.childNodes.length; i++) { + if (!shouldIgnoreNode(node.childNodes[i])) { + res = parsePlistXML(node.childNodes[i]); + if (null != res) new_arr.push(res); + } + } + return new_arr; + + } else if (node.nodeName === '#text') { + // TODO: what should we do with text types? (CDATA sections) + + } else if (node.nodeName === 'key') { + if (isEmptyNode(node)) { + return ''; + } + return node.childNodes[0].nodeValue; + } else if (node.nodeName === 'string') { + res = ''; + if (isEmptyNode(node)) { + return res; + } + for (i=0; i < node.childNodes.length; i++) { + var type = node.childNodes[i].nodeType; + if (type === TEXT_NODE || type === CDATA_NODE) { + res += node.childNodes[i].nodeValue; + } + } + return res; + + } else if (node.nodeName === 'integer') { + invariant( + !isEmptyNode(node), + 'Cannot parse "" as integer.' + ); + return parseInt(node.childNodes[0].nodeValue, 10); + + } else if (node.nodeName === 'real') { + invariant( + !isEmptyNode(node), + 'Cannot parse "" as real.' + ); + res = ''; + for (i=0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeType === TEXT_NODE) { + res += node.childNodes[i].nodeValue; + } + } + return parseFloat(res); + + } else if (node.nodeName === 'data') { + res = ''; + if (isEmptyNode(node)) { + return new Buffer(res, 'base64'); + } + for (i=0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeType === TEXT_NODE) { + res += node.childNodes[i].nodeValue.replace(/\s+/g, ''); + } + } + return new Buffer(res, 'base64'); + + } else if (node.nodeName === 'date') { + invariant( + !isEmptyNode(node), + 'Cannot parse "" as Date.' + ) + return new Date(node.childNodes[0].nodeValue); + + } else if (node.nodeName === 'true') { + return true; + + } else if (node.nodeName === 'false') { + return false; + } +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/package.json new file mode 100644 index 0000000..39545b7 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/plist/package.json @@ -0,0 +1,86 @@ +{ + "_from": "plist@^2.1.0", + "_id": "plist@2.1.0", + "_inBundle": true, + "_integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "_location": "/cordova-android/plist", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "plist@^2.1.0", + "name": "plist", + "escapedName": "plist", + "rawSpec": "^2.1.0", + "saveSpec": null, + "fetchSpec": "^2.1.0" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "_shasum": "57ccdb7a0821df21831217a3cad54e3e146a1025", + "_spec": "plist@^2.1.0", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net" + }, + "bugs": { + "url": "https://github.com/TooTallNate/node-plist/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Hans Huebner", + "email": "hans.huebner@gmail.com" + }, + { + "name": "Pierre Metrailler" + }, + { + "name": "Mike Reinstein", + "email": "reinstein.mike@gmail.com" + }, + { + "name": "Vladimir Tsvang" + }, + { + "name": "Mathieu D'Amours" + } + ], + "dependencies": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.x" + }, + "deprecated": false, + "description": "Mac OS X Plist parser/builder for Node.js and browsers", + "devDependencies": { + "browserify": "^14.3.0", + "mocha": "^3.3.0", + "multiline": "^1.0.2", + "zuul": "^3.10.1" + }, + "homepage": "https://github.com/TooTallNate/node-plist#readme", + "keywords": [ + "apple", + "browser", + "mac", + "plist", + "parser", + "xml" + ], + "license": "MIT", + "main": "index.js", + "name": "plist", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-plist.git" + }, + "scripts": { + "test": "make test" + }, + "version": "2.1.0" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/README.markdown b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/README.markdown new file mode 100644 index 0000000..3a808ba --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/README.markdown @@ -0,0 +1,48 @@ +# node-properties-parser + +A parser for [.properties](http://en.wikipedia.org/wiki/.properties) files written in javascript. Properties files store key-value pairs. They are typically used for configuration and internationalization in Java applications as well as in Actionscript projects. Here's an example of the format: + + # You are reading the ".properties" entry. + ! The exclamation mark can also mark text as comments. + website = http://en.wikipedia.org/ + language = English + # The backslash below tells the application to continue reading + # the value onto the next line. + message = Welcome to \ + Wikipedia! + # Add spaces to the key + key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". + # Unicode + tab : \u0009 +*(taken from [Wikipedia](http://en.wikipedia.org/wiki/.properties#Format))* + +Currently works with any version of node.js. + +## The API + +- `parse(text)`: Parses `text` into key-value pairs. Returns an object containing the key-value pairs. +- `read(path[, callback])`: Opens the file specified by `path` and calls `parse` on its content. If the optional `callback` parameter is provided, the result is then passed to it as the second parameter. If an error occurs, the error object is passed to `callback` as the first parameter. If `callback` is not provided, the file specified by `path` is synchronously read and calls `parse` on its contents. The resulting object is immediately returned. +- `createEditor([path[, callback]])`: If neither `path` or `callback` are provided an empty editor object is returned synchronously. If only `path` is provided, the file specified by `path` is synchronously read and parsed. An editor object with the results in then immediately returned. If both `path` and `callback` are provided, the file specified by `path` is read and parsed asynchronously. An editor object with the results are then passed to `callback` as the second parameters. If an error occurs, the error object is passed to `callback` as the first parameter. +- `Editor`: The editor object is returned by `createEditor`. Has the following API: + - `get(key)`: Returns the value currently associated with `key`. + - `set(key, [value[, comment]])`: Associates `key` with `value`. An optional comment can be provided. If `value` is not specified or is `null`, then `key` is unset. + - `unset(key)`: Unsets the specified `key`. + - `save([path][, callback]])`: Writes the current contents of this editor object to a file specified by `path`. If `path` is not provided, then it'll be defaulted to the `path` value passed to `createEditor`. The `callback` parameter is called when the file has been written to disk. + - `addHeadComment`: Added a comment to the head of the file. + - `toString`: Returns the string representation of this properties editor object. This string will be written to a file if `save` is called. + +## Getting node-properties-parser + +The easiest way to get node-properties-parser is with [npm](http://npmjs.org/): + + npm install properties-parser + +Alternatively you can clone this git repository: + + git://github.com/xavi-/node-properties-parser.git + +## Developed by +* Xavi Ramirez + +## License +This project is released under [The MIT License](http://www.opensource.org/licenses/mit-license.php). \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/index.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/index.js new file mode 100644 index 0000000..b103ad0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/index.js @@ -0,0 +1,354 @@ +var fs = require("fs"); + +function Iterator(text) { + var pos = 0, length = text.length; + + this.peek = function(num) { + num = num || 0; + if(pos + num >= length) { return null; } + + return text.charAt(pos + num); + }; + this.next = function(inc) { + inc = inc || 1; + + if(pos >= length) { return null; } + + return text.charAt((pos += inc) - inc); + }; + this.pos = function() { + return pos; + }; +} + +var rWhitespace = /\s/; +function isWhitespace(chr) { + return rWhitespace.test(chr); +} +function consumeWhiteSpace(iter) { + var start = iter.pos(); + + while(isWhitespace(iter.peek())) { iter.next(); } + + return { type: "whitespace", start: start, end: iter.pos() }; +} + +function startsComment(chr) { + return chr === "!" || chr === "#"; +} +function isEOL(chr) { + return chr == null || chr === "\n" || chr === "\r"; +} +function consumeComment(iter) { + var start = iter.pos(); + + while(!isEOL(iter.peek())) { iter.next(); } + + return { type: "comment", start: start, end: iter.pos() }; +} + +function startsKeyVal(chr) { + return !isWhitespace(chr) && !startsComment(chr); +} +function startsSeparator(chr) { + return chr === "=" || chr === ":" || isWhitespace(chr); +} +function startsEscapedVal(chr) { + return chr === "\\"; +} +function consumeEscapedVal(iter) { + var start = iter.pos(); + + iter.next(); // move past "\" + var curChar = iter.next(); + if(curChar === "u") { // encoded unicode char + iter.next(4); // Read in the 4 hex values + } + + return { type: "escaped-value", start: start, end: iter.pos() }; +} +function consumeKey(iter) { + var start = iter.pos(), children = []; + + var curChar; + while((curChar = iter.peek()) !== null) { + if(startsSeparator(curChar)) { break; } + if(startsEscapedVal(curChar)) { children.push(consumeEscapedVal(iter)); continue; } + + iter.next(); + } + + return { type: "key", start: start, end: iter.pos(), children: children }; +} +function consumeKeyValSeparator(iter) { + var start = iter.pos(); + + var seenHardSep = false, curChar; + while((curChar = iter.peek()) !== null) { + if(isEOL(curChar)) { break; } + + if(isWhitespace(curChar)) { iter.next(); continue; } + + if(seenHardSep) { break; } + + seenHardSep = (curChar === ":" || curChar === "="); + if(seenHardSep) { iter.next(); continue; } + + break; // curChar is a non-separtor char + } + + return { type: "key-value-separator", start: start, end: iter.pos() }; +} +function startsLineBreak(iter) { + return iter.peek() === "\\" && isEOL(iter.peek(1)); +} +function consumeLineBreak(iter) { + var start = iter.pos(); + + iter.next(); // consume \ + if(iter.peek() === "\r") { iter.next(); } + iter.next(); // consume \n + + var curChar; + while((curChar = iter.peek()) !== null) { + if(isEOL(curChar)) { break; } + if(!isWhitespace(curChar)) { break; } + + iter.next(); + } + + return { type: "line-break", start: start, end: iter.pos() }; +} +function consumeVal(iter) { + var start = iter.pos(), children = []; + + var curChar; + while((curChar = iter.peek()) !== null) { + if(startsLineBreak(iter)) { children.push(consumeLineBreak(iter)); continue; } + if(startsEscapedVal(curChar)) { children.push(consumeEscapedVal(iter)); continue; } + if(isEOL(curChar)) { break; } + + iter.next(); + } + + return { type: "value", start: start, end: iter.pos(), children: children }; +} +function consumeKeyVal(iter) { + return { + type: "key-value", + start: iter.pos(), + children: [ + consumeKey(iter), + consumeKeyValSeparator(iter), + consumeVal(iter) + ], + end: iter.pos() + }; +} + +var renderChild = { + "escaped-value": function(child, text) { + var type = text.charAt(child.start + 1); + + if(type === "t") { return "\t"; } + if(type === "r") { return "\r"; } + if(type === "n") { return "\n"; } + if(type === "f") { return "\f"; } + if(type !== "u") { return type; } + + return String.fromCharCode(parseInt(text.substr(child.start + 2, 4), 16)); + }, + "line-break": function (child, text) { + return ""; + } +}; +function rangeToBuffer(range, text) { + var start = range.start, buffer = []; + + for(var i = 0; i < range.children.length; i++) { + var child = range.children[i]; + + buffer.push(text.substring(start, child.start)); + buffer.push(renderChild[child.type](child, text)); + start = child.end; + } + buffer.push(text.substring(start, range.end)); + + return buffer; +} +function rangesToObject(ranges, text) { + var obj = Object.create(null); // Creates to a true hash map + + for(var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + + if(range.type !== "key-value") { continue; } + + var key = rangeToBuffer(range.children[0], text).join(""); + var val = rangeToBuffer(range.children[2], text).join(""); + obj[key] = val; + } + + return obj; +} + +function stringToRanges(text) { + var iter = new Iterator(text), ranges = []; + + var curChar; + while((curChar = iter.peek()) !== null) { + if(isWhitespace(curChar)) { ranges.push(consumeWhiteSpace(iter)); continue; } + if(startsComment(curChar)) { ranges.push(consumeComment(iter)); continue; } + if(startsKeyVal(curChar)) { ranges.push(consumeKeyVal(iter)); continue; } + + throw Error("Something crazy happened. text: '" + text + "'; curChar: '" + curChar + "'"); + } + + return ranges; +} + +function isNewLineRange(range) { + if(!range) { return false; } + + if(range.type === "whitespace") { return true; } + + if(range.type === "literal") { + return isWhitespace(range.text) && range.text.indexOf("\n") > -1; + } + + return false; +} + +function Editor(text, path) { + text = text || ""; + + var ranges = stringToRanges(text); + var obj = rangesToObject(ranges, text); + var keyRange = Object.create(null); // Creates to a true hash map + + for(var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + + if(range.type !== "key-value") { continue; } + + var key = rangeToBuffer(range.children[0], text).join(""); + keyRange[key] = range; + } + + this.addHeadComment = function(comment) { + if(comment == null) { return; } + + ranges.unshift({ type: "literal", text: "# " + comment.replace(/\n/g, "\n# ") + "\n" }); + }; + + this.get = function(key) { return obj[key]; }; + this.set = function(key, val, comment) { + if(val == null) { this.unset(key); return; } + + obj[key] = val; + + var range = keyRange[key]; + if(!range) { + keyRange[key] = range = { type: "literal", text: key + "=" + val }; + + var prevRange = ranges[ranges.length - 1]; + if(prevRange != null && !isNewLineRange(prevRange)) { + ranges.push({ type: "literal", text: "\n" }); + } + ranges.push(range); + } + + // comment === null deletes comment. if comment === undefined, it's left alone + if(comment !== undefined) { + range.comment = comment && "# " + comment.replace(/\n/g, "\n# ") + "\n"; + } + + if(range.type === "literal") { + range.text = key + "=" + val; + if(range.comment != null) { range.text = range.comment + range.text; } + } else if(range.type === "key-value") { + range.children[2] = { type: "literal", text: val }; + } else { + throw "Unknown node type: " + range.type; + } + }; + this.unset = function(key) { + if(!(key in obj)) { return; } + + var range = keyRange[key]; + var idx = ranges.indexOf(range); + + ranges.splice(idx, (isNewLineRange(ranges[idx + 1]) ? 2 : 1)); + + delete keyRange[key]; + delete obj[key]; + }; + this.valueOf = this.toString = function() { + var buffer = [], stack = [].concat(ranges); + + var node; + while((node = stack.shift()) != null) { + switch(node.type) { + case "literal": + buffer.push(node.text); + break; + case "key": + case "value": + case "comment": + case "whitespace": + case "key-value-separator": + case "escaped-value": + case "line-break": + buffer.push(text.substring(node.start, node.end)); + break; + case "key-value": + Array.prototype.unshift.apply(stack, node.children); + if(node.comment) { stack.unshift({ type: "literal", text: node.comment }); } + break; + } + } + + return buffer.join(""); + }; + this.save = function(newPath, callback) { + if(typeof newPath === 'function') { + callback = newPath; + newPath = path; + } + newPath = newPath || path; + + if(!newPath) { callback("Unknown path"); } + + fs.writeFile(newPath, this.toString(), callback || function() {}); + }; +} +function createEditor(path, callback) { + if(!path) { return new Editor(); } + + if(!callback) { return new Editor(fs.readFileSync(path).toString(), path); } + + return fs.readFile(path, function(err, text) { + if(err) { return callback(err, null); } + + text = text.toString(); + return callback(null, new Editor(text, path)); + }); +} + +function parse(text) { + text = text.toString(); + var ranges = stringToRanges(text); + return rangesToObject(ranges, text); +} + +function read(path, callback) { + if(!callback) { return parse(fs.readFileSync(path)); } + + return fs.readFile(path, function(err, data) { + if(err) { return callback(err, null); } + + return callback(null, parse(data)); + }); +} + +module.exports = { parse: parse, read: read, createEditor: createEditor }; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/package.json new file mode 100644 index 0000000..8488866 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/package.json @@ -0,0 +1,57 @@ +{ + "_from": "properties-parser@0.2.3", + "_id": "properties-parser@0.2.3", + "_inBundle": true, + "_integrity": "sha1-91kSVfcHq7/yJ8e1a2N9uwNzoQ8=", + "_location": "/cordova-android/properties-parser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "properties-parser@0.2.3", + "name": "properties-parser", + "escapedName": "properties-parser", + "rawSpec": "0.2.3", + "saveSpec": null, + "fetchSpec": "0.2.3" + }, + "_requiredBy": [ + "/cordova-android" + ], + "_resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.2.3.tgz", + "_shasum": "f7591255f707abbff227c7b56b637dbb0373a10f", + "_spec": "properties-parser@0.2.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "bugs": { + "url": "https://github.com/xavi-/node-properties-parser/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A parser for .properties files written in javascript", + "engines": { + "node": ">= 0.3.1" + }, + "homepage": "https://github.com/xavi-/node-properties-parser#readme", + "keywords": [ + "parser", + ".properties", + "properties", + "java", + "file parser", + "actionscript" + ], + "main": "./index.js", + "maintainers": [ + { + "name": "Xavi", + "email": "xavi.rmz@gmail.com", + "url": "http://xavi.co" + } + ], + "name": "properties-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/xavi-/node-properties-parser.git" + }, + "version": "0.2.3" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/play-ground.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/play-ground.js new file mode 100644 index 0000000..ffbcf62 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/properties-parser/play-ground.js @@ -0,0 +1,17 @@ +var parser = require("./"); +var editor = parser.createEditor(); + +editor.set("ok", "hi"); +editor.set("hi", "ok"); + +console.log(editor.toString()); + +editor.unset("hi"); + +console.log("==================="); +console.log(editor.toString()); + +editor.unset("ok"); + +console.log("==================="); +console.log(editor.toString()); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/q/CHANGES.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/q/CHANGES.md new file mode 100644 index 0000000..cd351fd --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/q/CHANGES.md @@ -0,0 +1,786 @@ + +## 1.4.1 + + - Address an issue that prevented Q from being used as a ` + + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/test.xml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/test.xml new file mode 100644 index 0000000..801292d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/examples/test.xml @@ -0,0 +1,1254 @@ + + +]> + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + + Some Text + + + + + + + are ok in here. ]]> + + Pre-Text & Inlined text Post-text. +  + + \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/lib/sax.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/lib/sax.js new file mode 100644 index 0000000..17fb08e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/lib/sax.js @@ -0,0 +1,1006 @@ +// wrapper for non-node envs +;(function (sax) { + +sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } +sax.SAXParser = SAXParser +sax.SAXStream = SAXStream +sax.createStream = createStream + +// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. +// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), +// since that's the earliest that a buffer overrun could occur. This way, checks are +// as rare as required, but as often as necessary to ensure never crossing this bound. +// Furthermore, buffers are only tested at most once per write(), so passing a very +// large string into write() might have undesirable effects, but this is manageable by +// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme +// edge case, result in creating at most one complete copy of the string passed in. +// Set to Infinity to have unlimited buffers. +sax.MAX_BUFFER_LENGTH = 64 * 1024 + +var buffers = [ + "comment", "sgmlDecl", "textNode", "tagName", "doctype", + "procInstName", "procInstBody", "entity", "attribName", + "attribValue", "cdata", "script" +] + +sax.EVENTS = // for discoverability. + [ "text" + , "processinginstruction" + , "sgmldeclaration" + , "doctype" + , "comment" + , "attribute" + , "opentag" + , "closetag" + , "opencdata" + , "cdata" + , "closecdata" + , "error" + , "end" + , "ready" + , "script" + , "opennamespace" + , "closenamespace" + ] + +function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) return new SAXParser(strict, opt) + + var parser = this + clearBuffers(parser) + parser.q = parser.c = "" + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.tagCase = parser.opt.lowercasetags ? "toLowerCase" : "toUpperCase" + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.ENTITIES = Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) parser.ns = Object.create(rootNS) + + // mostly just for error reporting + parser.position = parser.line = parser.column = 0 + emit(parser, "onready") +} + +if (!Object.create) Object.create = function (o) { + function f () { this.__proto__ = o } + f.prototype = o + return new f +} + +if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) { + return o.__proto__ +} + +if (!Object.keys) Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a +} + +function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + , maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i ++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case "textNode": + closeText(parser) + break + + case "cdata": + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + break + + case "script": + emitNode(parser, "onscript", parser.script) + parser.script = "" + break + + default: + error(parser, "Max buffer length exceeded: "+buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual) + + parser.position +} + +function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i ++) { + parser[buffers[i]] = "" + } +} + +SAXParser.prototype = + { end: function () { end(this) } + , write: write + , resume: function () { this.error = null; return this } + , close: function () { return this.write(null) } + , end: function () { return this.write(null) } + } + +try { + var Stream = require("stream").Stream +} catch (ex) { + var Stream = function () {} +} + + +var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== "error" && ev !== "end" +}) + +function createStream (strict, opt) { + return new SAXStream(strict, opt) +} + +function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) return new SAXStream(strict, opt) + + Stream.apply(me) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + + var me = this + + this._parser.onend = function () { + me.emit("end") + } + + this._parser.onerror = function (er) { + me.emit("error", er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, "on" + ev, { + get: function () { return me._parser["on" + ev] }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + return me._parser["on"+ev] = h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) +} + +SAXStream.prototype = Object.create(Stream.prototype, + { constructor: { value: SAXStream } }) + +SAXStream.prototype.write = function (data) { + this._parser.write(data.toString()) + this.emit("data", data) + return true +} + +SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) this._parser.write(chunk.toString()) + this._parser.end() + return true +} + +SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) { + me._parser["on"+ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] + : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) +} + + + +// character classes and tokens +var whitespace = "\r\n\t " + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + , number = "0124356789" + , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + // (Letter | "_" | ":") + , nameStart = letter+"_:" + , nameBody = nameStart+number+"-." + , quote = "'\"" + , entity = number+letter+"#" + , attribEnd = whitespace + ">" + , CDATA = "[CDATA[" + , DOCTYPE = "DOCTYPE" + , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" + , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + +// turn all the string character sets into character class objects. +whitespace = charClass(whitespace) +number = charClass(number) +letter = charClass(letter) +nameStart = charClass(nameStart) +nameBody = charClass(nameBody) +quote = charClass(quote) +entity = charClass(entity) +attribEnd = charClass(attribEnd) + +function charClass (str) { + return str.split("").reduce(function (s, c) { + s[c] = true + return s + }, {}) +} + +function is (charclass, c) { + return charclass[c] +} + +function not (charclass, c) { + return !charclass[c] +} + +var S = 0 +sax.STATE = +{ BEGIN : S++ +, TEXT : S++ // general stuff +, TEXT_ENTITY : S++ // & and such. +, OPEN_WAKA : S++ // < +, SGML_DECL : S++ // +, SCRIPT : S++ // " + , expect : + [ [ "opentag", { name: "xml", attributes: {} } ] + , [ "opentag", { name: "script", attributes: {} } ] + , [ "text", "hello world" ] + , [ "closetag", "script" ] + , [ "closetag", "xml" ] + ] + , strict : false + , opt : { lowercasetags: true, noscript: true } + } + ) + +require(__dirname).test + ( { xml : "" + , expect : + [ [ "opentag", { name: "xml", attributes: {} } ] + , [ "opentag", { name: "script", attributes: {} } ] + , [ "opencdata", undefined ] + , [ "cdata", "hello world" ] + , [ "closecdata", undefined ] + , [ "closetag", "script" ] + , [ "closetag", "xml" ] + ] + , strict : false + , opt : { lowercasetags: true, noscript: true } + } + ) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/parser-position.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/parser-position.js new file mode 100644 index 0000000..e4a68b1 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/parser-position.js @@ -0,0 +1,28 @@ +var sax = require("../lib/sax"), + assert = require("assert") + +function testPosition(chunks, expectedEvents) { + var parser = sax.parser(); + expectedEvents.forEach(function(expectation) { + parser['on' + expectation[0]] = function() { + for (var prop in expectation[1]) { + assert.equal(parser[prop], expectation[1][prop]); + } + } + }); + chunks.forEach(function(chunk) { + parser.write(chunk); + }); +}; + +testPosition(['
    abcdefgh
    '], + [ ['opentag', { position: 5, startTagPosition: 1 }] + , ['text', { position: 19, startTagPosition: 14 }] + , ['closetag', { position: 19, startTagPosition: 14 }] + ]); + +testPosition(['
    abcde','fgh
    '], + [ ['opentag', { position: 5, startTagPosition: 1 }] + , ['text', { position: 19, startTagPosition: 14 }] + , ['closetag', { position: 19, startTagPosition: 14 }] + ]); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/script.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/script.js new file mode 100644 index 0000000..464c051 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/script.js @@ -0,0 +1,12 @@ +require(__dirname).test({ + xml : "", + expect : [ + ["opentag", {"name": "HTML","attributes": {}}], + ["opentag", {"name": "HEAD","attributes": {}}], + ["opentag", {"name": "SCRIPT","attributes": {}}], + ["script", "if (1 < 0) { console.log('elo there'); }"], + ["closetag", "SCRIPT"], + ["closetag", "HEAD"], + ["closetag", "HTML"] + ] +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child-strict.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child-strict.js new file mode 100644 index 0000000..ce9c045 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child-strict.js @@ -0,0 +1,40 @@ + +require(__dirname).test({ + xml : + ""+ + "" + + "" + + "" + + "" + + "=(|)" + + "" + + "", + expect : [ + ["opentag", { + "name": "root", + "attributes": {} + }], + ["opentag", { + "name": "child", + "attributes": {} + }], + ["opentag", { + "name": "haha", + "attributes": {} + }], + ["closetag", "haha"], + ["closetag", "child"], + ["opentag", { + "name": "monkey", + "attributes": {} + }], + ["text", "=(|)"], + ["closetag", "monkey"], + ["closetag", "root"], + ["end"], + ["ready"] + ], + strict : true, + opt : {} +}); + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child.js new file mode 100644 index 0000000..bc6b52b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-child.js @@ -0,0 +1,40 @@ + +require(__dirname).test({ + xml : + ""+ + "" + + "" + + "" + + "" + + "=(|)" + + "" + + "", + expect : [ + ["opentag", { + "name": "ROOT", + "attributes": {} + }], + ["opentag", { + "name": "CHILD", + "attributes": {} + }], + ["opentag", { + "name": "HAHA", + "attributes": {} + }], + ["closetag", "HAHA"], + ["closetag", "CHILD"], + ["opentag", { + "name": "MONKEY", + "attributes": {} + }], + ["text", "=(|)"], + ["closetag", "MONKEY"], + ["closetag", "ROOT"], + ["end"], + ["ready"] + ], + strict : false, + opt : {} +}); + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-tag.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-tag.js new file mode 100644 index 0000000..b2c5736 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/self-closing-tag.js @@ -0,0 +1,25 @@ + +require(__dirname).test({ + xml : + " "+ + " "+ + " "+ + " "+ + "=(|) "+ + ""+ + " ", + expect : [ + ["opentag", {name:"ROOT", attributes:{}}], + ["opentag", {name:"HAHA", attributes:{}}], + ["closetag", "HAHA"], + ["opentag", {name:"HAHA", attributes:{}}], + ["closetag", "HAHA"], + // ["opentag", {name:"HAHA", attributes:{}}], + // ["closetag", "HAHA"], + ["opentag", {name:"MONKEY", attributes:{}}], + ["text", "=(|)"], + ["closetag", "MONKEY"], + ["closetag", "ROOT"] + ], + opt : { trim : true } +}); \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/stray-ending.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/stray-ending.js new file mode 100644 index 0000000..6b0aa7f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/stray-ending.js @@ -0,0 +1,17 @@ +// stray ending tags should just be ignored in non-strict mode. +// https://github.com/isaacs/sax-js/issues/32 +require(__dirname).test + ( { xml : + "" + , expect : + [ [ "opentag", { name: "A", attributes: {} } ] + , [ "opentag", { name: "B", attributes: {} } ] + , [ "text", "" ] + , [ "closetag", "B" ] + , [ "closetag", "A" ] + ] + , strict : false + , opt : {} + } + ) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/trailing-non-whitespace.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/trailing-non-whitespace.js new file mode 100644 index 0000000..3e1fb2e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/trailing-non-whitespace.js @@ -0,0 +1,17 @@ + +require(__dirname).test({ + xml : "Welcome, to monkey land", + expect : [ + ["opentag", { + "name": "SPAN", + "attributes": {} + }], + ["text", "Welcome,"], + ["closetag", "SPAN"], + ["text", " to monkey land"], + ["end"], + ["ready"] + ], + strict : false, + opt : {} +}); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/unquoted.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/unquoted.js new file mode 100644 index 0000000..79f1d0b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/unquoted.js @@ -0,0 +1,17 @@ +// unquoted attributes should be ok in non-strict mode +// https://github.com/isaacs/sax-js/issues/31 +require(__dirname).test + ( { xml : + "" + , expect : + [ [ "attribute", { name: "class", value: "test" } ] + , [ "attribute", { name: "hello", value: "world" } ] + , [ "opentag", { name: "SPAN", + attributes: { class: "test", hello: "world" } } ] + , [ "closetag", "SPAN" ] + ] + , strict : false + , opt : {} + } + ) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-issue-41.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-issue-41.js new file mode 100644 index 0000000..596d82b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-issue-41.js @@ -0,0 +1,67 @@ +var t = require(__dirname) + + , xmls = // should be the same both ways. + [ "" + , "" ] + + , ex1 = + [ [ "opennamespace" + , { prefix: "a" + , uri: "http://ATTRIBUTE" + } + ] + , [ "attribute" + , { name: "xmlns:a" + , value: "http://ATTRIBUTE" + , prefix: "xmlns" + , local: "a" + , uri: "http://www.w3.org/2000/xmlns/" + } + ] + , [ "attribute" + , { name: "a:attr" + , local: "attr" + , prefix: "a" + , uri: "http://ATTRIBUTE" + , value: "value" + } + ] + , [ "opentag" + , { name: "parent" + , uri: "" + , prefix: "" + , local: "parent" + , attributes: + { "a:attr": + { name: "a:attr" + , local: "attr" + , prefix: "a" + , uri: "http://ATTRIBUTE" + , value: "value" + } + , "xmlns:a": + { name: "xmlns:a" + , local: "a" + , prefix: "xmlns" + , uri: "http://www.w3.org/2000/xmlns/" + , value: "http://ATTRIBUTE" + } + } + , ns: {"a": "http://ATTRIBUTE"} + } + ] + , ["closetag", "parent"] + , ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }] + ] + + // swap the order of elements 2 and 1 + , ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3)) + , expected = [ex1, ex2] + +xmls.forEach(function (x, i) { + t.test({ xml: x + , expect: expected[i] + , strict: true + , opt: { xmlns: true } + }) +}) diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-rebinding.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-rebinding.js new file mode 100644 index 0000000..f464876 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-rebinding.js @@ -0,0 +1,59 @@ + +require(__dirname).test + ( { xml : + ""+ + ""+ + ""+ + ""+ + ""+ + "" + + , expect : + [ [ "opennamespace", { prefix: "x", uri: "x1" } ] + , [ "opennamespace", { prefix: "y", uri: "y1" } ] + , [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ] + , [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ] + , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ] + , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ] + , [ "opentag", { name: "root", uri: "", prefix: "", local: "root", + attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } + , "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } + , "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } + , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } }, + ns: { x: 'x1', y: 'y1' } } ] + + , [ "opennamespace", { prefix: "x", uri: "x2" } ] + , [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ] + , [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind", + attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } }, + ns: { x: 'x2' } } ] + + , [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ] + , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ] + , [ "opentag", { name: "check", uri: "", prefix: "", local: "check", + attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } + , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } }, + ns: { x: 'x2' } } ] + + , [ "closetag", "check" ] + + , [ "closetag", "rebind" ] + , [ "closenamespace", { prefix: "x", uri: "x2" } ] + + , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ] + , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ] + , [ "opentag", { name: "check", uri: "", prefix: "", local: "check", + attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } + , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } }, + ns: { x: 'x1', y: 'y1' } } ] + , [ "closetag", "check" ] + + , [ "closetag", "root" ] + , [ "closenamespace", { prefix: "x", uri: "x1" } ] + , [ "closenamespace", { prefix: "y", uri: "y1" } ] + ] + , strict : true + , opt : { xmlns: true } + } + ) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-strict.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-strict.js new file mode 100644 index 0000000..4ad615b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-strict.js @@ -0,0 +1,71 @@ + +require(__dirname).test + ( { xml : + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + "" + + , expect : + [ [ "opentag", { name: "root", prefix: "", local: "root", uri: "", + attributes: {}, ns: {} } ] + + , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ] + , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "", + attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } }, + ns: {} } ] + , [ "closetag", "plain" ] + + , [ "opennamespace", { prefix: "", uri: "uri:default" } ] + + , [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ] + , [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default", + attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } }, + ns: { "": "uri:default" } } ] + + , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } ] + , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' }, + attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } } } ] + , [ "closetag", "plain" ] + + , [ "closetag", "ns1" ] + + , [ "closenamespace", { prefix: "", uri: "uri:default" } ] + + , [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ] + + , [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ] + + , [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "", + attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } }, + ns: { a: "uri:nsa" } } ] + + , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ] + , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "", + attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } }, + ns: { a: 'uri:nsa' } } ] + , [ "closetag", "plain" ] + + , [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ] + , [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa", + attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } }, + ns: { a: 'uri:nsa' } } ] + , [ "closetag", "a:ns" ] + + , [ "closetag", "ns2" ] + + , [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ] + + , [ "closetag", "root" ] + ] + , strict : true + , opt : { xmlns: true } + } + ) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-unbound.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-unbound.js new file mode 100644 index 0000000..2944b87 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-unbound.js @@ -0,0 +1,15 @@ + +require(__dirname).test( + { strict : true + , opt : { xmlns: true } + , expect : + [ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"] + + , [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ] + , [ "opentag", { name: "root", uri: "", prefix: "", local: "root", + attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } }, + ns: {} } ] + , [ "closetag", "root" ] + ] + } +).write("") diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js new file mode 100644 index 0000000..16da771 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js @@ -0,0 +1,35 @@ +require(__dirname).test( + { xml : "" + , expect : + [ [ "attribute" + , { name: "xml:lang" + , local: "lang" + , prefix: "xml" + , uri: "http://www.w3.org/XML/1998/namespace" + , value: "en" + } + ] + , [ "opentag" + , { name: "root" + , uri: "" + , prefix: "" + , local: "root" + , attributes: + { "xml:lang": + { name: "xml:lang" + , local: "lang" + , prefix: "xml" + , uri: "http://www.w3.org/XML/1998/namespace" + , value: "en" + } + } + , ns: {} + } + ] + , ["closetag", "root"] + ] + , strict : true + , opt : { xmlns: true } + } +) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix.js new file mode 100644 index 0000000..9a1ce1b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-prefix.js @@ -0,0 +1,20 @@ +require(__dirname).test( + { xml : "" + , expect : + [ + [ "opentag" + , { name: "xml:root" + , uri: "http://www.w3.org/XML/1998/namespace" + , prefix: "xml" + , local: "root" + , attributes: {} + , ns: {} + } + ] + , ["closetag", "xml:root"] + ] + , strict : true + , opt : { xmlns: true } + } +) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-redefine.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-redefine.js new file mode 100644 index 0000000..1eba9c7 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/sax/test/xmlns-xml-default-redefine.js @@ -0,0 +1,40 @@ +require(__dirname).test( + { xml : "" + , expect : + [ ["error" + , "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n" + + "Actual: ERROR\n" + + "Line: 0\nColumn: 27\nChar: '" + ] + , [ "attribute" + , { name: "xmlns:xml" + , local: "xml" + , prefix: "xmlns" + , uri: "http://www.w3.org/2000/xmlns/" + , value: "ERROR" + } + ] + , [ "opentag" + , { name: "xml:root" + , uri: "http://www.w3.org/XML/1998/namespace" + , prefix: "xml" + , local: "root" + , attributes: + { "xmlns:xml": + { name: "xmlns:xml" + , local: "xml" + , prefix: "xmlns" + , uri: "http://www.w3.org/2000/xmlns/" + , value: "ERROR" + } + } + , ns: {} + } + ] + , ["closetag", "xml:root"] + ] + , strict : true + , opt : { xmlns: true } + } +) + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/README.md new file mode 100644 index 0000000..951c539 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/README.md @@ -0,0 +1,388 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install --save semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean(' =v1.2.3 ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +SemVer 5.3.0 + +A JavaScript implementation of the http://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `loose` boolean argument that, if +true, will be more forgiving about not-quite-valid semver strings. +The resulting output will always be 100% strict, of course. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, the `prerelease` will work the + same as `prepatch`. It increments the patch version, then makes a + prerelease. If the input version is already a prerelease it simply + increments it. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the exact same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `diff(v1, v2)`: Returns difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `gtr(version, range)`: Return `true` if version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver +string to semver. It looks for the first digit in a string, and +consumes all remaining characters which satisfy at least a partial semver +(e.g., `1`, `1.2`, `1.2.3`) up to the max permitted length (256 characters). +Longer versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). +All surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes `3.4.0`). +Only text which lacks digits will fail coercion (`version one` is not valid). +The maximum length for any semver component considered for coercion is 16 characters; +longer components will be ignored (`10000000000000000.4.7.4` becomes `4.7.4`). +The maximum value for any semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; +higher value components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/bin/semver b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/bin/semver new file mode 100644 index 0000000..dddbcdf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/bin/semver @@ -0,0 +1,143 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + , versions = [] + , range = [] + , gt = [] + , lt = [] + , eq = [] + , inc = null + , version = require("../package.json").version + , loose = false + , coerce = false + , identifier = undefined + , semver = require("../semver") + , reverse = false + +main() + +function main () { + if (!argv.length) return help() + while (argv.length) { + var a = argv.shift() + var i = a.indexOf('=') + if (i !== -1) { + a = a.slice(0, i) + argv.unshift(a.slice(i + 1)) + } + switch (a) { + case "-rv": case "-rev": case "--rev": case "--reverse": + reverse = true + break + case "-l": case "--loose": + loose = true + break + case "-v": case "--version": + versions.push(argv.shift()) + break + case "-i": case "--inc": case "--increment": + switch (argv[0]) { + case "major": case "minor": case "patch": case "prerelease": + case "premajor": case "preminor": case "prepatch": + inc = argv.shift() + break + default: + inc = "patch" + break + } + break + case "--preid": + identifier = argv.shift() + break + case "-r": case "--range": + range.push(argv.shift()) + break + case "-c": case "--coerce": + coerce = true + break + case "-h": case "--help": case "-?": + return help() + default: + versions.push(a) + break + } + } + + versions = versions.map(function (v) { + return coerce ? (semver.coerce(v) || {version: v}).version : v + }).filter(function (v) { + return semver.valid(v) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) + return failInc() + + for (var i = 0, l = range.length; i < l ; i ++) { + versions = versions.filter(function (v) { + return semver.satisfies(v, range[i], loose) + }) + if (!versions.length) return fail() + } + return success(versions) +} + +function failInc () { + console.error("--inc can only be used on a single version with no range") + fail() +} + +function fail () { process.exit(1) } + +function success () { + var compare = reverse ? "rcompare" : "compare" + versions.sort(function (a, b) { + return semver[compare](a, b, loose) + }).map(function (v) { + return semver.clean(v, loose) + }).map(function (v) { + return inc ? semver.inc(v, inc, loose, identifier) : v + }).forEach(function (v,i,_) { console.log(v) }) +} + +function help () { + console.log(["SemVer " + version + ,"" + ,"A JavaScript implementation of the http://semver.org/ specification" + ,"Copyright Isaac Z. Schlueter" + ,"" + ,"Usage: semver [options] [ [...]]" + ,"Prints valid versions sorted by SemVer precedence" + ,"" + ,"Options:" + ,"-r --range " + ," Print versions that match the specified range." + ,"" + ,"-i --increment []" + ," Increment a version by the specified level. Level can" + ," be one of: major, minor, patch, premajor, preminor," + ," prepatch, or prerelease. Default level is 'patch'." + ," Only one version may be specified." + ,"" + ,"--preid " + ," Identifier to be used to prefix premajor, preminor," + ," prepatch or prerelease version increments." + ,"" + ,"-l --loose" + ," Interpret versions and ranges loosely" + ,"" + ,"-c --coerce" + ," Coerce a string into SemVer if possible" + ," (does not imply --loose)" + ,"" + ,"Program exits successfully if any valid version satisfies" + ,"all supplied ranges, and prints all satisfying versions." + ,"" + ,"If no satisfying versions are found, then exits failure." + ,"" + ,"Versions are printed in ascending order, so supplying" + ,"multiple versions to the utility will just sort them." + ].join("\n")) +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/package.json new file mode 100644 index 0000000..070e2f6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/package.json @@ -0,0 +1,55 @@ +{ + "_from": "semver@^5.4.1", + "_id": "semver@5.5.0", + "_inBundle": true, + "_integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "_location": "/cordova-android/semver", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "semver@^5.4.1", + "name": "semver", + "escapedName": "semver", + "rawSpec": "^5.4.1", + "saveSpec": null, + "fetchSpec": "^5.4.1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/android-versions" + ], + "_resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "_shasum": "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab", + "_spec": "semver@^5.4.1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/android-versions", + "bin": { + "semver": "./bin/semver" + }, + "bugs": { + "url": "https://github.com/npm/node-semver/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The semantic version parser used by npm.", + "devDependencies": { + "tap": "^10.7.0" + }, + "files": [ + "bin", + "range.bnf", + "semver.js" + ], + "homepage": "https://github.com/npm/node-semver#readme", + "license": "ISC", + "main": "semver.js", + "name": "semver", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-semver.git" + }, + "scripts": { + "test": "tap test/*.js --cov -J" + }, + "version": "5.5.0" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/range.bnf b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/range.bnf new file mode 100644 index 0000000..d4c6ae0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | [1-9] ( [0-9] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/semver.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/semver.js new file mode 100644 index 0000000..9cf9f6e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/semver/semver.js @@ -0,0 +1,1324 @@ +exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. +/* nomin */ var debug; +/* nomin */ if (typeof process === 'object' && + /* nomin */ process.env && + /* nomin */ process.env.NODE_DEBUG && + /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) + /* nomin */ debug = function() { + /* nomin */ var args = Array.prototype.slice.call(arguments, 0); + /* nomin */ args.unshift('SEMVER'); + /* nomin */ console.log.apply(console, args); + /* nomin */ }; +/* nomin */ else + /* nomin */ debug = function() {}; + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +var MAX_LENGTH = 256; +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++; +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + if (version.length > MAX_LENGTH) + return null; + + var r = loose ? re[LOOSE] : re[FULL]; + if (!r.test(version)) + return null; + + try { + return new SemVer(version, loose); + } catch (er) { + return null; + } +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (version.length > MAX_LENGTH) + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + debug('SemVer', version, loose); + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) + throw new TypeError('Invalid major version') + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) + throw new TypeError('Invalid minor version') + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) + throw new TypeError('Invalid patch version') + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + if (/^[0-9]+$/.test(id)) { + var num = +id; + if (num >= 0 && num < MAX_SAFE_INTEGER) + return num; + } + return id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + debug('SemVer.compare', this.version, this.loose, other); + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; + this.inc('pre', identifier); + break; + case 'preminor': + this.prerelease.length = 0; + this.patch = 0; + this.minor++; + this.inc('pre', identifier); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) + this.prerelease = [identifier, 0]; + } else + this.prerelease = [identifier, 0]; + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + this.raw = this.version; + return this; +}; + +exports.inc = inc; +function inc(version, release, loose, identifier) { + if (typeof(loose) === 'string') { + identifier = loose; + loose = undefined; + } + + try { + return new SemVer(version, loose).inc(release, identifier).version; + } catch (er) { + return null; + } +} + +exports.diff = diff; +function diff(version1, version2) { + if (eq(version1, version2)) { + return null; + } else { + var v1 = parse(version1); + var v2 = parse(version2); + if (v1.prerelease.length || v2.prerelease.length) { + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return 'pre'+key; + } + } + } + return 'prerelease'; + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return key; + } + } + } + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.major = major; +function major(a, loose) { + return new SemVer(a, loose).major; +} + +exports.minor = minor; +function minor(a, loose) { + return new SemVer(a, loose).minor; +} + +exports.patch = patch; +function patch(a, loose) { + return new SemVer(a, loose).patch; +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + debug('comparator', comp, loose); + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; + + debug('comp', this); +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else + this.semver = new SemVer(m[2], this.loose); +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + debug('Comparator.test', version, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); +}; + +Comparator.prototype.intersects = function(comp, loose) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required'); + } + + var rangeTmp; + + if (this.operator === '') { + rangeTmp = new Range(comp.value, loose); + return satisfies(this.value, rangeTmp, loose); + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, loose); + return satisfies(comp.semver, rangeTmp, loose); + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>'); + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<'); + var sameSemVer = this.semver.version === comp.semver.version; + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<='); + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, loose) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')); + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, loose) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')); + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; +}; + + +exports.Range = Range; +function Range(range, loose) { + if (range instanceof Range) { + if (range.loose === loose) { + return range; + } else { + return new Range(range.raw, loose); + } + } + + if (range instanceof Comparator) { + return new Range(range.value, loose); + } + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + debug('range', range, loose); + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, re[COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +Range.prototype.intersects = function(range, loose) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required'); + } + + return this.set.some(function(thisComparators) { + return thisComparators.every(function(thisComparator) { + return range.set.some(function(rangeComparators) { + return rangeComparators.every(function(rangeComparator) { + return thisComparator.intersects(rangeComparator, loose); + }); + }); + }); + }); +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + debug('comp', comp); + comp = replaceCarets(comp, loose); + debug('caret', comp); + comp = replaceTildes(comp, loose); + debug('tildes', comp); + comp = replaceXRanges(comp, loose); + debug('xrange', comp); + comp = replaceStars(comp, loose); + debug('stars', comp); + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else if (pr) { + debug('replaceTilde pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + + debug('tilde return', ret); + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + debug('caret', comp, loose); + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; + } else if (pr) { + debug('replaceCaret pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0'; + } else { + debug('no pr'); + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; + } + + debug('caret return', ret); + return ret; + }); +} + +function replaceXRanges(comp, loose) { + debug('replaceXRanges', comp, loose); + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0'; + } else { + // nothing is forbidden + ret = '*'; + } + } else if (gtlt && anyX) { + // replace X with 0 + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>='; + if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<'; + if (xm) + M = +M + 1; + else + m = +m + 1; + } + + ret = gtlt + M + '.' + m + '.' + p; + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } + + debug('xRange return', ret); + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + debug('replaceStars', comp, loose); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) + continue; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + var max = null; + var maxSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) + max = v; + maxSV = new SemVer(max, loose); + } + } + }) + return max; +} + +exports.minSatisfying = minSatisfying; +function minSatisfying(versions, range, loose) { + var min = null; + var minSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!min || minSV.compare(v) === 1) { // compare(min, v, true) + min = v; + minSV = new SemVer(min, loose); + } + } + }) + return min; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +exports.prerelease = prerelease; +function prerelease(version, loose) { + var parsed = parse(version, loose); + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; +} + +exports.intersects = intersects; +function intersects(r1, r2, loose) { + r1 = new Range(r1, loose) + r2 = new Range(r2, loose) + return r1.intersects(r2) +} + +exports.coerce = coerce; +function coerce(version) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + var match = version.match(re[COERCE]); + + if (match == null) + return null; + + return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.documentup.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.documentup.json new file mode 100644 index 0000000..57fe301 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.documentup.json @@ -0,0 +1,6 @@ +{ + "name": "ShellJS", + "twitter": [ + "r2r" + ] +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.jshintrc b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.jshintrc new file mode 100644 index 0000000..a80c559 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.jshintrc @@ -0,0 +1,7 @@ +{ + "loopfunc": true, + "sub": true, + "undef": true, + "unused": true, + "node": true +} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.npmignore new file mode 100644 index 0000000..6b20c38 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.npmignore @@ -0,0 +1,2 @@ +test/ +tmp/ \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.travis.yml new file mode 100644 index 0000000..1b3280a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.10" + - "0.11" + - "0.12" + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/LICENSE new file mode 100644 index 0000000..1b35ee9 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +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. + * Neither the name of Artur Adib nor the + names of the contributors may 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 ARTUR ADIB 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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/README.md new file mode 100644 index 0000000..d08d13e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/README.md @@ -0,0 +1,579 @@ +# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs) + +ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! + +The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like: + ++ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader ++ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger ++ [JSHint](http://jshint.com) - Most popular JavaScript linter ++ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers ++ [Yeoman](http://yeoman.io/) - Web application stack and development tool ++ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation + +and [many more](https://npmjs.org/browse/depended/shelljs). + +Connect with [@r2r](http://twitter.com/r2r) on Twitter for questions, suggestions, etc. + +## Installing + +Via npm: + +```bash +$ npm install [-g] shelljs +``` + +If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to +run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: + +```bash +$ shjs my_script +``` + +You can also just copy `shell.js` into your project's directory, and `require()` accordingly. + + +## Examples + +### JavaScript + +```javascript +require('shelljs/global'); + +if (!which('git')) { + echo('Sorry, this script requires git'); + exit(1); +} + +// Copy files to release dir +mkdir('-p', 'out/Release'); +cp('-R', 'stuff/*', 'out/Release'); + +// Replace macros in each .js file +cd('lib'); +ls('*.js').forEach(function(file) { + sed('-i', 'BUILD_VERSION', 'v0.1.2', file); + sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); + sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); +}); +cd('..'); + +// Run external tool synchronously +if (exec('git commit -am "Auto-commit"').code !== 0) { + echo('Error: Git commit failed'); + exit(1); +} +``` + +### CoffeeScript + +```coffeescript +require 'shelljs/global' + +if not which 'git' + echo 'Sorry, this script requires git' + exit 1 + +# Copy files to release dir +mkdir '-p', 'out/Release' +cp '-R', 'stuff/*', 'out/Release' + +# Replace macros in each .js file +cd 'lib' +for file in ls '*.js' + sed '-i', 'BUILD_VERSION', 'v0.1.2', file + sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file + sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file +cd '..' + +# Run external tool synchronously +if (exec 'git commit -am "Auto-commit"').code != 0 + echo 'Error: Git commit failed' + exit 1 +``` + +## Global vs. Local + +The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. + +Example: + +```javascript +var shell = require('shelljs'); +shell.echo('hello world'); +``` + +## Make tool + +A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script. + +Example (CoffeeScript): + +```coffeescript +require 'shelljs/make' + +target.all = -> + target.bundle() + target.docs() + +target.bundle = -> + cd __dirname + mkdir 'build' + cd 'lib' + (cat '*.js').to '../build/output.js' + +target.docs = -> + cd __dirname + mkdir 'docs' + cd 'lib' + for file in ls '*.js' + text = grep '//@', file # extract special comments + text.replace '//@', '' # remove comment tags + text.to 'docs/my_docs.md' +``` + +To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`. + +You can also pass arguments to your targets by using the `--` separator. For example, to pass `arg1` and `arg2` to a target `bundle`, do `$ node make bundle -- arg1 arg2`: + +```javascript +require('shelljs/make'); + +target.bundle = function(argsArray) { + // argsArray = ['arg1', 'arg2'] + /* ... */ +} +``` + + + + + +## Command reference + + +All commands run synchronously, unless otherwise stated. + + +### cd('dir') +Changes to directory `dir` for the duration of the script + + +### pwd() +Returns the current directory. + + +### ls([options ,] path [,path ...]) +### ls([options ,] path_array) +Available options: + ++ `-R`: recursive ++ `-A`: all files (include files beginning with `.`, except for `.` and `..`) + +Examples: + +```javascript +ls('projs/*.js'); +ls('-R', '/users/me', '/tmp'); +ls('-R', ['/users/me', '/tmp']); // same as above +``` + +Returns array of files in the given path, or in current directory if no path provided. + + +### find(path [,path ...]) +### find(path_array) +Examples: + +```javascript +find('src', 'lib'); +find(['src', 'lib']); // same as above +find('.').filter(function(file) { return file.match(/\.js$/); }); +``` + +Returns array of all files (however deep) in the given paths. + +The main difference from `ls('-R', path)` is that the resulting file names +include the base directories, e.g. `lib/resources/file1` instead of just `file1`. + + +### cp([options ,] source [,source ...], dest) +### cp([options ,] source_array, dest) +Available options: + ++ `-f`: force ++ `-r, -R`: recursive + +Examples: + +```javascript +cp('file1', 'dir1'); +cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); +cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above +``` + +Copies files. The wildcard `*` is accepted. + + +### rm([options ,] file [, file ...]) +### rm([options ,] file_array) +Available options: + ++ `-f`: force ++ `-r, -R`: recursive + +Examples: + +```javascript +rm('-rf', '/tmp/*'); +rm('some_file.txt', 'another_file.txt'); +rm(['some_file.txt', 'another_file.txt']); // same as above +``` + +Removes files. The wildcard `*` is accepted. + + +### mv(source [, source ...], dest') +### mv(source_array, dest') +Available options: + ++ `f`: force + +Examples: + +```javascript +mv('-f', 'file', 'dir/'); +mv('file1', 'file2', 'dir/'); +mv(['file1', 'file2'], 'dir/'); // same as above +``` + +Moves files. The wildcard `*` is accepted. + + +### mkdir([options ,] dir [, dir ...]) +### mkdir([options ,] dir_array) +Available options: + ++ `p`: full path (will create intermediate dirs if necessary) + +Examples: + +```javascript +mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); +mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above +``` + +Creates directories. + + +### test(expression) +Available expression primaries: + ++ `'-b', 'path'`: true if path is a block device ++ `'-c', 'path'`: true if path is a character device ++ `'-d', 'path'`: true if path is a directory ++ `'-e', 'path'`: true if path exists ++ `'-f', 'path'`: true if path is a regular file ++ `'-L', 'path'`: true if path is a symbolic link ++ `'-p', 'path'`: true if path is a pipe (FIFO) ++ `'-S', 'path'`: true if path is a socket + +Examples: + +```javascript +if (test('-d', path)) { /* do something with dir */ }; +if (!test('-f', path)) continue; // skip if it's a regular file +``` + +Evaluates expression using the available primaries and returns corresponding value. + + +### cat(file [, file ...]) +### cat(file_array) + +Examples: + +```javascript +var str = cat('file*.txt'); +var str = cat('file1', 'file2'); +var str = cat(['file1', 'file2']); // same as above +``` + +Returns a string containing the given file, or a concatenated string +containing the files if more than one file is given (a new line character is +introduced between each file). Wildcard `*` accepted. + + +### 'string'.to(file) + +Examples: + +```javascript +cat('input.txt').to('output.txt'); +``` + +Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as +those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ + + +### 'string'.toEnd(file) + +Examples: + +```javascript +cat('input.txt').toEnd('output.txt'); +``` + +Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as +those returned by `cat`, `grep`, etc). + + +### sed([options ,] search_regex, replacement, file) +Available options: + ++ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ + +Examples: + +```javascript +sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); +sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); +``` + +Reads an input string from `file` and performs a JavaScript `replace()` on the input +using the given search regex and replacement string or function. Returns the new string after replacement. + + +### grep([options ,] regex_filter, file [, file ...]) +### grep([options ,] regex_filter, file_array) +Available options: + ++ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. + +Examples: + +```javascript +grep('-v', 'GLOBAL_VARIABLE', '*.js'); +grep('GLOBAL_VARIABLE', '*.js'); +``` + +Reads input string from given files and returns a string containing all lines of the +file that match the given `regex_filter`. Wildcard `*` accepted. + + +### which(command) + +Examples: + +```javascript +var nodeExec = which('node'); +``` + +Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. +Returns string containing the absolute path to the command. + + +### echo(string [,string ...]) + +Examples: + +```javascript +echo('hello world'); +var str = echo('hello world'); +``` + +Prints string to stdout, and returns string with additional utility methods +like `.to()`. + + +### pushd([options,] [dir | '-N' | '+N']) + +Available options: + ++ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. + +Arguments: + ++ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. ++ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. ++ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. + +Examples: + +```javascript +// process.cwd() === '/usr' +pushd('/etc'); // Returns /etc /usr +pushd('+1'); // Returns /usr /etc +``` + +Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. + +### popd([options,] ['-N' | '+N']) + +Available options: + ++ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. + +Arguments: + ++ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. ++ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. + +Examples: + +```javascript +echo(process.cwd()); // '/usr' +pushd('/etc'); // '/etc /usr' +echo(process.cwd()); // '/etc' +popd(); // '/usr' +echo(process.cwd()); // '/usr' +``` + +When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. + +### dirs([options | '+N' | '-N']) + +Available options: + ++ `-c`: Clears the directory stack by deleting all of the elements. + +Arguments: + ++ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. ++ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. + +Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. + +See also: pushd, popd + + +### ln(options, source, dest) +### ln(source, dest) +Available options: + ++ `s`: symlink ++ `f`: force + +Examples: + +```javascript +ln('file', 'newlink'); +ln('-sf', 'file', 'existing'); +``` + +Links source to dest. Use -f to force the link, should dest already exist. + + +### exit(code) +Exits the current process with the given exit code. + +### env['VAR_NAME'] +Object containing environment variables (both getter and setter). Shortcut to process.env. + +### exec(command [, options] [, callback]) +Available options (all `false` by default): + ++ `async`: Asynchronous execution. Defaults to true if a callback is provided. ++ `silent`: Do not echo program output to console. + +Examples: + +```javascript +var version = exec('node --version', {silent:true}).output; + +var child = exec('some_long_running_process', {async:true}); +child.stdout.on('data', function(data) { + /* ... do something with data ... */ +}); + +exec('some_long_running_process', function(code, output) { + console.log('Exit code:', code); + console.log('Program output:', output); +}); +``` + +Executes the given `command` _synchronously_, unless otherwise specified. +When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's +`output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and +the `callback` gets the arguments `(code, output)`. + +**Note:** For long-lived processes, it's best to run `exec()` asynchronously as +the current synchronous implementation uses a lot of CPU. This should be getting +fixed soon. + + +### chmod(octal_mode || octal_string, file) +### chmod(symbolic_mode, file) + +Available options: + ++ `-v`: output a diagnostic for every file processed ++ `-c`: like verbose but report only when a change is made ++ `-R`: change files and directories recursively + +Examples: + +```javascript +chmod(755, '/Users/brandon'); +chmod('755', '/Users/brandon'); // same as above +chmod('u+x', '/Users/brandon'); +``` + +Alters the permissions of a file or directory by either specifying the +absolute permissions in octal form or expressing the changes in symbols. +This command tries to mimic the POSIX behavior as much as possible. +Notable exceptions: + ++ In symbolic modes, 'a-r' and '-r' are identical. No consideration is + given to the umask. ++ There is no "quiet" option since default behavior is to run silent. + + +## Non-Unix commands + + +### tempdir() + +Examples: + +```javascript +var tmp = tempdir(); // "/tmp" for most *nix platforms +``` + +Searches and returns string containing a writeable, platform-dependent temporary directory. +Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). + + +### error() +Tests if error occurred in the last command. Returns `null` if no error occurred, +otherwise returns string explaining the error + + +## Configuration + + +### config.silent +Example: + +```javascript +var sh = require('shelljs'); +var silentState = sh.config.silent; // save old silent state +sh.config.silent = true; +/* ... */ +sh.config.silent = silentState; // restore old silent state +``` + +Suppresses all command output if `true`, except for `echo()` calls. +Default is `false`. + +### config.fatal +Example: + +```javascript +require('shelljs/global'); +config.fatal = true; +cp('this_file_does_not_exist', '/dev/null'); // dies here +/* more commands... */ +``` + +If `true` the script will die on errors. Default is `false`. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/RELEASE.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/RELEASE.md new file mode 100644 index 0000000..69ef3fb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/RELEASE.md @@ -0,0 +1,9 @@ +# Release steps + +* Ensure master passes CI tests +* Bump version in package.json. Any breaking change or new feature should bump minor (or even major). Non-breaking changes or fixes can just bump patch. +* Update README manually if the changes are not documented in-code. If so, run `scripts/generate-docs.js` +* Commit +* `$ git tag ` (see `git tag -l` for latest) +* `$ git push origin master --tags` +* `$ npm publish .` diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/bin/shjs b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/bin/shjs new file mode 100644 index 0000000..d239a7a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/bin/shjs @@ -0,0 +1,51 @@ +#!/usr/bin/env node +require('../global'); + +if (process.argv.length < 3) { + console.log('ShellJS: missing argument (script name)'); + console.log(); + process.exit(1); +} + +var args, + scriptName = process.argv[2]; +env['NODE_PATH'] = __dirname + '/../..'; + +if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { + if (test('-f', scriptName + '.js')) + scriptName += '.js'; + if (test('-f', scriptName + '.coffee')) + scriptName += '.coffee'; +} + +if (!test('-f', scriptName)) { + console.log('ShellJS: script not found ('+scriptName+')'); + console.log(); + process.exit(1); +} + +args = process.argv.slice(3); + +for (var i = 0, l = args.length; i < l; i++) { + if (args[i][0] !== "-"){ + args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words + } +} + +if (scriptName.match(/\.coffee$/)) { + // + // CoffeeScript + // + if (which('coffee')) { + exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true }); + } else { + console.log('ShellJS: CoffeeScript interpreter not found'); + console.log(); + process.exit(1); + } +} else { + // + // JavaScript + // + exec('node ' + scriptName + ' ' + args.join(' '), { async: true }); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/global.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/global.js new file mode 100644 index 0000000..97f0033 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/global.js @@ -0,0 +1,3 @@ +var shell = require('./shell.js'); +for (var cmd in shell) + global[cmd] = shell[cmd]; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/make.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/make.js new file mode 100644 index 0000000..f78b4cf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/make.js @@ -0,0 +1,56 @@ +require('./global'); + +global.config.fatal = true; +global.target = {}; + +var args = process.argv.slice(2), + targetArgs, + dashesLoc = args.indexOf('--'); + +// split args, everything after -- if only for targets +if (dashesLoc > -1) { + targetArgs = args.slice(dashesLoc + 1, args.length); + args = args.slice(0, dashesLoc); +} + +// This ensures we only execute the script targets after the entire script has +// been evaluated +setTimeout(function() { + var t; + + if (args.length === 1 && args[0] === '--help') { + console.log('Available targets:'); + for (t in global.target) + console.log(' ' + t); + return; + } + + // Wrap targets to prevent duplicate execution + for (t in global.target) { + (function(t, oldTarget){ + + // Wrap it + global.target[t] = function() { + if (oldTarget.done) + return; + oldTarget.done = true; + return oldTarget.apply(oldTarget, arguments); + }; + + })(t, global.target[t]); + } + + // Execute desired targets + if (args.length > 0) { + args.forEach(function(arg) { + if (arg in global.target) + global.target[arg](targetArgs); + else { + console.log('no such target: ' + arg); + } + }); + } else if ('all' in global.target) { + global.target.all(targetArgs); + } + +}, 0); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/package.json new file mode 100644 index 0000000..e9fa4e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/package.json @@ -0,0 +1,67 @@ +{ + "_from": "shelljs@0.5.3", + "_id": "shelljs@0.5.3", + "_inBundle": true, + "_integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=", + "_location": "/cordova-android/shelljs", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "shelljs@0.5.3", + "name": "shelljs", + "escapedName": "shelljs", + "rawSpec": "0.5.3", + "saveSpec": null, + "fetchSpec": "0.5.3" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", + "_shasum": "c54982b996c76ef0c1e6b59fbdc5825f5b713113", + "_spec": "shelljs@0.5.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android", + "author": { + "name": "Artur Adib", + "email": "arturadib@gmail.com" + }, + "bin": { + "shjs": "./bin/shjs" + }, + "bugs": { + "url": "https://github.com/arturadib/shelljs/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Portable Unix shell commands for Node.js", + "devDependencies": { + "jshint": "~2.1.11" + }, + "engines": { + "node": ">=0.8.0" + }, + "homepage": "http://github.com/arturadib/shelljs", + "keywords": [ + "unix", + "shell", + "makefile", + "make", + "jake", + "synchronous" + ], + "license": "BSD*", + "main": "./shell.js", + "name": "shelljs", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git://github.com/arturadib/shelljs.git" + }, + "scripts": { + "test": "node scripts/run-tests" + }, + "version": "0.5.3" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js new file mode 100644 index 0000000..532fed9 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js @@ -0,0 +1,21 @@ +#!/usr/bin/env node +require('../global'); + +echo('Appending docs to README.md'); + +cd(__dirname + '/..'); + +// Extract docs from shell.js +var docs = grep('//@', 'shell.js'); + +docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) { + var file = path.match('.js$') ? path : path+'.js'; + return grep('//@', file); +}); + +// Remove '//@' +docs = docs.replace(/\/\/\@ ?/g, ''); +// Append docs to README +sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md'); + +echo('All done.'); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js new file mode 100644 index 0000000..f9d31e0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node +require('../global'); + +var path = require('path'); + +var failed = false; + +// +// Lint +// +JSHINT_BIN = './node_modules/jshint/bin/jshint'; +cd(__dirname + '/..'); + +if (!test('-f', JSHINT_BIN)) { + echo('JSHint not found. Run `npm install` in the root dir first.'); + exit(1); +} + +if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) { + failed = true; + echo('*** JSHINT FAILED! (return code != 0)'); + echo(); +} else { + echo('All JSHint tests passed'); + echo(); +} + +// +// Unit tests +// +cd(__dirname + '/../test'); +ls('*.js').forEach(function(file) { + echo('Running test:', file); + if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) + failed = true; + echo('*** TEST FAILED! (missing exit code "123")'); + echo(); + } +}); + +if (failed) { + echo(); + echo('*******************************************************'); + echo('WARNING: Some tests did not pass!'); + echo('*******************************************************'); + exit(1); +} else { + echo(); + echo('All tests passed.'); +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/shell.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/shell.js new file mode 100644 index 0000000..bdeb559 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/shell.js @@ -0,0 +1,159 @@ +// +// ShellJS +// Unix shell commands on top of Node's API +// +// Copyright (c) 2012 Artur Adib +// http://github.com/arturadib/shelljs +// + +var common = require('./src/common'); + + +//@ +//@ All commands run synchronously, unless otherwise stated. +//@ + +//@include ./src/cd +var _cd = require('./src/cd'); +exports.cd = common.wrap('cd', _cd); + +//@include ./src/pwd +var _pwd = require('./src/pwd'); +exports.pwd = common.wrap('pwd', _pwd); + +//@include ./src/ls +var _ls = require('./src/ls'); +exports.ls = common.wrap('ls', _ls); + +//@include ./src/find +var _find = require('./src/find'); +exports.find = common.wrap('find', _find); + +//@include ./src/cp +var _cp = require('./src/cp'); +exports.cp = common.wrap('cp', _cp); + +//@include ./src/rm +var _rm = require('./src/rm'); +exports.rm = common.wrap('rm', _rm); + +//@include ./src/mv +var _mv = require('./src/mv'); +exports.mv = common.wrap('mv', _mv); + +//@include ./src/mkdir +var _mkdir = require('./src/mkdir'); +exports.mkdir = common.wrap('mkdir', _mkdir); + +//@include ./src/test +var _test = require('./src/test'); +exports.test = common.wrap('test', _test); + +//@include ./src/cat +var _cat = require('./src/cat'); +exports.cat = common.wrap('cat', _cat); + +//@include ./src/to +var _to = require('./src/to'); +String.prototype.to = common.wrap('to', _to); + +//@include ./src/toEnd +var _toEnd = require('./src/toEnd'); +String.prototype.toEnd = common.wrap('toEnd', _toEnd); + +//@include ./src/sed +var _sed = require('./src/sed'); +exports.sed = common.wrap('sed', _sed); + +//@include ./src/grep +var _grep = require('./src/grep'); +exports.grep = common.wrap('grep', _grep); + +//@include ./src/which +var _which = require('./src/which'); +exports.which = common.wrap('which', _which); + +//@include ./src/echo +var _echo = require('./src/echo'); +exports.echo = _echo; // don't common.wrap() as it could parse '-options' + +//@include ./src/dirs +var _dirs = require('./src/dirs').dirs; +exports.dirs = common.wrap("dirs", _dirs); +var _pushd = require('./src/dirs').pushd; +exports.pushd = common.wrap('pushd', _pushd); +var _popd = require('./src/dirs').popd; +exports.popd = common.wrap("popd", _popd); + +//@include ./src/ln +var _ln = require('./src/ln'); +exports.ln = common.wrap('ln', _ln); + +//@ +//@ ### exit(code) +//@ Exits the current process with the given exit code. +exports.exit = process.exit; + +//@ +//@ ### env['VAR_NAME'] +//@ Object containing environment variables (both getter and setter). Shortcut to process.env. +exports.env = process.env; + +//@include ./src/exec +var _exec = require('./src/exec'); +exports.exec = common.wrap('exec', _exec, {notUnix:true}); + +//@include ./src/chmod +var _chmod = require('./src/chmod'); +exports.chmod = common.wrap('chmod', _chmod); + + + +//@ +//@ ## Non-Unix commands +//@ + +//@include ./src/tempdir +var _tempDir = require('./src/tempdir'); +exports.tempdir = common.wrap('tempdir', _tempDir); + + +//@include ./src/error +var _error = require('./src/error'); +exports.error = _error; + + + +//@ +//@ ## Configuration +//@ + +exports.config = common.config; + +//@ +//@ ### config.silent +//@ Example: +//@ +//@ ```javascript +//@ var sh = require('shelljs'); +//@ var silentState = sh.config.silent; // save old silent state +//@ sh.config.silent = true; +//@ /* ... */ +//@ sh.config.silent = silentState; // restore old silent state +//@ ``` +//@ +//@ Suppresses all command output if `true`, except for `echo()` calls. +//@ Default is `false`. + +//@ +//@ ### config.fatal +//@ Example: +//@ +//@ ```javascript +//@ require('shelljs/global'); +//@ config.fatal = true; +//@ cp('this_file_does_not_exist', '/dev/null'); // dies here +//@ /* more commands... */ +//@ ``` +//@ +//@ If `true` the script will die on errors. Default is `false`. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cat.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cat.js new file mode 100644 index 0000000..f6f4d25 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cat.js @@ -0,0 +1,43 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### cat(file [, file ...]) +//@ ### cat(file_array) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var str = cat('file*.txt'); +//@ var str = cat('file1', 'file2'); +//@ var str = cat(['file1', 'file2']); // same as above +//@ ``` +//@ +//@ Returns a string containing the given file, or a concatenated string +//@ containing the files if more than one file is given (a new line character is +//@ introduced between each file). Wildcard `*` accepted. +function _cat(options, files) { + var cat = ''; + + if (!files) + common.error('no paths given'); + + if (typeof files === 'string') + files = [].slice.call(arguments, 1); + // if it's array leave it as it is + + files = common.expand(files); + + files.forEach(function(file) { + if (!fs.existsSync(file)) + common.error('no such file or directory: ' + file); + + cat += fs.readFileSync(file, 'utf8') + '\n'; + }); + + if (cat[cat.length-1] === '\n') + cat = cat.substring(0, cat.length-1); + + return common.ShellString(cat); +} +module.exports = _cat; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cd.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cd.js new file mode 100644 index 0000000..230f432 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/cd.js @@ -0,0 +1,19 @@ +var fs = require('fs'); +var common = require('./common'); + +//@ +//@ ### cd('dir') +//@ Changes to directory `dir` for the duration of the script +function _cd(options, dir) { + if (!dir) + common.error('directory not specified'); + + if (!fs.existsSync(dir)) + common.error('no such file or directory: ' + dir); + + if (!fs.statSync(dir).isDirectory()) + common.error('not a directory: ' + dir); + + process.chdir(dir); +} +module.exports = _cd; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/chmod.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/chmod.js new file mode 100644 index 0000000..f288893 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/chmod.js @@ -0,0 +1,208 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +var PERMS = (function (base) { + return { + OTHER_EXEC : base.EXEC, + OTHER_WRITE : base.WRITE, + OTHER_READ : base.READ, + + GROUP_EXEC : base.EXEC << 3, + GROUP_WRITE : base.WRITE << 3, + GROUP_READ : base.READ << 3, + + OWNER_EXEC : base.EXEC << 6, + OWNER_WRITE : base.WRITE << 6, + OWNER_READ : base.READ << 6, + + // Literal octal numbers are apparently not allowed in "strict" javascript. Using parseInt is + // the preferred way, else a jshint warning is thrown. + STICKY : parseInt('01000', 8), + SETGID : parseInt('02000', 8), + SETUID : parseInt('04000', 8), + + TYPE_MASK : parseInt('0770000', 8) + }; +})({ + EXEC : 1, + WRITE : 2, + READ : 4 +}); + +//@ +//@ ### chmod(octal_mode || octal_string, file) +//@ ### chmod(symbolic_mode, file) +//@ +//@ Available options: +//@ +//@ + `-v`: output a diagnostic for every file processed//@ +//@ + `-c`: like verbose but report only when a change is made//@ +//@ + `-R`: change files and directories recursively//@ +//@ +//@ Examples: +//@ +//@ ```javascript +//@ chmod(755, '/Users/brandon'); +//@ chmod('755', '/Users/brandon'); // same as above +//@ chmod('u+x', '/Users/brandon'); +//@ ``` +//@ +//@ Alters the permissions of a file or directory by either specifying the +//@ absolute permissions in octal form or expressing the changes in symbols. +//@ This command tries to mimic the POSIX behavior as much as possible. +//@ Notable exceptions: +//@ +//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is +//@ given to the umask. +//@ + There is no "quiet" option since default behavior is to run silent. +function _chmod(options, mode, filePattern) { + if (!filePattern) { + if (options.length > 0 && options.charAt(0) === '-') { + // Special case where the specified file permissions started with - to subtract perms, which + // get picked up by the option parser as command flags. + // If we are down by one argument and options starts with -, shift everything over. + filePattern = mode; + mode = options; + options = ''; + } + else { + common.error('You must specify a file.'); + } + } + + options = common.parseOptions(options, { + 'R': 'recursive', + 'c': 'changes', + 'v': 'verbose' + }); + + if (typeof filePattern === 'string') { + filePattern = [ filePattern ]; + } + + var files; + + if (options.recursive) { + files = []; + common.expand(filePattern).forEach(function addFile(expandedFile) { + var stat = fs.lstatSync(expandedFile); + + if (!stat.isSymbolicLink()) { + files.push(expandedFile); + + if (stat.isDirectory()) { // intentionally does not follow symlinks. + fs.readdirSync(expandedFile).forEach(function (child) { + addFile(expandedFile + '/' + child); + }); + } + } + }); + } + else { + files = common.expand(filePattern); + } + + files.forEach(function innerChmod(file) { + file = path.resolve(file); + if (!fs.existsSync(file)) { + common.error('File not found: ' + file); + } + + // When recursing, don't follow symlinks. + if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { + return; + } + + var perms = fs.statSync(file).mode; + var type = perms & PERMS.TYPE_MASK; + + var newPerms = perms; + + if (isNaN(parseInt(mode, 8))) { + // parse options + mode.split(',').forEach(function (symbolicMode) { + /*jshint regexdash:true */ + var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; + var matches = pattern.exec(symbolicMode); + + if (matches) { + var applyTo = matches[1]; + var operator = matches[2]; + var change = matches[3]; + + var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === ''; + var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; + var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; + + var changeRead = change.indexOf('r') != -1; + var changeWrite = change.indexOf('w') != -1; + var changeExec = change.indexOf('x') != -1; + var changeSticky = change.indexOf('t') != -1; + var changeSetuid = change.indexOf('s') != -1; + + var mask = 0; + if (changeOwner) { + mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0); + } + if (changeGroup) { + mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0); + } + if (changeOther) { + mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0); + } + + // Sticky bit is special - it's not tied to user, group or other. + if (changeSticky) { + mask |= PERMS.STICKY; + } + + switch (operator) { + case '+': + newPerms |= mask; + break; + + case '-': + newPerms &= ~mask; + break; + + case '=': + newPerms = type + mask; + + // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared. + if (fs.statSync(file).isDirectory()) { + newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; + } + break; + } + + if (options.verbose) { + log(file + ' -> ' + newPerms.toString(8)); + } + + if (perms != newPerms) { + if (!options.verbose && options.changes) { + log(file + ' -> ' + newPerms.toString(8)); + } + fs.chmodSync(file, newPerms); + } + } + else { + common.error('Invalid symbolic mode change: ' + symbolicMode); + } + }); + } + else { + // they gave us a full number + newPerms = type + parseInt(mode, 8); + + // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared. + if (fs.statSync(file).isDirectory()) { + newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; + } + + fs.chmodSync(file, newPerms); + } + }); +} +module.exports = _chmod; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/common.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/common.js new file mode 100644 index 0000000..d8c2312 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/common.js @@ -0,0 +1,203 @@ +var os = require('os'); +var fs = require('fs'); +var _ls = require('./ls'); + +// Module globals +var config = { + silent: false, + fatal: false +}; +exports.config = config; + +var state = { + error: null, + currentCmd: 'shell.js', + tempDir: null +}; +exports.state = state; + +var platform = os.type().match(/^Win/) ? 'win' : 'unix'; +exports.platform = platform; + +function log() { + if (!config.silent) + console.log.apply(this, arguments); +} +exports.log = log; + +// Shows error message. Throws unless _continue or config.fatal are true +function error(msg, _continue) { + if (state.error === null) + state.error = ''; + state.error += state.currentCmd + ': ' + msg + '\n'; + + if (msg.length > 0) + log(state.error); + + if (config.fatal) + process.exit(1); + + if (!_continue) + throw ''; +} +exports.error = error; + +// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings. +// For now, this is a dummy function to bookmark places we need such strings +function ShellString(str) { + return str; +} +exports.ShellString = ShellString; + +// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.: +// parseOptions('-a', {'a':'alice', 'b':'bob'}); +function parseOptions(str, map) { + if (!map) + error('parseOptions() internal error: no map given'); + + // All options are false by default + var options = {}; + for (var letter in map) + options[map[letter]] = false; + + if (!str) + return options; // defaults + + if (typeof str !== 'string') + error('parseOptions() internal error: wrong str'); + + // e.g. match[1] = 'Rf' for str = '-Rf' + var match = str.match(/^\-(.+)/); + if (!match) + return options; + + // e.g. chars = ['R', 'f'] + var chars = match[1].split(''); + + chars.forEach(function(c) { + if (c in map) + options[map[c]] = true; + else + error('option not recognized: '+c); + }); + + return options; +} +exports.parseOptions = parseOptions; + +// Expands wildcards with matching (ie. existing) file names. +// For example: +// expand(['file*.js']) = ['file1.js', 'file2.js', ...] +// (if the files 'file1.js', 'file2.js', etc, exist in the current dir) +function expand(list) { + var expanded = []; + list.forEach(function(listEl) { + // Wildcard present on directory names ? + if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) { + var match = listEl.match(/^([^*]+\/|)(.*)/); + var root = match[1]; + var rest = match[2]; + var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*"); + restRegex = new RegExp(restRegex); + + _ls('-R', root).filter(function (e) { + return restRegex.test(e); + }).forEach(function(file) { + expanded.push(file); + }); + } + // Wildcard present on file names ? + else if (listEl.search(/\*/) > -1) { + _ls('', listEl).forEach(function(file) { + expanded.push(file); + }); + } else { + expanded.push(listEl); + } + }); + return expanded; +} +exports.expand = expand; + +// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. +// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 +function unlinkSync(file) { + try { + fs.unlinkSync(file); + } catch(e) { + // Try to override file permission + if (e.code === 'EPERM') { + fs.chmodSync(file, '0666'); + fs.unlinkSync(file); + } else { + throw e; + } + } +} +exports.unlinkSync = unlinkSync; + +// e.g. 'shelljs_a5f185d0443ca...' +function randomFileName() { + function randomHash(count) { + if (count === 1) + return parseInt(16*Math.random(), 10).toString(16); + else { + var hash = ''; + for (var i=0; i and/or '); + } else if (arguments.length > 3) { + sources = [].slice.call(arguments, 1, arguments.length - 1); + dest = arguments[arguments.length - 1]; + } else if (typeof sources === 'string') { + sources = [sources]; + } else if ('length' in sources) { + sources = sources; // no-op for array + } else { + common.error('invalid arguments'); + } + + var exists = fs.existsSync(dest), + stats = exists && fs.statSync(dest); + + // Dest is not existing dir, but multiple sources given + if ((!exists || !stats.isDirectory()) && sources.length > 1) + common.error('dest is not a directory (too many sources)'); + + // Dest is an existing file, but no -f given + if (exists && stats.isFile() && !options.force) + common.error('dest file already exists: ' + dest); + + if (options.recursive) { + // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*" + // (see Github issue #15) + sources.forEach(function(src, i) { + if (src[src.length - 1] === '/') + sources[i] += '*'; + }); + + // Create dest + try { + fs.mkdirSync(dest, parseInt('0777', 8)); + } catch (e) { + // like Unix's cp, keep going even if we can't create dest dir + } + } + + sources = common.expand(sources); + + sources.forEach(function(src) { + if (!fs.existsSync(src)) { + common.error('no such file or directory: '+src, true); + return; // skip file + } + + // If here, src exists + if (fs.statSync(src).isDirectory()) { + if (!options.recursive) { + // Non-Recursive + common.log(src + ' is a directory (not copied)'); + } else { + // Recursive + // 'cp /a/source dest' should create 'source' in 'dest' + var newDest = path.join(dest, path.basename(src)), + checkDir = fs.statSync(src); + try { + fs.mkdirSync(newDest, checkDir.mode); + } catch (e) { + //if the directory already exists, that's okay + if (e.code !== 'EEXIST') { + common.error('dest file no such file or directory: ' + newDest, true); + throw e; + } + } + + cpdirSyncRecursive(src, newDest, {force: options.force}); + } + return; // done with dir + } + + // If here, src is a file + + // When copying to '/path/dir': + // thisDest = '/path/dir/file1' + var thisDest = dest; + if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) + thisDest = path.normalize(dest + '/' + path.basename(src)); + + if (fs.existsSync(thisDest) && !options.force) { + common.error('dest file already exists: ' + thisDest, true); + return; // skip file + } + + copyFileSync(src, thisDest); + }); // forEach(src) +} +module.exports = _cp; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/dirs.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/dirs.js new file mode 100644 index 0000000..58fae8b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/dirs.js @@ -0,0 +1,191 @@ +var common = require('./common'); +var _cd = require('./cd'); +var path = require('path'); + +// Pushd/popd/dirs internals +var _dirStack = []; + +function _isStackIndex(index) { + return (/^[\-+]\d+$/).test(index); +} + +function _parseStackIndex(index) { + if (_isStackIndex(index)) { + if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd + return (/^-/).test(index) ? Number(index) - 1 : Number(index); + } else { + common.error(index + ': directory stack index out of range'); + } + } else { + common.error(index + ': invalid number'); + } +} + +function _actualDirStack() { + return [process.cwd()].concat(_dirStack); +} + +//@ +//@ ### pushd([options,] [dir | '-N' | '+N']) +//@ +//@ Available options: +//@ +//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. +//@ +//@ Arguments: +//@ +//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. +//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. +//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ // process.cwd() === '/usr' +//@ pushd('/etc'); // Returns /etc /usr +//@ pushd('+1'); // Returns /usr /etc +//@ ``` +//@ +//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. +function _pushd(options, dir) { + if (_isStackIndex(options)) { + dir = options; + options = ''; + } + + options = common.parseOptions(options, { + 'n' : 'no-cd' + }); + + var dirs = _actualDirStack(); + + if (dir === '+0') { + return dirs; // +0 is a noop + } else if (!dir) { + if (dirs.length > 1) { + dirs = dirs.splice(1, 1).concat(dirs); + } else { + return common.error('no other directory'); + } + } else if (_isStackIndex(dir)) { + var n = _parseStackIndex(dir); + dirs = dirs.slice(n).concat(dirs.slice(0, n)); + } else { + if (options['no-cd']) { + dirs.splice(1, 0, dir); + } else { + dirs.unshift(dir); + } + } + + if (options['no-cd']) { + dirs = dirs.slice(1); + } else { + dir = path.resolve(dirs.shift()); + _cd('', dir); + } + + _dirStack = dirs; + return _dirs(''); +} +exports.pushd = _pushd; + +//@ +//@ ### popd([options,] ['-N' | '+N']) +//@ +//@ Available options: +//@ +//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. +//@ +//@ Arguments: +//@ +//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. +//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ echo(process.cwd()); // '/usr' +//@ pushd('/etc'); // '/etc /usr' +//@ echo(process.cwd()); // '/etc' +//@ popd(); // '/usr' +//@ echo(process.cwd()); // '/usr' +//@ ``` +//@ +//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. +function _popd(options, index) { + if (_isStackIndex(options)) { + index = options; + options = ''; + } + + options = common.parseOptions(options, { + 'n' : 'no-cd' + }); + + if (!_dirStack.length) { + return common.error('directory stack empty'); + } + + index = _parseStackIndex(index || '+0'); + + if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) { + index = index > 0 ? index - 1 : index; + _dirStack.splice(index, 1); + } else { + var dir = path.resolve(_dirStack.shift()); + _cd('', dir); + } + + return _dirs(''); +} +exports.popd = _popd; + +//@ +//@ ### dirs([options | '+N' | '-N']) +//@ +//@ Available options: +//@ +//@ + `-c`: Clears the directory stack by deleting all of the elements. +//@ +//@ Arguments: +//@ +//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. +//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. +//@ +//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. +//@ +//@ See also: pushd, popd +function _dirs(options, index) { + if (_isStackIndex(options)) { + index = options; + options = ''; + } + + options = common.parseOptions(options, { + 'c' : 'clear' + }); + + if (options['clear']) { + _dirStack = []; + return _dirStack; + } + + var stack = _actualDirStack(); + + if (index) { + index = _parseStackIndex(index); + + if (index < 0) { + index = stack.length + index; + } + + common.log(stack[index]); + return stack[index]; + } + + common.log(stack.join(' ')); + + return stack; +} +exports.dirs = _dirs; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/echo.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/echo.js new file mode 100644 index 0000000..760ea84 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/echo.js @@ -0,0 +1,20 @@ +var common = require('./common'); + +//@ +//@ ### echo(string [,string ...]) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ echo('hello world'); +//@ var str = echo('hello world'); +//@ ``` +//@ +//@ Prints string to stdout, and returns string with additional utility methods +//@ like `.to()`. +function _echo() { + var messages = [].slice.call(arguments, 0); + console.log.apply(this, messages); + return common.ShellString(messages.join(' ')); +} +module.exports = _echo; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/error.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/error.js new file mode 100644 index 0000000..cca3efb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/error.js @@ -0,0 +1,10 @@ +var common = require('./common'); + +//@ +//@ ### error() +//@ Tests if error occurred in the last command. Returns `null` if no error occurred, +//@ otherwise returns string explaining the error +function error() { + return common.state.error; +}; +module.exports = error; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/exec.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/exec.js new file mode 100644 index 0000000..d259a9f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/exec.js @@ -0,0 +1,216 @@ +var common = require('./common'); +var _tempDir = require('./tempdir'); +var _pwd = require('./pwd'); +var path = require('path'); +var fs = require('fs'); +var child = require('child_process'); + +// Hack to run child_process.exec() synchronously (sync avoids callback hell) +// Uses a custom wait loop that checks for a flag file, created when the child process is done. +// (Can't do a wait loop that checks for internal Node variables/messages as +// Node is single-threaded; callbacks and other internal state changes are done in the +// event loop). +function execSync(cmd, opts) { + var tempDir = _tempDir(); + var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()), + codeFile = path.resolve(tempDir+'/'+common.randomFileName()), + scriptFile = path.resolve(tempDir+'/'+common.randomFileName()), + sleepFile = path.resolve(tempDir+'/'+common.randomFileName()); + + var options = common.extend({ + silent: common.config.silent + }, opts); + + var previousStdoutContent = ''; + // Echoes stdout changes from running process, if not silent + function updateStdout() { + if (options.silent || !fs.existsSync(stdoutFile)) + return; + + var stdoutContent = fs.readFileSync(stdoutFile, 'utf8'); + // No changes since last time? + if (stdoutContent.length <= previousStdoutContent.length) + return; + + process.stdout.write(stdoutContent.substr(previousStdoutContent.length)); + previousStdoutContent = stdoutContent; + } + + function escape(str) { + return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0"); + } + + if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); + if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); + if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); + + var execCommand = '"'+process.execPath+'" '+scriptFile; + var execOptions = { + env: process.env, + cwd: _pwd(), + maxBuffer: 20*1024*1024 + }; + + if (typeof child.execSync === 'function') { + var script = [ + "var child = require('child_process')", + " , fs = require('fs');", + "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {", + " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');", + "});", + "var stdoutStream = fs.createWriteStream('"+escape(stdoutFile)+"');", + "childProcess.stdout.pipe(stdoutStream, {end: false});", + "childProcess.stderr.pipe(stdoutStream, {end: false});", + "childProcess.stdout.pipe(process.stdout);", + "childProcess.stderr.pipe(process.stderr);", + "var stdoutEnded = false, stderrEnded = false;", + "function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }", + "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });", + "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });" + ].join('\n'); + + fs.writeFileSync(scriptFile, script); + + if (options.silent) { + execOptions.stdio = 'ignore'; + } else { + execOptions.stdio = [0, 1, 2]; + } + + // Welcome to the future + child.execSync(execCommand, execOptions); + } else { + cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix + + var script = [ + "var child = require('child_process')", + " , fs = require('fs');", + "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {", + " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');", + "});" + ].join('\n'); + + fs.writeFileSync(scriptFile, script); + + child.exec(execCommand, execOptions); + + // The wait loop + // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage + // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing + // CPU usage, though apparently not so much on Windows) + while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } + while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } + } + + // At this point codeFile exists, but it's not necessarily flushed yet. + // Keep reading it until it is. + var code = parseInt('', 10); + while (isNaN(code)) { + code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); + } + + var stdout = fs.readFileSync(stdoutFile, 'utf8'); + + // No biggie if we can't erase the files now -- they're in a temp dir anyway + try { common.unlinkSync(scriptFile); } catch(e) {} + try { common.unlinkSync(stdoutFile); } catch(e) {} + try { common.unlinkSync(codeFile); } catch(e) {} + try { common.unlinkSync(sleepFile); } catch(e) {} + + // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html + if (code === 1 || code === 2 || code >= 126) { + common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes + } + // True if successful, false if not + var obj = { + code: code, + output: stdout + }; + return obj; +} // execSync() + +// Wrapper around exec() to enable echoing output to console in real time +function execAsync(cmd, opts, callback) { + var output = ''; + + var options = common.extend({ + silent: common.config.silent + }, opts); + + var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) { + if (callback) + callback(err ? err.code : 0, output); + }); + + c.stdout.on('data', function(data) { + output += data; + if (!options.silent) + process.stdout.write(data); + }); + + c.stderr.on('data', function(data) { + output += data; + if (!options.silent) + process.stdout.write(data); + }); + + return c; +} + +//@ +//@ ### exec(command [, options] [, callback]) +//@ Available options (all `false` by default): +//@ +//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided. +//@ + `silent`: Do not echo program output to console. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var version = exec('node --version', {silent:true}).output; +//@ +//@ var child = exec('some_long_running_process', {async:true}); +//@ child.stdout.on('data', function(data) { +//@ /* ... do something with data ... */ +//@ }); +//@ +//@ exec('some_long_running_process', function(code, output) { +//@ console.log('Exit code:', code); +//@ console.log('Program output:', output); +//@ }); +//@ ``` +//@ +//@ Executes the given `command` _synchronously_, unless otherwise specified. +//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's +//@ `output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and +//@ the `callback` gets the arguments `(code, output)`. +//@ +//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as +//@ the current synchronous implementation uses a lot of CPU. This should be getting +//@ fixed soon. +function _exec(command, options, callback) { + if (!command) + common.error('must specify command'); + + // Callback is defined instead of options. + if (typeof options === 'function') { + callback = options; + options = { async: true }; + } + + // Callback is defined with options. + if (typeof options === 'object' && typeof callback === 'function') { + options.async = true; + } + + options = common.extend({ + silent: common.config.silent, + async: false + }, options); + + if (options.async) + return execAsync(command, options, callback); + else + return execSync(command, options); +} +module.exports = _exec; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/find.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/find.js new file mode 100644 index 0000000..d9eeec2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/find.js @@ -0,0 +1,51 @@ +var fs = require('fs'); +var common = require('./common'); +var _ls = require('./ls'); + +//@ +//@ ### find(path [,path ...]) +//@ ### find(path_array) +//@ Examples: +//@ +//@ ```javascript +//@ find('src', 'lib'); +//@ find(['src', 'lib']); // same as above +//@ find('.').filter(function(file) { return file.match(/\.js$/); }); +//@ ``` +//@ +//@ Returns array of all files (however deep) in the given paths. +//@ +//@ The main difference from `ls('-R', path)` is that the resulting file names +//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. +function _find(options, paths) { + if (!paths) + common.error('no path specified'); + else if (typeof paths === 'object') + paths = paths; // assume array + else if (typeof paths === 'string') + paths = [].slice.call(arguments, 1); + + var list = []; + + function pushFile(file) { + if (common.platform === 'win') + file = file.replace(/\\/g, '/'); + list.push(file); + } + + // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs + // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory + + paths.forEach(function(file) { + pushFile(file); + + if (fs.statSync(file).isDirectory()) { + _ls('-RA', file+'/*').forEach(function(subfile) { + pushFile(subfile); + }); + } + }); + + return list; +} +module.exports = _find; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/grep.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/grep.js new file mode 100644 index 0000000..00c7d6a --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/grep.js @@ -0,0 +1,52 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### grep([options ,] regex_filter, file [, file ...]) +//@ ### grep([options ,] regex_filter, file_array) +//@ Available options: +//@ +//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. +//@ +//@ Examples: +//@ +//@ ```javascript +//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); +//@ grep('GLOBAL_VARIABLE', '*.js'); +//@ ``` +//@ +//@ Reads input string from given files and returns a string containing all lines of the +//@ file that match the given `regex_filter`. Wildcard `*` accepted. +function _grep(options, regex, files) { + options = common.parseOptions(options, { + 'v': 'inverse' + }); + + if (!files) + common.error('no paths given'); + + if (typeof files === 'string') + files = [].slice.call(arguments, 2); + // if it's array leave it as it is + + files = common.expand(files); + + var grep = ''; + files.forEach(function(file) { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, true); + return; + } + + var contents = fs.readFileSync(file, 'utf8'), + lines = contents.split(/\r*\n/); + lines.forEach(function(line) { + var matched = line.match(regex); + if ((options.inverse && !matched) || (!options.inverse && matched)) + grep += line + '\n'; + }); + }); + + return common.ShellString(grep); +} +module.exports = _grep; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ln.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ln.js new file mode 100644 index 0000000..a7b9701 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ln.js @@ -0,0 +1,53 @@ +var fs = require('fs'); +var path = require('path'); +var common = require('./common'); +var os = require('os'); + +//@ +//@ ### ln(options, source, dest) +//@ ### ln(source, dest) +//@ Available options: +//@ +//@ + `s`: symlink +//@ + `f`: force +//@ +//@ Examples: +//@ +//@ ```javascript +//@ ln('file', 'newlink'); +//@ ln('-sf', 'file', 'existing'); +//@ ``` +//@ +//@ Links source to dest. Use -f to force the link, should dest already exist. +function _ln(options, source, dest) { + options = common.parseOptions(options, { + 's': 'symlink', + 'f': 'force' + }); + + if (!source || !dest) { + common.error('Missing and/or '); + } + + source = path.resolve(process.cwd(), String(source)); + dest = path.resolve(process.cwd(), String(dest)); + + if (!fs.existsSync(source)) { + common.error('Source file does not exist', true); + } + + if (fs.existsSync(dest)) { + if (!options.force) { + common.error('Destination file exists', true); + } + + fs.unlinkSync(dest); + } + + if (options.symlink) { + fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null); + } else { + fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null); + } +} +module.exports = _ln; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ls.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ls.js new file mode 100644 index 0000000..3345db4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/ls.js @@ -0,0 +1,126 @@ +var path = require('path'); +var fs = require('fs'); +var common = require('./common'); +var _cd = require('./cd'); +var _pwd = require('./pwd'); + +//@ +//@ ### ls([options ,] path [,path ...]) +//@ ### ls([options ,] path_array) +//@ Available options: +//@ +//@ + `-R`: recursive +//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ ls('projs/*.js'); +//@ ls('-R', '/users/me', '/tmp'); +//@ ls('-R', ['/users/me', '/tmp']); // same as above +//@ ``` +//@ +//@ Returns array of files in the given path, or in current directory if no path provided. +function _ls(options, paths) { + options = common.parseOptions(options, { + 'R': 'recursive', + 'A': 'all', + 'a': 'all_deprecated' + }); + + if (options.all_deprecated) { + // We won't support the -a option as it's hard to image why it's useful + // (it includes '.' and '..' in addition to '.*' files) + // For backwards compatibility we'll dump a deprecated message and proceed as before + common.log('ls: Option -a is deprecated. Use -A instead'); + options.all = true; + } + + if (!paths) + paths = ['.']; + else if (typeof paths === 'object') + paths = paths; // assume array + else if (typeof paths === 'string') + paths = [].slice.call(arguments, 1); + + var list = []; + + // Conditionally pushes file to list - returns true if pushed, false otherwise + // (e.g. prevents hidden files to be included unless explicitly told so) + function pushFile(file, query) { + // hidden file? + if (path.basename(file)[0] === '.') { + // not explicitly asking for hidden files? + if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1)) + return false; + } + + if (common.platform === 'win') + file = file.replace(/\\/g, '/'); + + list.push(file); + return true; + } + + paths.forEach(function(p) { + if (fs.existsSync(p)) { + var stats = fs.statSync(p); + // Simple file? + if (stats.isFile()) { + pushFile(p, p); + return; // continue + } + + // Simple dir? + if (stats.isDirectory()) { + // Iterate over p contents + fs.readdirSync(p).forEach(function(file) { + if (!pushFile(file, p)) + return; + + // Recursive? + if (options.recursive) { + var oldDir = _pwd(); + _cd('', p); + if (fs.statSync(file).isDirectory()) + list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*')); + _cd('', oldDir); + } + }); + return; // continue + } + } + + // p does not exist - possible wildcard present + + var basename = path.basename(p); + var dirname = path.dirname(p); + // Wildcard present on an existing dir? (e.g. '/tmp/*.js') + if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) { + // Escape special regular expression chars + var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1'); + // Translates wildcard into regex + regexp = '^' + regexp.replace(/\*/g, '.*') + '$'; + // Iterate over directory contents + fs.readdirSync(dirname).forEach(function(file) { + if (file.match(new RegExp(regexp))) { + if (!pushFile(path.normalize(dirname+'/'+file), basename)) + return; + + // Recursive? + if (options.recursive) { + var pp = dirname + '/' + file; + if (fs.lstatSync(pp).isDirectory()) + list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*')); + } // recursive + } // if file matches + }); // forEach + return; + } + + common.error('no such file or directory: ' + p, true); + }); + + return list; +} +module.exports = _ls; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mkdir.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mkdir.js new file mode 100644 index 0000000..5a7088f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mkdir.js @@ -0,0 +1,68 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +// Recursively creates 'dir' +function mkdirSyncRecursive(dir) { + var baseDir = path.dirname(dir); + + // Base dir exists, no recursion necessary + if (fs.existsSync(baseDir)) { + fs.mkdirSync(dir, parseInt('0777', 8)); + return; + } + + // Base dir does not exist, go recursive + mkdirSyncRecursive(baseDir); + + // Base dir created, can create dir + fs.mkdirSync(dir, parseInt('0777', 8)); +} + +//@ +//@ ### mkdir([options ,] dir [, dir ...]) +//@ ### mkdir([options ,] dir_array) +//@ Available options: +//@ +//@ + `p`: full path (will create intermediate dirs if necessary) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); +//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above +//@ ``` +//@ +//@ Creates directories. +function _mkdir(options, dirs) { + options = common.parseOptions(options, { + 'p': 'fullpath' + }); + if (!dirs) + common.error('no paths given'); + + if (typeof dirs === 'string') + dirs = [].slice.call(arguments, 1); + // if it's array leave it as it is + + dirs.forEach(function(dir) { + if (fs.existsSync(dir)) { + if (!options.fullpath) + common.error('path already exists: ' + dir, true); + return; // skip dir + } + + // Base dir does not exist, and no -p option given + var baseDir = path.dirname(dir); + if (!fs.existsSync(baseDir) && !options.fullpath) { + common.error('no such file or directory: ' + baseDir, true); + return; // skip dir + } + + if (options.fullpath) + mkdirSyncRecursive(dir); + else + fs.mkdirSync(dir, parseInt('0777', 8)); + }); +} // mkdir +module.exports = _mkdir; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mv.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mv.js new file mode 100644 index 0000000..11f9607 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/mv.js @@ -0,0 +1,80 @@ +var fs = require('fs'); +var path = require('path'); +var common = require('./common'); + +//@ +//@ ### mv(source [, source ...], dest') +//@ ### mv(source_array, dest') +//@ Available options: +//@ +//@ + `f`: force +//@ +//@ Examples: +//@ +//@ ```javascript +//@ mv('-f', 'file', 'dir/'); +//@ mv('file1', 'file2', 'dir/'); +//@ mv(['file1', 'file2'], 'dir/'); // same as above +//@ ``` +//@ +//@ Moves files. The wildcard `*` is accepted. +function _mv(options, sources, dest) { + options = common.parseOptions(options, { + 'f': 'force' + }); + + // Get sources, dest + if (arguments.length < 3) { + common.error('missing and/or '); + } else if (arguments.length > 3) { + sources = [].slice.call(arguments, 1, arguments.length - 1); + dest = arguments[arguments.length - 1]; + } else if (typeof sources === 'string') { + sources = [sources]; + } else if ('length' in sources) { + sources = sources; // no-op for array + } else { + common.error('invalid arguments'); + } + + sources = common.expand(sources); + + var exists = fs.existsSync(dest), + stats = exists && fs.statSync(dest); + + // Dest is not existing dir, but multiple sources given + if ((!exists || !stats.isDirectory()) && sources.length > 1) + common.error('dest is not a directory (too many sources)'); + + // Dest is an existing file, but no -f given + if (exists && stats.isFile() && !options.force) + common.error('dest file already exists: ' + dest); + + sources.forEach(function(src) { + if (!fs.existsSync(src)) { + common.error('no such file or directory: '+src, true); + return; // skip file + } + + // If here, src exists + + // When copying to '/path/dir': + // thisDest = '/path/dir/file1' + var thisDest = dest; + if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) + thisDest = path.normalize(dest + '/' + path.basename(src)); + + if (fs.existsSync(thisDest) && !options.force) { + common.error('dest file already exists: ' + thisDest, true); + return; // skip file + } + + if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { + common.error('cannot move to self: '+src, true); + return; // skip file + } + + fs.renameSync(src, thisDest); + }); // forEach(src) +} // mv +module.exports = _mv; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/popd.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/popd.js new file mode 100644 index 0000000..11ea24f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/popd.js @@ -0,0 +1 @@ +// see dirs.js \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pushd.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pushd.js new file mode 100644 index 0000000..11ea24f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pushd.js @@ -0,0 +1 @@ +// see dirs.js \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pwd.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pwd.js new file mode 100644 index 0000000..41727bb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/pwd.js @@ -0,0 +1,11 @@ +var path = require('path'); +var common = require('./common'); + +//@ +//@ ### pwd() +//@ Returns the current directory. +function _pwd(options) { + var pwd = path.resolve(process.cwd()); + return common.ShellString(pwd); +} +module.exports = _pwd; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/rm.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/rm.js new file mode 100644 index 0000000..bd608cb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/rm.js @@ -0,0 +1,163 @@ +var common = require('./common'); +var fs = require('fs'); + +// Recursively removes 'dir' +// Adapted from https://github.com/ryanmcgrath/wrench-js +// +// Copyright (c) 2010 Ryan McGrath +// Copyright (c) 2012 Artur Adib +// +// Licensed under the MIT License +// http://www.opensource.org/licenses/mit-license.php +function rmdirSyncRecursive(dir, force) { + var files; + + files = fs.readdirSync(dir); + + // Loop through and delete everything in the sub-tree after checking it + for(var i = 0; i < files.length; i++) { + var file = dir + "/" + files[i], + currFile = fs.lstatSync(file); + + if(currFile.isDirectory()) { // Recursive function back to the beginning + rmdirSyncRecursive(file, force); + } + + else if(currFile.isSymbolicLink()) { // Unlink symlinks + if (force || isWriteable(file)) { + try { + common.unlinkSync(file); + } catch (e) { + common.error('could not remove file (code '+e.code+'): ' + file, true); + } + } + } + + else // Assume it's a file - perhaps a try/catch belongs here? + if (force || isWriteable(file)) { + try { + common.unlinkSync(file); + } catch (e) { + common.error('could not remove file (code '+e.code+'): ' + file, true); + } + } + } + + // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. + // Huzzah for the shopkeep. + + var result; + try { + // Retry on windows, sometimes it takes a little time before all the files in the directory are gone + var start = Date.now(); + while (true) { + try { + result = fs.rmdirSync(dir); + if (fs.existsSync(dir)) throw { code: "EAGAIN" } + break; + } catch(er) { + // In addition to error codes, also check if the directory still exists and loop again if true + if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) { + if (Date.now() - start > 1000) throw er; + } else if (er.code === "ENOENT") { + // Directory did not exist, deletion was successful + break; + } else { + throw er; + } + } + } + } catch(e) { + common.error('could not remove directory (code '+e.code+'): ' + dir, true); + } + + return result; +} // rmdirSyncRecursive + +// Hack to determine if file has write permissions for current user +// Avoids having to check user, group, etc, but it's probably slow +function isWriteable(file) { + var writePermission = true; + try { + var __fd = fs.openSync(file, 'a'); + fs.closeSync(__fd); + } catch(e) { + writePermission = false; + } + + return writePermission; +} + +//@ +//@ ### rm([options ,] file [, file ...]) +//@ ### rm([options ,] file_array) +//@ Available options: +//@ +//@ + `-f`: force +//@ + `-r, -R`: recursive +//@ +//@ Examples: +//@ +//@ ```javascript +//@ rm('-rf', '/tmp/*'); +//@ rm('some_file.txt', 'another_file.txt'); +//@ rm(['some_file.txt', 'another_file.txt']); // same as above +//@ ``` +//@ +//@ Removes files. The wildcard `*` is accepted. +function _rm(options, files) { + options = common.parseOptions(options, { + 'f': 'force', + 'r': 'recursive', + 'R': 'recursive' + }); + if (!files) + common.error('no paths given'); + + if (typeof files === 'string') + files = [].slice.call(arguments, 1); + // if it's array leave it as it is + + files = common.expand(files); + + files.forEach(function(file) { + if (!fs.existsSync(file)) { + // Path does not exist, no force flag given + if (!options.force) + common.error('no such file or directory: '+file, true); + + return; // skip file + } + + // If here, path exists + + var stats = fs.lstatSync(file); + if (stats.isFile() || stats.isSymbolicLink()) { + + // Do not check for file writing permissions + if (options.force) { + common.unlinkSync(file); + return; + } + + if (isWriteable(file)) + common.unlinkSync(file); + else + common.error('permission denied: '+file, true); + + return; + } // simple file + + // Path is an existing directory, but no -r flag given + if (stats.isDirectory() && !options.recursive) { + common.error('path is a directory', true); + return; // skip path + } + + // Recursively remove existing directory + if (stats.isDirectory() && options.recursive) { + rmdirSyncRecursive(file, options.force); + } + }); // forEach(file) +} // rm +module.exports = _rm; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/sed.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/sed.js new file mode 100644 index 0000000..65f7cb4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/sed.js @@ -0,0 +1,43 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### sed([options ,] search_regex, replacement, file) +//@ Available options: +//@ +//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ +//@ +//@ Examples: +//@ +//@ ```javascript +//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); +//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); +//@ ``` +//@ +//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input +//@ using the given search regex and replacement string or function. Returns the new string after replacement. +function _sed(options, regex, replacement, file) { + options = common.parseOptions(options, { + 'i': 'inplace' + }); + + if (typeof replacement === 'string' || typeof replacement === 'function') + replacement = replacement; // no-op + else if (typeof replacement === 'number') + replacement = replacement.toString(); // fallback + else + common.error('invalid replacement string'); + + if (!file) + common.error('no file given'); + + if (!fs.existsSync(file)) + common.error('no such file or directory: ' + file); + + var result = fs.readFileSync(file, 'utf8').replace(regex, replacement); + if (options.inplace) + fs.writeFileSync(file, result, 'utf8'); + + return common.ShellString(result); +} +module.exports = _sed; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/tempdir.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/tempdir.js new file mode 100644 index 0000000..45953c2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/tempdir.js @@ -0,0 +1,56 @@ +var common = require('./common'); +var os = require('os'); +var fs = require('fs'); + +// Returns false if 'dir' is not a writeable directory, 'dir' otherwise +function writeableDir(dir) { + if (!dir || !fs.existsSync(dir)) + return false; + + if (!fs.statSync(dir).isDirectory()) + return false; + + var testFile = dir+'/'+common.randomFileName(); + try { + fs.writeFileSync(testFile, ' '); + common.unlinkSync(testFile); + return dir; + } catch (e) { + return false; + } +} + + +//@ +//@ ### tempdir() +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var tmp = tempdir(); // "/tmp" for most *nix platforms +//@ ``` +//@ +//@ Searches and returns string containing a writeable, platform-dependent temporary directory. +//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). +function _tempDir() { + var state = common.state; + if (state.tempDir) + return state.tempDir; // from cache + + state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+ + writeableDir(process.env['TMPDIR']) || + writeableDir(process.env['TEMP']) || + writeableDir(process.env['TMP']) || + writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS + writeableDir('C:\\TEMP') || // Windows + writeableDir('C:\\TMP') || // Windows + writeableDir('\\TEMP') || // Windows + writeableDir('\\TMP') || // Windows + writeableDir('/tmp') || + writeableDir('/var/tmp') || + writeableDir('/usr/tmp') || + writeableDir('.'); // last resort + + return state.tempDir; +} +module.exports = _tempDir; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/test.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/test.js new file mode 100644 index 0000000..8a4ac7d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/test.js @@ -0,0 +1,85 @@ +var common = require('./common'); +var fs = require('fs'); + +//@ +//@ ### test(expression) +//@ Available expression primaries: +//@ +//@ + `'-b', 'path'`: true if path is a block device +//@ + `'-c', 'path'`: true if path is a character device +//@ + `'-d', 'path'`: true if path is a directory +//@ + `'-e', 'path'`: true if path exists +//@ + `'-f', 'path'`: true if path is a regular file +//@ + `'-L', 'path'`: true if path is a symboilc link +//@ + `'-p', 'path'`: true if path is a pipe (FIFO) +//@ + `'-S', 'path'`: true if path is a socket +//@ +//@ Examples: +//@ +//@ ```javascript +//@ if (test('-d', path)) { /* do something with dir */ }; +//@ if (!test('-f', path)) continue; // skip if it's a regular file +//@ ``` +//@ +//@ Evaluates expression using the available primaries and returns corresponding value. +function _test(options, path) { + if (!path) + common.error('no path given'); + + // hack - only works with unary primaries + options = common.parseOptions(options, { + 'b': 'block', + 'c': 'character', + 'd': 'directory', + 'e': 'exists', + 'f': 'file', + 'L': 'link', + 'p': 'pipe', + 'S': 'socket' + }); + + var canInterpret = false; + for (var key in options) + if (options[key] === true) { + canInterpret = true; + break; + } + + if (!canInterpret) + common.error('could not interpret expression'); + + if (options.link) { + try { + return fs.lstatSync(path).isSymbolicLink(); + } catch(e) { + return false; + } + } + + if (!fs.existsSync(path)) + return false; + + if (options.exists) + return true; + + var stats = fs.statSync(path); + + if (options.block) + return stats.isBlockDevice(); + + if (options.character) + return stats.isCharacterDevice(); + + if (options.directory) + return stats.isDirectory(); + + if (options.file) + return stats.isFile(); + + if (options.pipe) + return stats.isFIFO(); + + if (options.socket) + return stats.isSocket(); +} // test +module.exports = _test; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/to.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/to.js new file mode 100644 index 0000000..f029999 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/to.js @@ -0,0 +1,29 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +//@ +//@ ### 'string'.to(file) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ cat('input.txt').to('output.txt'); +//@ ``` +//@ +//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as +//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ +function _to(options, file) { + if (!file) + common.error('wrong arguments'); + + if (!fs.existsSync( path.dirname(file) )) + common.error('no such file or directory: ' + path.dirname(file)); + + try { + fs.writeFileSync(file, this.toString(), 'utf8'); + } catch(e) { + common.error('could not write to file (code '+e.code+'): '+file, true); + } +} +module.exports = _to; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/toEnd.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/toEnd.js new file mode 100644 index 0000000..f6d099d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/toEnd.js @@ -0,0 +1,29 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +//@ +//@ ### 'string'.toEnd(file) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ cat('input.txt').toEnd('output.txt'); +//@ ``` +//@ +//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as +//@ those returned by `cat`, `grep`, etc). +function _toEnd(options, file) { + if (!file) + common.error('wrong arguments'); + + if (!fs.existsSync( path.dirname(file) )) + common.error('no such file or directory: ' + path.dirname(file)); + + try { + fs.appendFileSync(file, this.toString(), 'utf8'); + } catch(e) { + common.error('could not append to file (code '+e.code+'): '+file, true); + } +} +module.exports = _toEnd; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/which.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/which.js new file mode 100644 index 0000000..2822ecf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/shelljs/src/which.js @@ -0,0 +1,83 @@ +var common = require('./common'); +var fs = require('fs'); +var path = require('path'); + +// Cross-platform method for splitting environment PATH variables +function splitPath(p) { + for (i=1;i<2;i++) {} + + if (!p) + return []; + + if (common.platform === 'win') + return p.split(';'); + else + return p.split(':'); +} + +function checkPath(path) { + return fs.existsSync(path) && fs.statSync(path).isDirectory() == false; +} + +//@ +//@ ### which(command) +//@ +//@ Examples: +//@ +//@ ```javascript +//@ var nodeExec = which('node'); +//@ ``` +//@ +//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. +//@ Returns string containing the absolute path to the command. +function _which(options, cmd) { + if (!cmd) + common.error('must specify command'); + + var pathEnv = process.env.path || process.env.Path || process.env.PATH, + pathArray = splitPath(pathEnv), + where = null; + + // No relative/absolute paths provided? + if (cmd.search(/\//) === -1) { + // Search for command in PATH + pathArray.forEach(function(dir) { + if (where) + return; // already found it + + var attempt = path.resolve(dir + '/' + cmd); + if (checkPath(attempt)) { + where = attempt; + return; + } + + if (common.platform === 'win') { + var baseAttempt = attempt; + attempt = baseAttempt + '.exe'; + if (checkPath(attempt)) { + where = attempt; + return; + } + attempt = baseAttempt + '.cmd'; + if (checkPath(attempt)) { + where = attempt; + return; + } + attempt = baseAttempt + '.bat'; + if (checkPath(attempt)) { + where = attempt; + return; + } + } // if 'win' + }); + } + + // Command not found anywhere? + if (!checkPath(cmd) && !where) + return null; + + where = where || path.resolve(cmd); + + return common.ShellString(where); +} +module.exports = _which; diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/LICENSE new file mode 100644 index 0000000..dd25d80 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/README.md new file mode 100644 index 0000000..69e8b56 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/README.md @@ -0,0 +1,28 @@ + __ + /\ \ __ + __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ + /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ + \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ + \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ + \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ + \ \____/ + \/___/ + +Underscore.js is a utility-belt library for JavaScript that provides +support for the usual functional suspects (each, map, reduce, filter...) +without extending any core JavaScript objects. + +For Docs, License, Tests, and pre-packed downloads, see: +http://underscorejs.org + +For support and questions, please use +[the gitter channel](https://gitter.im/jashkenas/underscore) +or [stackoverflow](http://stackoverflow.com/search?q=underscore.js) + +Underscore is an open-sourced component of DocumentCloud: +https://github.com/documentcloud + +Many thanks to our contributors: +https://github.com/jashkenas/underscore/contributors + +This project adheres to a [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/package.json new file mode 100644 index 0000000..98f85cb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/package.json @@ -0,0 +1,82 @@ +{ + "_from": "underscore@^1.8.3", + "_id": "underscore@1.9.1", + "_inBundle": true, + "_integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "_location": "/cordova-android/underscore", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "underscore@^1.8.3", + "name": "underscore", + "escapedName": "underscore", + "rawSpec": "^1.8.3", + "saveSpec": null, + "fetchSpec": "^1.8.3" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "_shasum": "06dce34a0e68a7babc29b365b8e74b8925203961", + "_spec": "underscore@^1.8.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Jeremy Ashkenas", + "email": "jeremy@documentcloud.org" + }, + "bugs": { + "url": "https://github.com/jashkenas/underscore/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "JavaScript's functional programming helper library.", + "devDependencies": { + "coveralls": "^2.11.2", + "docco": "*", + "eslint": "1.10.x", + "gzip-size-cli": "^1.0.0", + "karma": "^0.13.13", + "karma-qunit": "~2.0.1", + "nyc": "^2.1.3", + "pretty-bytes-cli": "^1.0.0", + "qunit": "^2.6.0", + "qunit-cli": "~0.2.0", + "uglify-js": "3.3.21" + }, + "files": [ + "underscore.js", + "underscore-min.js", + "underscore-min.js.map" + ], + "homepage": "http://underscorejs.org", + "keywords": [ + "util", + "functional", + "server", + "client", + "browser" + ], + "license": "MIT", + "main": "underscore.js", + "name": "underscore", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/underscore.git" + }, + "scripts": { + "build": "npm run minify -- --source-map --source-map-url \" \" -o underscore-min.js", + "coverage": "nyc npm run test-node && nyc report", + "coveralls": "nyc npm run test-node && nyc report --reporter=text-lcov | coveralls", + "doc": "docco underscore.js", + "lint": "eslint underscore.js test/*.js", + "minify": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m", + "test": "npm run lint && npm run test-node", + "test-browser": "npm i karma-phantomjs-launcher && karma start", + "test-node": "qunit-cli test/*.js", + "weight": "npm run minify | gzip-size | pretty-bytes" + }, + "version": "1.9.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js new file mode 100644 index 0000000..f2a20a5 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js @@ -0,0 +1,5 @@ +// Underscore.js 1.9.1 +// http://underscorejs.org +// (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +!function(){var n="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this||{},r=n._,e=Array.prototype,o=Object.prototype,s="undefined"!=typeof Symbol?Symbol.prototype:null,u=e.push,c=e.slice,p=o.toString,i=o.hasOwnProperty,t=Array.isArray,a=Object.keys,l=Object.create,f=function(){},h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"==typeof exports||exports.nodeType?n._=h:("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=h),exports._=h),h.VERSION="1.9.1";var v,y=function(u,i,n){if(void 0===i)return u;switch(null==n?3:n){case 1:return function(n){return u.call(i,n)};case 3:return function(n,r,t){return u.call(i,n,r,t)};case 4:return function(n,r,t,e){return u.call(i,n,r,t,e)}}return function(){return u.apply(i,arguments)}},d=function(n,r,t){return h.iteratee!==v?h.iteratee(n,r):null==n?h.identity:h.isFunction(n)?y(n,r,t):h.isObject(n)&&!h.isArray(n)?h.matcher(n):h.property(n)};h.iteratee=v=function(n,r){return d(n,r,1/0)};var g=function(u,i){return i=null==i?u.length-1:+i,function(){for(var n=Math.max(arguments.length-i,0),r=Array(n),t=0;t":">",'"':""","'":"'","`":"`"},P=h.invert(L),W=function(r){var t=function(n){return r[n]},n="(?:"+h.keys(r).join("|")+")",e=RegExp(n),u=RegExp(n,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=W(L),h.unescape=W(P),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;u/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,$=function(n){return"\\"+U[n]};h.template=function(i,n,r){!n&&r&&(n=r),n=h.defaults({},n,h.templateSettings);var t,e=RegExp([(n.escape||J).source,(n.interpolate||J).source,(n.evaluate||J).source].join("|")+"|$","g"),o=0,a="__p+='";i.replace(e,function(n,r,t,e,u){return a+=i.slice(o,u).replace(V,$),o=u+n.length,r?a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":t?a+="'+\n((__t=("+t+"))==null?'':__t)+\n'":e&&(a+="';\n"+e+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{t=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var u=function(n){return t.call(this,n,h)},c=n.variable||"obj";return u.source="function("+c+"){\n"+a+"}",u},h.chain=function(n){var r=h(n);return r._chain=!0,r};var G=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(t){return h.each(h.functions(t),function(n){var r=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return u.apply(n,arguments),G(this,r.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(r){var t=e[r];h.prototype[r]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==r&&"splice"!==r||0!==n.length||delete n[0],G(this,n)}}),h.each(["concat","join","slice"],function(n){var r=e[n];h.prototype[n]=function(){return G(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}(); \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js.map b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js.map new file mode 100644 index 0000000..3b6056b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore-min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["underscore.js"],"names":["root","self","global","this","previousUnderscore","_","ArrayProto","Array","prototype","ObjProto","Object","SymbolProto","Symbol","push","slice","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","keys","nativeCreate","create","Ctor","obj","_wrapped","exports","nodeType","module","VERSION","builtinIteratee","optimizeCb","func","context","argCount","value","call","index","collection","accumulator","apply","arguments","cb","iteratee","identity","isFunction","isObject","matcher","property","Infinity","restArguments","startIndex","length","Math","max","rest","args","baseCreate","result","shallowProperty","key","has","path","deepGet","i","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","each","forEach","map","collect","results","currentKey","createReduce","dir","memo","initial","reducer","reduce","foldl","inject","reduceRight","foldr","find","detect","predicate","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","contains","includes","include","item","fromIndex","guard","values","indexOf","invoke","contextPath","method","pluck","where","attrs","findWhere","computed","lastComputed","v","min","shuffle","sample","n","random","clone","last","rand","temp","sortBy","criteria","sort","left","right","a","b","group","behavior","partition","groupBy","indexBy","countBy","reStrSymbol","toArray","isString","match","size","pass","first","head","take","array","tail","drop","compact","Boolean","flatten","input","shallow","strict","output","idx","isArguments","j","len","without","otherArrays","difference","uniq","unique","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","object","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","floor","createIndexFinder","predicateFind","isNaN","lastIndexOf","range","start","stop","step","ceil","chunk","count","executeBound","sourceFunc","boundFunc","callingContext","bind","TypeError","bound","callArgs","concat","partial","boundArgs","placeholder","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","throttled","remaining","clearTimeout","trailing","cancel","debounce","immediate","debounced","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","constructor","proto","prop","allKeys","mapObject","pairs","invert","functions","methods","names","createAssigner","keysFunc","defaults","source","l","extend","extendOwn","assign","eq","deepEq","keyInObj","pick","omit","String","props","tap","interceptor","isMatch","aStack","bStack","type","className","valueOf","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isElement","name","nodelist","document","childNodes","Int8Array","isFinite","isSymbol","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","template","text","settings","oldSettings","render","offset","variable","Function","e","data","argument","chain","instance","_chain","chainResult","mixin","toJSON","define","amd"],"mappings":"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"} \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore.js new file mode 100644 index 0000000..8219dc5 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/underscore/underscore.js @@ -0,0 +1,1692 @@ +// Underscore.js 1.9.1 +// http://underscorejs.org +// (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + this || + {}; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for their old module API. If we're in + // the browser, add `_` as a global object. + // (`nodeType` is checked to ensure that `module` + // and `exports` are not HTML elements.) + if (typeof exports != 'undefined' && !exports.nodeType) { + if (typeof module != 'undefined' && !module.nodeType && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.9.1'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + var builtinIteratee; + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `identity`, + // an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (_.iteratee !== builtinIteratee) return _.iteratee(value, context); + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value) && !_.isArray(value)) return _.matcher(value); + return _.property(value); + }; + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only argCount argument. + _.iteratee = builtinIteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + var restArguments = function(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var shallowProperty = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + var has = function(obj, path) { + return obj != null && hasOwnProperty.call(obj, path); + } + + var deepGet = function(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = shallowProperty('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + var createReduce = function(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + }; + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (_.isFunction(path)) { + func = path; + } else if (_.isArray(path)) { + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return _.map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection. + _.shuffle = function(obj) { + return _.sample(obj, Infinity); + }; + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = _.random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (has(result, key)) result[key]++; else result[key] = 1; + }); + + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (_.isString(obj)) { + // Keep surrogate pair characters together + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null || array.length < 1) return n == null ? void 0 : []; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null || array.length < 1) return n == null ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, Boolean); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, output) { + output = output || []; + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + // Flatten current level of array or arguments object. + if (shallow) { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } else { + flatten(value, shallow, strict, output); + idx = output.length; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = restArguments(function(array, otherArrays) { + return _.difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = restArguments(function(arrays) { + return _.uniq(flatten(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = restArguments(function(array, rest) { + rest = flatten(rest, true, true); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }); + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = restArguments(_.unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of _.pairs. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions. + var createPredicateIndexFinder = function(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + }; + + // Returns the first index on an array-like that passes a predicate test. + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions. + var createIndexFinder = function(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + }; + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + _.chunk = function(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments. + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = restArguments(function(func, context, args) { + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + _.partial = restArguments(function(func, boundArgs) { + var placeholder = _.partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + _.partial.placeholder = _; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = restArguments(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = _.bind(obj[key], obj); + } + }); + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, result; + + var later = function(context, args) { + timeout = null; + if (args) result = func.apply(context, args); + }; + + var debounced = restArguments(function(args) { + if (timeout) clearTimeout(timeout); + if (immediate) { + var callNow = !timeout; + timeout = setTimeout(later, wait); + if (callNow) result = func.apply(this, args); + } else { + timeout = _.delay(later, wait, this, args); + } + + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = null; + }; + + return debounced; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + _.restArguments = restArguments; + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + var collectNonEnumProps = function(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = _.isFunction(constructor) && constructor.prototype || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + }; + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object. + // In contrast to _.map it returns an object. + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of _.object. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods`. + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test. + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Internal pick helper function to determine if `obj` has key `key`. + var keyInObj = function(value, key, obj) { + return key in obj; + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (_.isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = _.allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the blacklisted properties. + _.omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = _.map(flatten(keys, false, false), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }); + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq, deepEq; + eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + }; + + // Internal recursive comparison function for `isEqual`. + deepEq = function(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? + _.isNaN = function(obj) { + return _.isNumber(obj) && isNaN(obj); + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, path) { + if (!_.isArray(path)) { + return has(obj, path); + } + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (obj == null || !hasOwnProperty.call(obj, key)) { + return false; + } + obj = obj[key]; + } + return !!length; + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indexes. + _.property = function(path) { + if (!_.isArray(path)) { + return shallowProperty(path); + } + return function(obj) { + return deepGet(obj, path); + }; + }; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + if (obj == null) { + return function(){}; + } + return function(path) { + return !_.isArray(path) ? obj[path] : deepGet(obj, path); + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + _.result = function(obj, path, fallback) { + if (!_.isArray(path)) path = [path]; + var length = path.length; + if (!length) { + return _.isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = _.isFunction(prop) ? prop.call(obj) : prop; + } + return obj; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var chainResult = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_, args)); + }; + }); + return _; + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return chainResult(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return chainResult(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return String(this._wrapped); + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define == 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}()); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/LICENSE.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/LICENSE.md new file mode 100644 index 0000000..ed1d4f3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/LICENSE.md @@ -0,0 +1,42 @@ +The software dual licensed under the MIT and GPL licenses. MIT license: + + Copyright (c) 2008-2013 Matsuza , Bjarke Walling + + 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. + +GPL notice (please read the [full GPL license] online): + + Copyright (C) 2008-2013 Matsuza , Bjarke Walling + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +[full GPL license]: http://www.gnu.org/licenses/gpl-2.0-standalone.html diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/README.md new file mode 100644 index 0000000..6ff6420 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/README.md @@ -0,0 +1,118 @@ +This is [Unicode Normalizer] in a Common JS module. I'm not affiliated with Matsuza, the original author of Unicode Normalizer. + +[![Build Status](https://travis-ci.org/walling/unorm.png?branch=master)](https://travis-ci.org/walling/unorm) + + +Installation +------------ + +```bash +npm install unorm +``` + +Polyfill +-------- + +You can use this module as a polyfill for [String.prototype.normalize], for example: + +```javascript +console.log('æøåäüö'.normalize('NFKD')); +``` + +The module uses some [EcmaScript 5](http://kangax.github.io/es5-compat-table/) features. Other browsers should use a compability shim, e.g. [es5-shim](https://github.com/kriskowal/es5-shim). + +Functions +--------- + +This module exports four functions: `nfc`, `nfd`, `nfkc`, and `nfkd`; one for each Unicode normalization. In the browser the functions are exported in the `unorm` global. In CommonJS environments you just require the module. Functions: + + * `unorm.nfd(str)` – Canonical Decomposition + * `unorm.nfc(str)` – Canonical Decomposition, followed by Canonical Composition + * `unorm.nfkd(str)` – Compatibility Decomposition + * `unorm.nfkc(str)` – Compatibility Decomposition, followed by Canonical Composition + + +Node.JS example +--------------- + +For a longer example, see `examples` directory. + +```javascript +var unorm = require('unorm'); + +var text = + 'The \u212B symbol invented by A. J. \u00C5ngstr\u00F6m ' + + '(1814, L\u00F6gd\u00F6, \u2013 1874) denotes the length ' + + '10\u207B\u00B9\u2070 m.'; + +var combining = /[\u0300-\u036F]/g; // Use XRegExp('\\p{M}', 'g'); see example.js. + +console.log('Regular: ' + text); +console.log('NFC: ' + unorm.nfc(text)); +console.log('NFD: ' + unorm.nfd(text)); +console.log('NFKC: ' + unorm.nfkc(text)); +console.log('NFKD: * ' + unorm.nfkd(text).replace(combining, '')); +console.log(' * = Combining characters removed from decomposed form.'); +``` + + +Road map +-------- + +As of November 2013. Longer term: + +- Look at possible optimizations (speed primarely, module size secondarily) +- Adding functions to quick check normalizations: `is_nfc`, `is_nfd`, etc. + + +Contributers +------------ + + - **Oleg Grenrus** is helping to maintain this library. He cleaned up the code base, fixed JSHint errors, created a test suite and updated the normalization data to Unicode 6.3. + + +Development notes +----------------- + +- [Unicode normalization forms report](http://www.unicode.org/reports/tr15/) +- Unicode data can be found from http://www.unicode.org/Public/UCD/latest/ucd + +To generate new unicode data, run: +```sh +cd src/data/src +javac UnormNormalizerBuilder.java +java UnormNormalizerBuilder +``` +produced `unormdata.js` contains needed table + +Execute `node benchmark/benchmark.js` to run simple benchmarks, if you do any changes which may affect performance. + +License +------- + +This project includes the software package **Unicode Normalizer 1.0.0**. The +software dual licensed under the MIT and GPL licenses. Here is the MIT license: + + Copyright (c) 2008-2013 Matsuza , Bjarke Walling + + 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. + + +[Unicode Normalizer]: http://coderepos.org/share/browser/lang/javascript/UnicodeNormalizer +[String.prototype.normalize]: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.5.3.26 diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/lib/unorm.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/lib/unorm.js new file mode 100644 index 0000000..92d3699 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/lib/unorm.js @@ -0,0 +1,442 @@ +(function (root) { + "use strict"; + +/***** unorm.js *****/ + +/* + * UnicodeNormalizer 1.0.0 + * Copyright (c) 2008 Matsuza + * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. + * $Date: 2008-06-05 16:44:17 +0200 (Thu, 05 Jun 2008) $ + * $Rev: 13309 $ + */ + + var DEFAULT_FEATURE = [null, 0, {}]; + var CACHE_THRESHOLD = 10; + var SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7, LCount = 19, VCount = 21, TCount = 28; + var NCount = VCount * TCount; // 588 + var SCount = LCount * NCount; // 11172 + + var UChar = function(cp, feature){ + this.codepoint = cp; + this.feature = feature; + }; + + // Strategies + var cache = {}; + var cacheCounter = []; + for (var i = 0; i <= 0xFF; ++i){ + cacheCounter[i] = 0; + } + + function fromCache(next, cp, needFeature){ + var ret = cache[cp]; + if(!ret){ + ret = next(cp, needFeature); + if(!!ret.feature && ++cacheCounter[(cp >> 8) & 0xFF] > CACHE_THRESHOLD){ + cache[cp] = ret; + } + } + return ret; + } + + function fromData(next, cp, needFeature){ + var hash = cp & 0xFF00; + var dunit = UChar.udata[hash] || {}; + var f = dunit[cp]; + return f ? new UChar(cp, f) : new UChar(cp, DEFAULT_FEATURE); + } + function fromCpOnly(next, cp, needFeature){ + return !!needFeature ? next(cp, needFeature) : new UChar(cp, null); + } + function fromRuleBasedJamo(next, cp, needFeature){ + var j; + if(cp < LBase || (LBase + LCount <= cp && cp < SBase) || (SBase + SCount < cp)){ + return next(cp, needFeature); + } + if(LBase <= cp && cp < LBase + LCount){ + var c = {}; + var base = (cp - LBase) * VCount; + for (j = 0; j < VCount; ++j){ + c[VBase + j] = SBase + TCount * (j + base); + } + return new UChar(cp, [,,c]); + } + + var SIndex = cp - SBase; + var TIndex = SIndex % TCount; + var feature = []; + if(TIndex !== 0){ + feature[0] = [SBase + SIndex - TIndex, TBase + TIndex]; + } else { + feature[0] = [LBase + Math.floor(SIndex / NCount), VBase + Math.floor((SIndex % NCount) / TCount)]; + feature[2] = {}; + for (j = 1; j < TCount; ++j){ + feature[2][TBase + j] = cp + j; + } + } + return new UChar(cp, feature); + } + function fromCpFilter(next, cp, needFeature){ + return cp < 60 || 13311 < cp && cp < 42607 ? new UChar(cp, DEFAULT_FEATURE) : next(cp, needFeature); + } + + var strategies = [fromCpFilter, fromCache, fromCpOnly, fromRuleBasedJamo, fromData]; + + UChar.fromCharCode = strategies.reduceRight(function (next, strategy) { + return function (cp, needFeature) { + return strategy(next, cp, needFeature); + }; + }, null); + + UChar.isHighSurrogate = function(cp){ + return cp >= 0xD800 && cp <= 0xDBFF; + }; + UChar.isLowSurrogate = function(cp){ + return cp >= 0xDC00 && cp <= 0xDFFF; + }; + + UChar.prototype.prepFeature = function(){ + if(!this.feature){ + this.feature = UChar.fromCharCode(this.codepoint, true).feature; + } + }; + + UChar.prototype.toString = function(){ + if(this.codepoint < 0x10000){ + return String.fromCharCode(this.codepoint); + } else { + var x = this.codepoint - 0x10000; + return String.fromCharCode(Math.floor(x / 0x400) + 0xD800, x % 0x400 + 0xDC00); + } + }; + + UChar.prototype.getDecomp = function(){ + this.prepFeature(); + return this.feature[0] || null; + }; + + UChar.prototype.isCompatibility = function(){ + this.prepFeature(); + return !!this.feature[1] && (this.feature[1] & (1 << 8)); + }; + UChar.prototype.isExclude = function(){ + this.prepFeature(); + return !!this.feature[1] && (this.feature[1] & (1 << 9)); + }; + UChar.prototype.getCanonicalClass = function(){ + this.prepFeature(); + return !!this.feature[1] ? (this.feature[1] & 0xff) : 0; + }; + UChar.prototype.getComposite = function(following){ + this.prepFeature(); + if(!this.feature[2]){ + return null; + } + var cp = this.feature[2][following.codepoint]; + return cp ? UChar.fromCharCode(cp) : null; + }; + + var UCharIterator = function(str){ + this.str = str; + this.cursor = 0; + }; + UCharIterator.prototype.next = function(){ + if(!!this.str && this.cursor < this.str.length){ + var cp = this.str.charCodeAt(this.cursor++); + var d; + if(UChar.isHighSurrogate(cp) && this.cursor < this.str.length && UChar.isLowSurrogate((d = this.str.charCodeAt(this.cursor)))){ + cp = (cp - 0xD800) * 0x400 + (d -0xDC00) + 0x10000; + ++this.cursor; + } + return UChar.fromCharCode(cp); + } else { + this.str = null; + return null; + } + }; + + var RecursDecompIterator = function(it, cano){ + this.it = it; + this.canonical = cano; + this.resBuf = []; + }; + + RecursDecompIterator.prototype.next = function(){ + function recursiveDecomp(cano, uchar){ + var decomp = uchar.getDecomp(); + if(!!decomp && !(cano && uchar.isCompatibility())){ + var ret = []; + for(var i = 0; i < decomp.length; ++i){ + var a = recursiveDecomp(cano, UChar.fromCharCode(decomp[i])); + ret = ret.concat(a); + } + return ret; + } else { + return [uchar]; + } + } + if(this.resBuf.length === 0){ + var uchar = this.it.next(); + if(!uchar){ + return null; + } + this.resBuf = recursiveDecomp(this.canonical, uchar); + } + return this.resBuf.shift(); + }; + + var DecompIterator = function(it){ + this.it = it; + this.resBuf = []; + }; + + DecompIterator.prototype.next = function(){ + var cc; + if(this.resBuf.length === 0){ + do{ + var uchar = this.it.next(); + if(!uchar){ + break; + } + cc = uchar.getCanonicalClass(); + var inspt = this.resBuf.length; + if(cc !== 0){ + for(; inspt > 0; --inspt){ + var uchar2 = this.resBuf[inspt - 1]; + var cc2 = uchar2.getCanonicalClass(); + if(cc2 <= cc){ + break; + } + } + } + this.resBuf.splice(inspt, 0, uchar); + } while(cc !== 0); + } + return this.resBuf.shift(); + }; + + var CompIterator = function(it){ + this.it = it; + this.procBuf = []; + this.resBuf = []; + this.lastClass = null; + }; + + CompIterator.prototype.next = function(){ + while(this.resBuf.length === 0){ + var uchar = this.it.next(); + if(!uchar){ + this.resBuf = this.procBuf; + this.procBuf = []; + break; + } + if(this.procBuf.length === 0){ + this.lastClass = uchar.getCanonicalClass(); + this.procBuf.push(uchar); + } else { + var starter = this.procBuf[0]; + var composite = starter.getComposite(uchar); + var cc = uchar.getCanonicalClass(); + if(!!composite && (this.lastClass < cc || this.lastClass === 0)){ + this.procBuf[0] = composite; + } else { + if(cc === 0){ + this.resBuf = this.procBuf; + this.procBuf = []; + } + this.lastClass = cc; + this.procBuf.push(uchar); + } + } + } + return this.resBuf.shift(); + }; + + var createIterator = function(mode, str){ + switch(mode){ + case "NFD": + return new DecompIterator(new RecursDecompIterator(new UCharIterator(str), true)); + case "NFKD": + return new DecompIterator(new RecursDecompIterator(new UCharIterator(str), false)); + case "NFC": + return new CompIterator(new DecompIterator(new RecursDecompIterator(new UCharIterator(str), true))); + case "NFKC": + return new CompIterator(new DecompIterator(new RecursDecompIterator(new UCharIterator(str), false))); + } + throw mode + " is invalid"; + }; + var normalize = function(mode, str){ + var it = createIterator(mode, str); + var ret = ""; + var uchar; + while(!!(uchar = it.next())){ + ret += uchar.toString(); + } + return ret; + }; + + /* API functions */ + function nfd(str){ + return normalize("NFD", str); + } + + function nfkd(str){ + return normalize("NFKD", str); + } + + function nfc(str){ + return normalize("NFC", str); + } + + function nfkc(str){ + return normalize("NFKC", str); + } + +/* Unicode data */ +UChar.udata={ +0:{60:[,,{824:8814}],61:[,,{824:8800}],62:[,,{824:8815}],65:[,,{768:192,769:193,770:194,771:195,772:256,774:258,775:550,776:196,777:7842,778:197,780:461,783:512,785:514,803:7840,805:7680,808:260}],66:[,,{775:7682,803:7684,817:7686}],67:[,,{769:262,770:264,775:266,780:268,807:199}],68:[,,{775:7690,780:270,803:7692,807:7696,813:7698,817:7694}],69:[,,{768:200,769:201,770:202,771:7868,772:274,774:276,775:278,776:203,777:7866,780:282,783:516,785:518,803:7864,807:552,808:280,813:7704,816:7706}],70:[,,{775:7710}],71:[,,{769:500,770:284,772:7712,774:286,775:288,780:486,807:290}],72:[,,{770:292,775:7714,776:7718,780:542,803:7716,807:7720,814:7722}],73:[,,{768:204,769:205,770:206,771:296,772:298,774:300,775:304,776:207,777:7880,780:463,783:520,785:522,803:7882,808:302,816:7724}],74:[,,{770:308}],75:[,,{769:7728,780:488,803:7730,807:310,817:7732}],76:[,,{769:313,780:317,803:7734,807:315,813:7740,817:7738}],77:[,,{769:7742,775:7744,803:7746}],78:[,,{768:504,769:323,771:209,775:7748,780:327,803:7750,807:325,813:7754,817:7752}],79:[,,{768:210,769:211,770:212,771:213,772:332,774:334,775:558,776:214,777:7886,779:336,780:465,783:524,785:526,795:416,803:7884,808:490}],80:[,,{769:7764,775:7766}],82:[,,{769:340,775:7768,780:344,783:528,785:530,803:7770,807:342,817:7774}],83:[,,{769:346,770:348,775:7776,780:352,803:7778,806:536,807:350}],84:[,,{775:7786,780:356,803:7788,806:538,807:354,813:7792,817:7790}],85:[,,{768:217,769:218,770:219,771:360,772:362,774:364,776:220,777:7910,778:366,779:368,780:467,783:532,785:534,795:431,803:7908,804:7794,808:370,813:7798,816:7796}],86:[,,{771:7804,803:7806}],87:[,,{768:7808,769:7810,770:372,775:7814,776:7812,803:7816}],88:[,,{775:7818,776:7820}],89:[,,{768:7922,769:221,770:374,771:7928,772:562,775:7822,776:376,777:7926,803:7924}],90:[,,{769:377,770:7824,775:379,780:381,803:7826,817:7828}],97:[,,{768:224,769:225,770:226,771:227,772:257,774:259,775:551,776:228,777:7843,778:229,780:462,783:513,785:515,803:7841,805:7681,808:261}],98:[,,{775:7683,803:7685,817:7687}],99:[,,{769:263,770:265,775:267,780:269,807:231}],100:[,,{775:7691,780:271,803:7693,807:7697,813:7699,817:7695}],101:[,,{768:232,769:233,770:234,771:7869,772:275,774:277,775:279,776:235,777:7867,780:283,783:517,785:519,803:7865,807:553,808:281,813:7705,816:7707}],102:[,,{775:7711}],103:[,,{769:501,770:285,772:7713,774:287,775:289,780:487,807:291}],104:[,,{770:293,775:7715,776:7719,780:543,803:7717,807:7721,814:7723,817:7830}],105:[,,{768:236,769:237,770:238,771:297,772:299,774:301,776:239,777:7881,780:464,783:521,785:523,803:7883,808:303,816:7725}],106:[,,{770:309,780:496}],107:[,,{769:7729,780:489,803:7731,807:311,817:7733}],108:[,,{769:314,780:318,803:7735,807:316,813:7741,817:7739}],109:[,,{769:7743,775:7745,803:7747}],110:[,,{768:505,769:324,771:241,775:7749,780:328,803:7751,807:326,813:7755,817:7753}],111:[,,{768:242,769:243,770:244,771:245,772:333,774:335,775:559,776:246,777:7887,779:337,780:466,783:525,785:527,795:417,803:7885,808:491}],112:[,,{769:7765,775:7767}],114:[,,{769:341,775:7769,780:345,783:529,785:531,803:7771,807:343,817:7775}],115:[,,{769:347,770:349,775:7777,780:353,803:7779,806:537,807:351}],116:[,,{775:7787,776:7831,780:357,803:7789,806:539,807:355,813:7793,817:7791}],117:[,,{768:249,769:250,770:251,771:361,772:363,774:365,776:252,777:7911,778:367,779:369,780:468,783:533,785:535,795:432,803:7909,804:7795,808:371,813:7799,816:7797}],118:[,,{771:7805,803:7807}],119:[,,{768:7809,769:7811,770:373,775:7815,776:7813,778:7832,803:7817}],120:[,,{775:7819,776:7821}],121:[,,{768:7923,769:253,770:375,771:7929,772:563,775:7823,776:255,777:7927,778:7833,803:7925}],122:[,,{769:378,770:7825,775:380,780:382,803:7827,817:7829}],160:[[32],256],168:[[32,776],256,{768:8173,769:901,834:8129}],170:[[97],256],175:[[32,772],256],178:[[50],256],179:[[51],256],180:[[32,769],256],181:[[956],256],184:[[32,807],256],185:[[49],256],186:[[111],256],188:[[49,8260,52],256],189:[[49,8260,50],256],190:[[51,8260,52],256],192:[[65,768]],193:[[65,769]],194:[[65,770],,{768:7846,769:7844,771:7850,777:7848}],195:[[65,771]],196:[[65,776],,{772:478}],197:[[65,778],,{769:506}],198:[,,{769:508,772:482}],199:[[67,807],,{769:7688}],200:[[69,768]],201:[[69,769]],202:[[69,770],,{768:7872,769:7870,771:7876,777:7874}],203:[[69,776]],204:[[73,768]],205:[[73,769]],206:[[73,770]],207:[[73,776],,{769:7726}],209:[[78,771]],210:[[79,768]],211:[[79,769]],212:[[79,770],,{768:7890,769:7888,771:7894,777:7892}],213:[[79,771],,{769:7756,772:556,776:7758}],214:[[79,776],,{772:554}],216:[,,{769:510}],217:[[85,768]],218:[[85,769]],219:[[85,770]],220:[[85,776],,{768:475,769:471,772:469,780:473}],221:[[89,769]],224:[[97,768]],225:[[97,769]],226:[[97,770],,{768:7847,769:7845,771:7851,777:7849}],227:[[97,771]],228:[[97,776],,{772:479}],229:[[97,778],,{769:507}],230:[,,{769:509,772:483}],231:[[99,807],,{769:7689}],232:[[101,768]],233:[[101,769]],234:[[101,770],,{768:7873,769:7871,771:7877,777:7875}],235:[[101,776]],236:[[105,768]],237:[[105,769]],238:[[105,770]],239:[[105,776],,{769:7727}],241:[[110,771]],242:[[111,768]],243:[[111,769]],244:[[111,770],,{768:7891,769:7889,771:7895,777:7893}],245:[[111,771],,{769:7757,772:557,776:7759}],246:[[111,776],,{772:555}],248:[,,{769:511}],249:[[117,768]],250:[[117,769]],251:[[117,770]],252:[[117,776],,{768:476,769:472,772:470,780:474}],253:[[121,769]],255:[[121,776]]}, +256:{256:[[65,772]],257:[[97,772]],258:[[65,774],,{768:7856,769:7854,771:7860,777:7858}],259:[[97,774],,{768:7857,769:7855,771:7861,777:7859}],260:[[65,808]],261:[[97,808]],262:[[67,769]],263:[[99,769]],264:[[67,770]],265:[[99,770]],266:[[67,775]],267:[[99,775]],268:[[67,780]],269:[[99,780]],270:[[68,780]],271:[[100,780]],274:[[69,772],,{768:7700,769:7702}],275:[[101,772],,{768:7701,769:7703}],276:[[69,774]],277:[[101,774]],278:[[69,775]],279:[[101,775]],280:[[69,808]],281:[[101,808]],282:[[69,780]],283:[[101,780]],284:[[71,770]],285:[[103,770]],286:[[71,774]],287:[[103,774]],288:[[71,775]],289:[[103,775]],290:[[71,807]],291:[[103,807]],292:[[72,770]],293:[[104,770]],296:[[73,771]],297:[[105,771]],298:[[73,772]],299:[[105,772]],300:[[73,774]],301:[[105,774]],302:[[73,808]],303:[[105,808]],304:[[73,775]],306:[[73,74],256],307:[[105,106],256],308:[[74,770]],309:[[106,770]],310:[[75,807]],311:[[107,807]],313:[[76,769]],314:[[108,769]],315:[[76,807]],316:[[108,807]],317:[[76,780]],318:[[108,780]],319:[[76,183],256],320:[[108,183],256],323:[[78,769]],324:[[110,769]],325:[[78,807]],326:[[110,807]],327:[[78,780]],328:[[110,780]],329:[[700,110],256],332:[[79,772],,{768:7760,769:7762}],333:[[111,772],,{768:7761,769:7763}],334:[[79,774]],335:[[111,774]],336:[[79,779]],337:[[111,779]],340:[[82,769]],341:[[114,769]],342:[[82,807]],343:[[114,807]],344:[[82,780]],345:[[114,780]],346:[[83,769],,{775:7780}],347:[[115,769],,{775:7781}],348:[[83,770]],349:[[115,770]],350:[[83,807]],351:[[115,807]],352:[[83,780],,{775:7782}],353:[[115,780],,{775:7783}],354:[[84,807]],355:[[116,807]],356:[[84,780]],357:[[116,780]],360:[[85,771],,{769:7800}],361:[[117,771],,{769:7801}],362:[[85,772],,{776:7802}],363:[[117,772],,{776:7803}],364:[[85,774]],365:[[117,774]],366:[[85,778]],367:[[117,778]],368:[[85,779]],369:[[117,779]],370:[[85,808]],371:[[117,808]],372:[[87,770]],373:[[119,770]],374:[[89,770]],375:[[121,770]],376:[[89,776]],377:[[90,769]],378:[[122,769]],379:[[90,775]],380:[[122,775]],381:[[90,780]],382:[[122,780]],383:[[115],256,{775:7835}],416:[[79,795],,{768:7900,769:7898,771:7904,777:7902,803:7906}],417:[[111,795],,{768:7901,769:7899,771:7905,777:7903,803:7907}],431:[[85,795],,{768:7914,769:7912,771:7918,777:7916,803:7920}],432:[[117,795],,{768:7915,769:7913,771:7919,777:7917,803:7921}],439:[,,{780:494}],452:[[68,381],256],453:[[68,382],256],454:[[100,382],256],455:[[76,74],256],456:[[76,106],256],457:[[108,106],256],458:[[78,74],256],459:[[78,106],256],460:[[110,106],256],461:[[65,780]],462:[[97,780]],463:[[73,780]],464:[[105,780]],465:[[79,780]],466:[[111,780]],467:[[85,780]],468:[[117,780]],469:[[220,772]],470:[[252,772]],471:[[220,769]],472:[[252,769]],473:[[220,780]],474:[[252,780]],475:[[220,768]],476:[[252,768]],478:[[196,772]],479:[[228,772]],480:[[550,772]],481:[[551,772]],482:[[198,772]],483:[[230,772]],486:[[71,780]],487:[[103,780]],488:[[75,780]],489:[[107,780]],490:[[79,808],,{772:492}],491:[[111,808],,{772:493}],492:[[490,772]],493:[[491,772]],494:[[439,780]],495:[[658,780]],496:[[106,780]],497:[[68,90],256],498:[[68,122],256],499:[[100,122],256],500:[[71,769]],501:[[103,769]],504:[[78,768]],505:[[110,768]],506:[[197,769]],507:[[229,769]],508:[[198,769]],509:[[230,769]],510:[[216,769]],511:[[248,769]],66045:[,220]}, +512:{512:[[65,783]],513:[[97,783]],514:[[65,785]],515:[[97,785]],516:[[69,783]],517:[[101,783]],518:[[69,785]],519:[[101,785]],520:[[73,783]],521:[[105,783]],522:[[73,785]],523:[[105,785]],524:[[79,783]],525:[[111,783]],526:[[79,785]],527:[[111,785]],528:[[82,783]],529:[[114,783]],530:[[82,785]],531:[[114,785]],532:[[85,783]],533:[[117,783]],534:[[85,785]],535:[[117,785]],536:[[83,806]],537:[[115,806]],538:[[84,806]],539:[[116,806]],542:[[72,780]],543:[[104,780]],550:[[65,775],,{772:480}],551:[[97,775],,{772:481}],552:[[69,807],,{774:7708}],553:[[101,807],,{774:7709}],554:[[214,772]],555:[[246,772]],556:[[213,772]],557:[[245,772]],558:[[79,775],,{772:560}],559:[[111,775],,{772:561}],560:[[558,772]],561:[[559,772]],562:[[89,772]],563:[[121,772]],658:[,,{780:495}],688:[[104],256],689:[[614],256],690:[[106],256],691:[[114],256],692:[[633],256],693:[[635],256],694:[[641],256],695:[[119],256],696:[[121],256],728:[[32,774],256],729:[[32,775],256],730:[[32,778],256],731:[[32,808],256],732:[[32,771],256],733:[[32,779],256],736:[[611],256],737:[[108],256],738:[[115],256],739:[[120],256],740:[[661],256],66272:[,220]}, +768:{768:[,230],769:[,230],770:[,230],771:[,230],772:[,230],773:[,230],774:[,230],775:[,230],776:[,230,{769:836}],777:[,230],778:[,230],779:[,230],780:[,230],781:[,230],782:[,230],783:[,230],784:[,230],785:[,230],786:[,230],787:[,230],788:[,230],789:[,232],790:[,220],791:[,220],792:[,220],793:[,220],794:[,232],795:[,216],796:[,220],797:[,220],798:[,220],799:[,220],800:[,220],801:[,202],802:[,202],803:[,220],804:[,220],805:[,220],806:[,220],807:[,202],808:[,202],809:[,220],810:[,220],811:[,220],812:[,220],813:[,220],814:[,220],815:[,220],816:[,220],817:[,220],818:[,220],819:[,220],820:[,1],821:[,1],822:[,1],823:[,1],824:[,1],825:[,220],826:[,220],827:[,220],828:[,220],829:[,230],830:[,230],831:[,230],832:[[768],230],833:[[769],230],834:[,230],835:[[787],230],836:[[776,769],230],837:[,240],838:[,230],839:[,220],840:[,220],841:[,220],842:[,230],843:[,230],844:[,230],845:[,220],846:[,220],848:[,230],849:[,230],850:[,230],851:[,220],852:[,220],853:[,220],854:[,220],855:[,230],856:[,232],857:[,220],858:[,220],859:[,230],860:[,233],861:[,234],862:[,234],863:[,233],864:[,234],865:[,234],866:[,233],867:[,230],868:[,230],869:[,230],870:[,230],871:[,230],872:[,230],873:[,230],874:[,230],875:[,230],876:[,230],877:[,230],878:[,230],879:[,230],884:[[697]],890:[[32,837],256],894:[[59]],900:[[32,769],256],901:[[168,769]],902:[[913,769]],903:[[183]],904:[[917,769]],905:[[919,769]],906:[[921,769]],908:[[927,769]],910:[[933,769]],911:[[937,769]],912:[[970,769]],913:[,,{768:8122,769:902,772:8121,774:8120,787:7944,788:7945,837:8124}],917:[,,{768:8136,769:904,787:7960,788:7961}],919:[,,{768:8138,769:905,787:7976,788:7977,837:8140}],921:[,,{768:8154,769:906,772:8153,774:8152,776:938,787:7992,788:7993}],927:[,,{768:8184,769:908,787:8008,788:8009}],929:[,,{788:8172}],933:[,,{768:8170,769:910,772:8169,774:8168,776:939,788:8025}],937:[,,{768:8186,769:911,787:8040,788:8041,837:8188}],938:[[921,776]],939:[[933,776]],940:[[945,769],,{837:8116}],941:[[949,769]],942:[[951,769],,{837:8132}],943:[[953,769]],944:[[971,769]],945:[,,{768:8048,769:940,772:8113,774:8112,787:7936,788:7937,834:8118,837:8115}],949:[,,{768:8050,769:941,787:7952,788:7953}],951:[,,{768:8052,769:942,787:7968,788:7969,834:8134,837:8131}],953:[,,{768:8054,769:943,772:8145,774:8144,776:970,787:7984,788:7985,834:8150}],959:[,,{768:8056,769:972,787:8000,788:8001}],961:[,,{787:8164,788:8165}],965:[,,{768:8058,769:973,772:8161,774:8160,776:971,787:8016,788:8017,834:8166}],969:[,,{768:8060,769:974,787:8032,788:8033,834:8182,837:8179}],970:[[953,776],,{768:8146,769:912,834:8151}],971:[[965,776],,{768:8162,769:944,834:8167}],972:[[959,769]],973:[[965,769]],974:[[969,769],,{837:8180}],976:[[946],256],977:[[952],256],978:[[933],256,{769:979,776:980}],979:[[978,769]],980:[[978,776]],981:[[966],256],982:[[960],256],1008:[[954],256],1009:[[961],256],1010:[[962],256],1012:[[920],256],1013:[[949],256],1017:[[931],256],66422:[,230],66423:[,230],66424:[,230],66425:[,230],66426:[,230]}, +1024:{1024:[[1045,768]],1025:[[1045,776]],1027:[[1043,769]],1030:[,,{776:1031}],1031:[[1030,776]],1036:[[1050,769]],1037:[[1048,768]],1038:[[1059,774]],1040:[,,{774:1232,776:1234}],1043:[,,{769:1027}],1045:[,,{768:1024,774:1238,776:1025}],1046:[,,{774:1217,776:1244}],1047:[,,{776:1246}],1048:[,,{768:1037,772:1250,774:1049,776:1252}],1049:[[1048,774]],1050:[,,{769:1036}],1054:[,,{776:1254}],1059:[,,{772:1262,774:1038,776:1264,779:1266}],1063:[,,{776:1268}],1067:[,,{776:1272}],1069:[,,{776:1260}],1072:[,,{774:1233,776:1235}],1075:[,,{769:1107}],1077:[,,{768:1104,774:1239,776:1105}],1078:[,,{774:1218,776:1245}],1079:[,,{776:1247}],1080:[,,{768:1117,772:1251,774:1081,776:1253}],1081:[[1080,774]],1082:[,,{769:1116}],1086:[,,{776:1255}],1091:[,,{772:1263,774:1118,776:1265,779:1267}],1095:[,,{776:1269}],1099:[,,{776:1273}],1101:[,,{776:1261}],1104:[[1077,768]],1105:[[1077,776]],1107:[[1075,769]],1110:[,,{776:1111}],1111:[[1110,776]],1116:[[1082,769]],1117:[[1080,768]],1118:[[1091,774]],1140:[,,{783:1142}],1141:[,,{783:1143}],1142:[[1140,783]],1143:[[1141,783]],1155:[,230],1156:[,230],1157:[,230],1158:[,230],1159:[,230],1217:[[1046,774]],1218:[[1078,774]],1232:[[1040,774]],1233:[[1072,774]],1234:[[1040,776]],1235:[[1072,776]],1238:[[1045,774]],1239:[[1077,774]],1240:[,,{776:1242}],1241:[,,{776:1243}],1242:[[1240,776]],1243:[[1241,776]],1244:[[1046,776]],1245:[[1078,776]],1246:[[1047,776]],1247:[[1079,776]],1250:[[1048,772]],1251:[[1080,772]],1252:[[1048,776]],1253:[[1080,776]],1254:[[1054,776]],1255:[[1086,776]],1256:[,,{776:1258}],1257:[,,{776:1259}],1258:[[1256,776]],1259:[[1257,776]],1260:[[1069,776]],1261:[[1101,776]],1262:[[1059,772]],1263:[[1091,772]],1264:[[1059,776]],1265:[[1091,776]],1266:[[1059,779]],1267:[[1091,779]],1268:[[1063,776]],1269:[[1095,776]],1272:[[1067,776]],1273:[[1099,776]]}, +1280:{1415:[[1381,1410],256],1425:[,220],1426:[,230],1427:[,230],1428:[,230],1429:[,230],1430:[,220],1431:[,230],1432:[,230],1433:[,230],1434:[,222],1435:[,220],1436:[,230],1437:[,230],1438:[,230],1439:[,230],1440:[,230],1441:[,230],1442:[,220],1443:[,220],1444:[,220],1445:[,220],1446:[,220],1447:[,220],1448:[,230],1449:[,230],1450:[,220],1451:[,230],1452:[,230],1453:[,222],1454:[,228],1455:[,230],1456:[,10],1457:[,11],1458:[,12],1459:[,13],1460:[,14],1461:[,15],1462:[,16],1463:[,17],1464:[,18],1465:[,19],1466:[,19],1467:[,20],1468:[,21],1469:[,22],1471:[,23],1473:[,24],1474:[,25],1476:[,230],1477:[,220],1479:[,18]}, +1536:{1552:[,230],1553:[,230],1554:[,230],1555:[,230],1556:[,230],1557:[,230],1558:[,230],1559:[,230],1560:[,30],1561:[,31],1562:[,32],1570:[[1575,1619]],1571:[[1575,1620]],1572:[[1608,1620]],1573:[[1575,1621]],1574:[[1610,1620]],1575:[,,{1619:1570,1620:1571,1621:1573}],1608:[,,{1620:1572}],1610:[,,{1620:1574}],1611:[,27],1612:[,28],1613:[,29],1614:[,30],1615:[,31],1616:[,32],1617:[,33],1618:[,34],1619:[,230],1620:[,230],1621:[,220],1622:[,220],1623:[,230],1624:[,230],1625:[,230],1626:[,230],1627:[,230],1628:[,220],1629:[,230],1630:[,230],1631:[,220],1648:[,35],1653:[[1575,1652],256],1654:[[1608,1652],256],1655:[[1735,1652],256],1656:[[1610,1652],256],1728:[[1749,1620]],1729:[,,{1620:1730}],1730:[[1729,1620]],1746:[,,{1620:1747}],1747:[[1746,1620]],1749:[,,{1620:1728}],1750:[,230],1751:[,230],1752:[,230],1753:[,230],1754:[,230],1755:[,230],1756:[,230],1759:[,230],1760:[,230],1761:[,230],1762:[,230],1763:[,220],1764:[,230],1767:[,230],1768:[,230],1770:[,220],1771:[,230],1772:[,230],1773:[,220]}, +1792:{1809:[,36],1840:[,230],1841:[,220],1842:[,230],1843:[,230],1844:[,220],1845:[,230],1846:[,230],1847:[,220],1848:[,220],1849:[,220],1850:[,230],1851:[,220],1852:[,220],1853:[,230],1854:[,220],1855:[,230],1856:[,230],1857:[,230],1858:[,220],1859:[,230],1860:[,220],1861:[,230],1862:[,220],1863:[,230],1864:[,220],1865:[,230],1866:[,230],2027:[,230],2028:[,230],2029:[,230],2030:[,230],2031:[,230],2032:[,230],2033:[,230],2034:[,220],2035:[,230]}, +2048:{2070:[,230],2071:[,230],2072:[,230],2073:[,230],2075:[,230],2076:[,230],2077:[,230],2078:[,230],2079:[,230],2080:[,230],2081:[,230],2082:[,230],2083:[,230],2085:[,230],2086:[,230],2087:[,230],2089:[,230],2090:[,230],2091:[,230],2092:[,230],2093:[,230],2137:[,220],2138:[,220],2139:[,220],2276:[,230],2277:[,230],2278:[,220],2279:[,230],2280:[,230],2281:[,220],2282:[,230],2283:[,230],2284:[,230],2285:[,220],2286:[,220],2287:[,220],2288:[,27],2289:[,28],2290:[,29],2291:[,230],2292:[,230],2293:[,230],2294:[,220],2295:[,230],2296:[,230],2297:[,220],2298:[,220],2299:[,230],2300:[,230],2301:[,230],2302:[,230],2303:[,230]}, +2304:{2344:[,,{2364:2345}],2345:[[2344,2364]],2352:[,,{2364:2353}],2353:[[2352,2364]],2355:[,,{2364:2356}],2356:[[2355,2364]],2364:[,7],2381:[,9],2385:[,230],2386:[,220],2387:[,230],2388:[,230],2392:[[2325,2364],512],2393:[[2326,2364],512],2394:[[2327,2364],512],2395:[[2332,2364],512],2396:[[2337,2364],512],2397:[[2338,2364],512],2398:[[2347,2364],512],2399:[[2351,2364],512],2492:[,7],2503:[,,{2494:2507,2519:2508}],2507:[[2503,2494]],2508:[[2503,2519]],2509:[,9],2524:[[2465,2492],512],2525:[[2466,2492],512],2527:[[2479,2492],512]}, +2560:{2611:[[2610,2620],512],2614:[[2616,2620],512],2620:[,7],2637:[,9],2649:[[2582,2620],512],2650:[[2583,2620],512],2651:[[2588,2620],512],2654:[[2603,2620],512],2748:[,7],2765:[,9],68109:[,220],68111:[,230],68152:[,230],68153:[,1],68154:[,220],68159:[,9],68325:[,230],68326:[,220]}, +2816:{2876:[,7],2887:[,,{2878:2891,2902:2888,2903:2892}],2888:[[2887,2902]],2891:[[2887,2878]],2892:[[2887,2903]],2893:[,9],2908:[[2849,2876],512],2909:[[2850,2876],512],2962:[,,{3031:2964}],2964:[[2962,3031]],3014:[,,{3006:3018,3031:3020}],3015:[,,{3006:3019}],3018:[[3014,3006]],3019:[[3015,3006]],3020:[[3014,3031]],3021:[,9]}, +3072:{3142:[,,{3158:3144}],3144:[[3142,3158]],3149:[,9],3157:[,84],3158:[,91],3260:[,7],3263:[,,{3285:3264}],3264:[[3263,3285]],3270:[,,{3266:3274,3285:3271,3286:3272}],3271:[[3270,3285]],3272:[[3270,3286]],3274:[[3270,3266],,{3285:3275}],3275:[[3274,3285]],3277:[,9]}, +3328:{3398:[,,{3390:3402,3415:3404}],3399:[,,{3390:3403}],3402:[[3398,3390]],3403:[[3399,3390]],3404:[[3398,3415]],3405:[,9],3530:[,9],3545:[,,{3530:3546,3535:3548,3551:3550}],3546:[[3545,3530]],3548:[[3545,3535],,{3530:3549}],3549:[[3548,3530]],3550:[[3545,3551]]}, +3584:{3635:[[3661,3634],256],3640:[,103],3641:[,103],3642:[,9],3656:[,107],3657:[,107],3658:[,107],3659:[,107],3763:[[3789,3762],256],3768:[,118],3769:[,118],3784:[,122],3785:[,122],3786:[,122],3787:[,122],3804:[[3755,3737],256],3805:[[3755,3745],256]}, +3840:{3852:[[3851],256],3864:[,220],3865:[,220],3893:[,220],3895:[,220],3897:[,216],3907:[[3906,4023],512],3917:[[3916,4023],512],3922:[[3921,4023],512],3927:[[3926,4023],512],3932:[[3931,4023],512],3945:[[3904,4021],512],3953:[,129],3954:[,130],3955:[[3953,3954],512],3956:[,132],3957:[[3953,3956],512],3958:[[4018,3968],512],3959:[[4018,3969],256],3960:[[4019,3968],512],3961:[[4019,3969],256],3962:[,130],3963:[,130],3964:[,130],3965:[,130],3968:[,130],3969:[[3953,3968],512],3970:[,230],3971:[,230],3972:[,9],3974:[,230],3975:[,230],3987:[[3986,4023],512],3997:[[3996,4023],512],4002:[[4001,4023],512],4007:[[4006,4023],512],4012:[[4011,4023],512],4025:[[3984,4021],512],4038:[,220]}, +4096:{4133:[,,{4142:4134}],4134:[[4133,4142]],4151:[,7],4153:[,9],4154:[,9],4237:[,220],4348:[[4316],256],69702:[,9],69759:[,9],69785:[,,{69818:69786}],69786:[[69785,69818]],69787:[,,{69818:69788}],69788:[[69787,69818]],69797:[,,{69818:69803}],69803:[[69797,69818]],69817:[,9],69818:[,7]}, +4352:{69888:[,230],69889:[,230],69890:[,230],69934:[[69937,69927]],69935:[[69938,69927]],69937:[,,{69927:69934}],69938:[,,{69927:69935}],69939:[,9],69940:[,9],70003:[,7],70080:[,9]}, +4608:{70197:[,9],70198:[,7],70377:[,7],70378:[,9]}, +4864:{4957:[,230],4958:[,230],4959:[,230],70460:[,7],70471:[,,{70462:70475,70487:70476}],70475:[[70471,70462]],70476:[[70471,70487]],70477:[,9],70502:[,230],70503:[,230],70504:[,230],70505:[,230],70506:[,230],70507:[,230],70508:[,230],70512:[,230],70513:[,230],70514:[,230],70515:[,230],70516:[,230]}, +5120:{70841:[,,{70832:70844,70842:70843,70845:70846}],70843:[[70841,70842]],70844:[[70841,70832]],70846:[[70841,70845]],70850:[,9],70851:[,7]}, +5376:{71096:[,,{71087:71098}],71097:[,,{71087:71099}],71098:[[71096,71087]],71099:[[71097,71087]],71103:[,9],71104:[,7]}, +5632:{71231:[,9],71350:[,9],71351:[,7]}, +5888:{5908:[,9],5940:[,9],6098:[,9],6109:[,230]}, +6144:{6313:[,228]}, +6400:{6457:[,222],6458:[,230],6459:[,220]}, +6656:{6679:[,230],6680:[,220],6752:[,9],6773:[,230],6774:[,230],6775:[,230],6776:[,230],6777:[,230],6778:[,230],6779:[,230],6780:[,230],6783:[,220],6832:[,230],6833:[,230],6834:[,230],6835:[,230],6836:[,230],6837:[,220],6838:[,220],6839:[,220],6840:[,220],6841:[,220],6842:[,220],6843:[,230],6844:[,230],6845:[,220]}, +6912:{6917:[,,{6965:6918}],6918:[[6917,6965]],6919:[,,{6965:6920}],6920:[[6919,6965]],6921:[,,{6965:6922}],6922:[[6921,6965]],6923:[,,{6965:6924}],6924:[[6923,6965]],6925:[,,{6965:6926}],6926:[[6925,6965]],6929:[,,{6965:6930}],6930:[[6929,6965]],6964:[,7],6970:[,,{6965:6971}],6971:[[6970,6965]],6972:[,,{6965:6973}],6973:[[6972,6965]],6974:[,,{6965:6976}],6975:[,,{6965:6977}],6976:[[6974,6965]],6977:[[6975,6965]],6978:[,,{6965:6979}],6979:[[6978,6965]],6980:[,9],7019:[,230],7020:[,220],7021:[,230],7022:[,230],7023:[,230],7024:[,230],7025:[,230],7026:[,230],7027:[,230],7082:[,9],7083:[,9],7142:[,7],7154:[,9],7155:[,9]}, +7168:{7223:[,7],7376:[,230],7377:[,230],7378:[,230],7380:[,1],7381:[,220],7382:[,220],7383:[,220],7384:[,220],7385:[,220],7386:[,230],7387:[,230],7388:[,220],7389:[,220],7390:[,220],7391:[,220],7392:[,230],7394:[,1],7395:[,1],7396:[,1],7397:[,1],7398:[,1],7399:[,1],7400:[,1],7405:[,220],7412:[,230],7416:[,230],7417:[,230]}, +7424:{7468:[[65],256],7469:[[198],256],7470:[[66],256],7472:[[68],256],7473:[[69],256],7474:[[398],256],7475:[[71],256],7476:[[72],256],7477:[[73],256],7478:[[74],256],7479:[[75],256],7480:[[76],256],7481:[[77],256],7482:[[78],256],7484:[[79],256],7485:[[546],256],7486:[[80],256],7487:[[82],256],7488:[[84],256],7489:[[85],256],7490:[[87],256],7491:[[97],256],7492:[[592],256],7493:[[593],256],7494:[[7426],256],7495:[[98],256],7496:[[100],256],7497:[[101],256],7498:[[601],256],7499:[[603],256],7500:[[604],256],7501:[[103],256],7503:[[107],256],7504:[[109],256],7505:[[331],256],7506:[[111],256],7507:[[596],256],7508:[[7446],256],7509:[[7447],256],7510:[[112],256],7511:[[116],256],7512:[[117],256],7513:[[7453],256],7514:[[623],256],7515:[[118],256],7516:[[7461],256],7517:[[946],256],7518:[[947],256],7519:[[948],256],7520:[[966],256],7521:[[967],256],7522:[[105],256],7523:[[114],256],7524:[[117],256],7525:[[118],256],7526:[[946],256],7527:[[947],256],7528:[[961],256],7529:[[966],256],7530:[[967],256],7544:[[1085],256],7579:[[594],256],7580:[[99],256],7581:[[597],256],7582:[[240],256],7583:[[604],256],7584:[[102],256],7585:[[607],256],7586:[[609],256],7587:[[613],256],7588:[[616],256],7589:[[617],256],7590:[[618],256],7591:[[7547],256],7592:[[669],256],7593:[[621],256],7594:[[7557],256],7595:[[671],256],7596:[[625],256],7597:[[624],256],7598:[[626],256],7599:[[627],256],7600:[[628],256],7601:[[629],256],7602:[[632],256],7603:[[642],256],7604:[[643],256],7605:[[427],256],7606:[[649],256],7607:[[650],256],7608:[[7452],256],7609:[[651],256],7610:[[652],256],7611:[[122],256],7612:[[656],256],7613:[[657],256],7614:[[658],256],7615:[[952],256],7616:[,230],7617:[,230],7618:[,220],7619:[,230],7620:[,230],7621:[,230],7622:[,230],7623:[,230],7624:[,230],7625:[,230],7626:[,220],7627:[,230],7628:[,230],7629:[,234],7630:[,214],7631:[,220],7632:[,202],7633:[,230],7634:[,230],7635:[,230],7636:[,230],7637:[,230],7638:[,230],7639:[,230],7640:[,230],7641:[,230],7642:[,230],7643:[,230],7644:[,230],7645:[,230],7646:[,230],7647:[,230],7648:[,230],7649:[,230],7650:[,230],7651:[,230],7652:[,230],7653:[,230],7654:[,230],7655:[,230],7656:[,230],7657:[,230],7658:[,230],7659:[,230],7660:[,230],7661:[,230],7662:[,230],7663:[,230],7664:[,230],7665:[,230],7666:[,230],7667:[,230],7668:[,230],7669:[,230],7676:[,233],7677:[,220],7678:[,230],7679:[,220]}, +7680:{7680:[[65,805]],7681:[[97,805]],7682:[[66,775]],7683:[[98,775]],7684:[[66,803]],7685:[[98,803]],7686:[[66,817]],7687:[[98,817]],7688:[[199,769]],7689:[[231,769]],7690:[[68,775]],7691:[[100,775]],7692:[[68,803]],7693:[[100,803]],7694:[[68,817]],7695:[[100,817]],7696:[[68,807]],7697:[[100,807]],7698:[[68,813]],7699:[[100,813]],7700:[[274,768]],7701:[[275,768]],7702:[[274,769]],7703:[[275,769]],7704:[[69,813]],7705:[[101,813]],7706:[[69,816]],7707:[[101,816]],7708:[[552,774]],7709:[[553,774]],7710:[[70,775]],7711:[[102,775]],7712:[[71,772]],7713:[[103,772]],7714:[[72,775]],7715:[[104,775]],7716:[[72,803]],7717:[[104,803]],7718:[[72,776]],7719:[[104,776]],7720:[[72,807]],7721:[[104,807]],7722:[[72,814]],7723:[[104,814]],7724:[[73,816]],7725:[[105,816]],7726:[[207,769]],7727:[[239,769]],7728:[[75,769]],7729:[[107,769]],7730:[[75,803]],7731:[[107,803]],7732:[[75,817]],7733:[[107,817]],7734:[[76,803],,{772:7736}],7735:[[108,803],,{772:7737}],7736:[[7734,772]],7737:[[7735,772]],7738:[[76,817]],7739:[[108,817]],7740:[[76,813]],7741:[[108,813]],7742:[[77,769]],7743:[[109,769]],7744:[[77,775]],7745:[[109,775]],7746:[[77,803]],7747:[[109,803]],7748:[[78,775]],7749:[[110,775]],7750:[[78,803]],7751:[[110,803]],7752:[[78,817]],7753:[[110,817]],7754:[[78,813]],7755:[[110,813]],7756:[[213,769]],7757:[[245,769]],7758:[[213,776]],7759:[[245,776]],7760:[[332,768]],7761:[[333,768]],7762:[[332,769]],7763:[[333,769]],7764:[[80,769]],7765:[[112,769]],7766:[[80,775]],7767:[[112,775]],7768:[[82,775]],7769:[[114,775]],7770:[[82,803],,{772:7772}],7771:[[114,803],,{772:7773}],7772:[[7770,772]],7773:[[7771,772]],7774:[[82,817]],7775:[[114,817]],7776:[[83,775]],7777:[[115,775]],7778:[[83,803],,{775:7784}],7779:[[115,803],,{775:7785}],7780:[[346,775]],7781:[[347,775]],7782:[[352,775]],7783:[[353,775]],7784:[[7778,775]],7785:[[7779,775]],7786:[[84,775]],7787:[[116,775]],7788:[[84,803]],7789:[[116,803]],7790:[[84,817]],7791:[[116,817]],7792:[[84,813]],7793:[[116,813]],7794:[[85,804]],7795:[[117,804]],7796:[[85,816]],7797:[[117,816]],7798:[[85,813]],7799:[[117,813]],7800:[[360,769]],7801:[[361,769]],7802:[[362,776]],7803:[[363,776]],7804:[[86,771]],7805:[[118,771]],7806:[[86,803]],7807:[[118,803]],7808:[[87,768]],7809:[[119,768]],7810:[[87,769]],7811:[[119,769]],7812:[[87,776]],7813:[[119,776]],7814:[[87,775]],7815:[[119,775]],7816:[[87,803]],7817:[[119,803]],7818:[[88,775]],7819:[[120,775]],7820:[[88,776]],7821:[[120,776]],7822:[[89,775]],7823:[[121,775]],7824:[[90,770]],7825:[[122,770]],7826:[[90,803]],7827:[[122,803]],7828:[[90,817]],7829:[[122,817]],7830:[[104,817]],7831:[[116,776]],7832:[[119,778]],7833:[[121,778]],7834:[[97,702],256],7835:[[383,775]],7840:[[65,803],,{770:7852,774:7862}],7841:[[97,803],,{770:7853,774:7863}],7842:[[65,777]],7843:[[97,777]],7844:[[194,769]],7845:[[226,769]],7846:[[194,768]],7847:[[226,768]],7848:[[194,777]],7849:[[226,777]],7850:[[194,771]],7851:[[226,771]],7852:[[7840,770]],7853:[[7841,770]],7854:[[258,769]],7855:[[259,769]],7856:[[258,768]],7857:[[259,768]],7858:[[258,777]],7859:[[259,777]],7860:[[258,771]],7861:[[259,771]],7862:[[7840,774]],7863:[[7841,774]],7864:[[69,803],,{770:7878}],7865:[[101,803],,{770:7879}],7866:[[69,777]],7867:[[101,777]],7868:[[69,771]],7869:[[101,771]],7870:[[202,769]],7871:[[234,769]],7872:[[202,768]],7873:[[234,768]],7874:[[202,777]],7875:[[234,777]],7876:[[202,771]],7877:[[234,771]],7878:[[7864,770]],7879:[[7865,770]],7880:[[73,777]],7881:[[105,777]],7882:[[73,803]],7883:[[105,803]],7884:[[79,803],,{770:7896}],7885:[[111,803],,{770:7897}],7886:[[79,777]],7887:[[111,777]],7888:[[212,769]],7889:[[244,769]],7890:[[212,768]],7891:[[244,768]],7892:[[212,777]],7893:[[244,777]],7894:[[212,771]],7895:[[244,771]],7896:[[7884,770]],7897:[[7885,770]],7898:[[416,769]],7899:[[417,769]],7900:[[416,768]],7901:[[417,768]],7902:[[416,777]],7903:[[417,777]],7904:[[416,771]],7905:[[417,771]],7906:[[416,803]],7907:[[417,803]],7908:[[85,803]],7909:[[117,803]],7910:[[85,777]],7911:[[117,777]],7912:[[431,769]],7913:[[432,769]],7914:[[431,768]],7915:[[432,768]],7916:[[431,777]],7917:[[432,777]],7918:[[431,771]],7919:[[432,771]],7920:[[431,803]],7921:[[432,803]],7922:[[89,768]],7923:[[121,768]],7924:[[89,803]],7925:[[121,803]],7926:[[89,777]],7927:[[121,777]],7928:[[89,771]],7929:[[121,771]]}, +7936:{7936:[[945,787],,{768:7938,769:7940,834:7942,837:8064}],7937:[[945,788],,{768:7939,769:7941,834:7943,837:8065}],7938:[[7936,768],,{837:8066}],7939:[[7937,768],,{837:8067}],7940:[[7936,769],,{837:8068}],7941:[[7937,769],,{837:8069}],7942:[[7936,834],,{837:8070}],7943:[[7937,834],,{837:8071}],7944:[[913,787],,{768:7946,769:7948,834:7950,837:8072}],7945:[[913,788],,{768:7947,769:7949,834:7951,837:8073}],7946:[[7944,768],,{837:8074}],7947:[[7945,768],,{837:8075}],7948:[[7944,769],,{837:8076}],7949:[[7945,769],,{837:8077}],7950:[[7944,834],,{837:8078}],7951:[[7945,834],,{837:8079}],7952:[[949,787],,{768:7954,769:7956}],7953:[[949,788],,{768:7955,769:7957}],7954:[[7952,768]],7955:[[7953,768]],7956:[[7952,769]],7957:[[7953,769]],7960:[[917,787],,{768:7962,769:7964}],7961:[[917,788],,{768:7963,769:7965}],7962:[[7960,768]],7963:[[7961,768]],7964:[[7960,769]],7965:[[7961,769]],7968:[[951,787],,{768:7970,769:7972,834:7974,837:8080}],7969:[[951,788],,{768:7971,769:7973,834:7975,837:8081}],7970:[[7968,768],,{837:8082}],7971:[[7969,768],,{837:8083}],7972:[[7968,769],,{837:8084}],7973:[[7969,769],,{837:8085}],7974:[[7968,834],,{837:8086}],7975:[[7969,834],,{837:8087}],7976:[[919,787],,{768:7978,769:7980,834:7982,837:8088}],7977:[[919,788],,{768:7979,769:7981,834:7983,837:8089}],7978:[[7976,768],,{837:8090}],7979:[[7977,768],,{837:8091}],7980:[[7976,769],,{837:8092}],7981:[[7977,769],,{837:8093}],7982:[[7976,834],,{837:8094}],7983:[[7977,834],,{837:8095}],7984:[[953,787],,{768:7986,769:7988,834:7990}],7985:[[953,788],,{768:7987,769:7989,834:7991}],7986:[[7984,768]],7987:[[7985,768]],7988:[[7984,769]],7989:[[7985,769]],7990:[[7984,834]],7991:[[7985,834]],7992:[[921,787],,{768:7994,769:7996,834:7998}],7993:[[921,788],,{768:7995,769:7997,834:7999}],7994:[[7992,768]],7995:[[7993,768]],7996:[[7992,769]],7997:[[7993,769]],7998:[[7992,834]],7999:[[7993,834]],8000:[[959,787],,{768:8002,769:8004}],8001:[[959,788],,{768:8003,769:8005}],8002:[[8000,768]],8003:[[8001,768]],8004:[[8000,769]],8005:[[8001,769]],8008:[[927,787],,{768:8010,769:8012}],8009:[[927,788],,{768:8011,769:8013}],8010:[[8008,768]],8011:[[8009,768]],8012:[[8008,769]],8013:[[8009,769]],8016:[[965,787],,{768:8018,769:8020,834:8022}],8017:[[965,788],,{768:8019,769:8021,834:8023}],8018:[[8016,768]],8019:[[8017,768]],8020:[[8016,769]],8021:[[8017,769]],8022:[[8016,834]],8023:[[8017,834]],8025:[[933,788],,{768:8027,769:8029,834:8031}],8027:[[8025,768]],8029:[[8025,769]],8031:[[8025,834]],8032:[[969,787],,{768:8034,769:8036,834:8038,837:8096}],8033:[[969,788],,{768:8035,769:8037,834:8039,837:8097}],8034:[[8032,768],,{837:8098}],8035:[[8033,768],,{837:8099}],8036:[[8032,769],,{837:8100}],8037:[[8033,769],,{837:8101}],8038:[[8032,834],,{837:8102}],8039:[[8033,834],,{837:8103}],8040:[[937,787],,{768:8042,769:8044,834:8046,837:8104}],8041:[[937,788],,{768:8043,769:8045,834:8047,837:8105}],8042:[[8040,768],,{837:8106}],8043:[[8041,768],,{837:8107}],8044:[[8040,769],,{837:8108}],8045:[[8041,769],,{837:8109}],8046:[[8040,834],,{837:8110}],8047:[[8041,834],,{837:8111}],8048:[[945,768],,{837:8114}],8049:[[940]],8050:[[949,768]],8051:[[941]],8052:[[951,768],,{837:8130}],8053:[[942]],8054:[[953,768]],8055:[[943]],8056:[[959,768]],8057:[[972]],8058:[[965,768]],8059:[[973]],8060:[[969,768],,{837:8178}],8061:[[974]],8064:[[7936,837]],8065:[[7937,837]],8066:[[7938,837]],8067:[[7939,837]],8068:[[7940,837]],8069:[[7941,837]],8070:[[7942,837]],8071:[[7943,837]],8072:[[7944,837]],8073:[[7945,837]],8074:[[7946,837]],8075:[[7947,837]],8076:[[7948,837]],8077:[[7949,837]],8078:[[7950,837]],8079:[[7951,837]],8080:[[7968,837]],8081:[[7969,837]],8082:[[7970,837]],8083:[[7971,837]],8084:[[7972,837]],8085:[[7973,837]],8086:[[7974,837]],8087:[[7975,837]],8088:[[7976,837]],8089:[[7977,837]],8090:[[7978,837]],8091:[[7979,837]],8092:[[7980,837]],8093:[[7981,837]],8094:[[7982,837]],8095:[[7983,837]],8096:[[8032,837]],8097:[[8033,837]],8098:[[8034,837]],8099:[[8035,837]],8100:[[8036,837]],8101:[[8037,837]],8102:[[8038,837]],8103:[[8039,837]],8104:[[8040,837]],8105:[[8041,837]],8106:[[8042,837]],8107:[[8043,837]],8108:[[8044,837]],8109:[[8045,837]],8110:[[8046,837]],8111:[[8047,837]],8112:[[945,774]],8113:[[945,772]],8114:[[8048,837]],8115:[[945,837]],8116:[[940,837]],8118:[[945,834],,{837:8119}],8119:[[8118,837]],8120:[[913,774]],8121:[[913,772]],8122:[[913,768]],8123:[[902]],8124:[[913,837]],8125:[[32,787],256],8126:[[953]],8127:[[32,787],256,{768:8141,769:8142,834:8143}],8128:[[32,834],256],8129:[[168,834]],8130:[[8052,837]],8131:[[951,837]],8132:[[942,837]],8134:[[951,834],,{837:8135}],8135:[[8134,837]],8136:[[917,768]],8137:[[904]],8138:[[919,768]],8139:[[905]],8140:[[919,837]],8141:[[8127,768]],8142:[[8127,769]],8143:[[8127,834]],8144:[[953,774]],8145:[[953,772]],8146:[[970,768]],8147:[[912]],8150:[[953,834]],8151:[[970,834]],8152:[[921,774]],8153:[[921,772]],8154:[[921,768]],8155:[[906]],8157:[[8190,768]],8158:[[8190,769]],8159:[[8190,834]],8160:[[965,774]],8161:[[965,772]],8162:[[971,768]],8163:[[944]],8164:[[961,787]],8165:[[961,788]],8166:[[965,834]],8167:[[971,834]],8168:[[933,774]],8169:[[933,772]],8170:[[933,768]],8171:[[910]],8172:[[929,788]],8173:[[168,768]],8174:[[901]],8175:[[96]],8178:[[8060,837]],8179:[[969,837]],8180:[[974,837]],8182:[[969,834],,{837:8183}],8183:[[8182,837]],8184:[[927,768]],8185:[[908]],8186:[[937,768]],8187:[[911]],8188:[[937,837]],8189:[[180]],8190:[[32,788],256,{768:8157,769:8158,834:8159}]}, +8192:{8192:[[8194]],8193:[[8195]],8194:[[32],256],8195:[[32],256],8196:[[32],256],8197:[[32],256],8198:[[32],256],8199:[[32],256],8200:[[32],256],8201:[[32],256],8202:[[32],256],8209:[[8208],256],8215:[[32,819],256],8228:[[46],256],8229:[[46,46],256],8230:[[46,46,46],256],8239:[[32],256],8243:[[8242,8242],256],8244:[[8242,8242,8242],256],8246:[[8245,8245],256],8247:[[8245,8245,8245],256],8252:[[33,33],256],8254:[[32,773],256],8263:[[63,63],256],8264:[[63,33],256],8265:[[33,63],256],8279:[[8242,8242,8242,8242],256],8287:[[32],256],8304:[[48],256],8305:[[105],256],8308:[[52],256],8309:[[53],256],8310:[[54],256],8311:[[55],256],8312:[[56],256],8313:[[57],256],8314:[[43],256],8315:[[8722],256],8316:[[61],256],8317:[[40],256],8318:[[41],256],8319:[[110],256],8320:[[48],256],8321:[[49],256],8322:[[50],256],8323:[[51],256],8324:[[52],256],8325:[[53],256],8326:[[54],256],8327:[[55],256],8328:[[56],256],8329:[[57],256],8330:[[43],256],8331:[[8722],256],8332:[[61],256],8333:[[40],256],8334:[[41],256],8336:[[97],256],8337:[[101],256],8338:[[111],256],8339:[[120],256],8340:[[601],256],8341:[[104],256],8342:[[107],256],8343:[[108],256],8344:[[109],256],8345:[[110],256],8346:[[112],256],8347:[[115],256],8348:[[116],256],8360:[[82,115],256],8400:[,230],8401:[,230],8402:[,1],8403:[,1],8404:[,230],8405:[,230],8406:[,230],8407:[,230],8408:[,1],8409:[,1],8410:[,1],8411:[,230],8412:[,230],8417:[,230],8421:[,1],8422:[,1],8423:[,230],8424:[,220],8425:[,230],8426:[,1],8427:[,1],8428:[,220],8429:[,220],8430:[,220],8431:[,220],8432:[,230]}, +8448:{8448:[[97,47,99],256],8449:[[97,47,115],256],8450:[[67],256],8451:[[176,67],256],8453:[[99,47,111],256],8454:[[99,47,117],256],8455:[[400],256],8457:[[176,70],256],8458:[[103],256],8459:[[72],256],8460:[[72],256],8461:[[72],256],8462:[[104],256],8463:[[295],256],8464:[[73],256],8465:[[73],256],8466:[[76],256],8467:[[108],256],8469:[[78],256],8470:[[78,111],256],8473:[[80],256],8474:[[81],256],8475:[[82],256],8476:[[82],256],8477:[[82],256],8480:[[83,77],256],8481:[[84,69,76],256],8482:[[84,77],256],8484:[[90],256],8486:[[937]],8488:[[90],256],8490:[[75]],8491:[[197]],8492:[[66],256],8493:[[67],256],8495:[[101],256],8496:[[69],256],8497:[[70],256],8499:[[77],256],8500:[[111],256],8501:[[1488],256],8502:[[1489],256],8503:[[1490],256],8504:[[1491],256],8505:[[105],256],8507:[[70,65,88],256],8508:[[960],256],8509:[[947],256],8510:[[915],256],8511:[[928],256],8512:[[8721],256],8517:[[68],256],8518:[[100],256],8519:[[101],256],8520:[[105],256],8521:[[106],256],8528:[[49,8260,55],256],8529:[[49,8260,57],256],8530:[[49,8260,49,48],256],8531:[[49,8260,51],256],8532:[[50,8260,51],256],8533:[[49,8260,53],256],8534:[[50,8260,53],256],8535:[[51,8260,53],256],8536:[[52,8260,53],256],8537:[[49,8260,54],256],8538:[[53,8260,54],256],8539:[[49,8260,56],256],8540:[[51,8260,56],256],8541:[[53,8260,56],256],8542:[[55,8260,56],256],8543:[[49,8260],256],8544:[[73],256],8545:[[73,73],256],8546:[[73,73,73],256],8547:[[73,86],256],8548:[[86],256],8549:[[86,73],256],8550:[[86,73,73],256],8551:[[86,73,73,73],256],8552:[[73,88],256],8553:[[88],256],8554:[[88,73],256],8555:[[88,73,73],256],8556:[[76],256],8557:[[67],256],8558:[[68],256],8559:[[77],256],8560:[[105],256],8561:[[105,105],256],8562:[[105,105,105],256],8563:[[105,118],256],8564:[[118],256],8565:[[118,105],256],8566:[[118,105,105],256],8567:[[118,105,105,105],256],8568:[[105,120],256],8569:[[120],256],8570:[[120,105],256],8571:[[120,105,105],256],8572:[[108],256],8573:[[99],256],8574:[[100],256],8575:[[109],256],8585:[[48,8260,51],256],8592:[,,{824:8602}],8594:[,,{824:8603}],8596:[,,{824:8622}],8602:[[8592,824]],8603:[[8594,824]],8622:[[8596,824]],8653:[[8656,824]],8654:[[8660,824]],8655:[[8658,824]],8656:[,,{824:8653}],8658:[,,{824:8655}],8660:[,,{824:8654}]}, +8704:{8707:[,,{824:8708}],8708:[[8707,824]],8712:[,,{824:8713}],8713:[[8712,824]],8715:[,,{824:8716}],8716:[[8715,824]],8739:[,,{824:8740}],8740:[[8739,824]],8741:[,,{824:8742}],8742:[[8741,824]],8748:[[8747,8747],256],8749:[[8747,8747,8747],256],8751:[[8750,8750],256],8752:[[8750,8750,8750],256],8764:[,,{824:8769}],8769:[[8764,824]],8771:[,,{824:8772}],8772:[[8771,824]],8773:[,,{824:8775}],8775:[[8773,824]],8776:[,,{824:8777}],8777:[[8776,824]],8781:[,,{824:8813}],8800:[[61,824]],8801:[,,{824:8802}],8802:[[8801,824]],8804:[,,{824:8816}],8805:[,,{824:8817}],8813:[[8781,824]],8814:[[60,824]],8815:[[62,824]],8816:[[8804,824]],8817:[[8805,824]],8818:[,,{824:8820}],8819:[,,{824:8821}],8820:[[8818,824]],8821:[[8819,824]],8822:[,,{824:8824}],8823:[,,{824:8825}],8824:[[8822,824]],8825:[[8823,824]],8826:[,,{824:8832}],8827:[,,{824:8833}],8828:[,,{824:8928}],8829:[,,{824:8929}],8832:[[8826,824]],8833:[[8827,824]],8834:[,,{824:8836}],8835:[,,{824:8837}],8836:[[8834,824]],8837:[[8835,824]],8838:[,,{824:8840}],8839:[,,{824:8841}],8840:[[8838,824]],8841:[[8839,824]],8849:[,,{824:8930}],8850:[,,{824:8931}],8866:[,,{824:8876}],8872:[,,{824:8877}],8873:[,,{824:8878}],8875:[,,{824:8879}],8876:[[8866,824]],8877:[[8872,824]],8878:[[8873,824]],8879:[[8875,824]],8882:[,,{824:8938}],8883:[,,{824:8939}],8884:[,,{824:8940}],8885:[,,{824:8941}],8928:[[8828,824]],8929:[[8829,824]],8930:[[8849,824]],8931:[[8850,824]],8938:[[8882,824]],8939:[[8883,824]],8940:[[8884,824]],8941:[[8885,824]]}, +8960:{9001:[[12296]],9002:[[12297]]}, +9216:{9312:[[49],256],9313:[[50],256],9314:[[51],256],9315:[[52],256],9316:[[53],256],9317:[[54],256],9318:[[55],256],9319:[[56],256],9320:[[57],256],9321:[[49,48],256],9322:[[49,49],256],9323:[[49,50],256],9324:[[49,51],256],9325:[[49,52],256],9326:[[49,53],256],9327:[[49,54],256],9328:[[49,55],256],9329:[[49,56],256],9330:[[49,57],256],9331:[[50,48],256],9332:[[40,49,41],256],9333:[[40,50,41],256],9334:[[40,51,41],256],9335:[[40,52,41],256],9336:[[40,53,41],256],9337:[[40,54,41],256],9338:[[40,55,41],256],9339:[[40,56,41],256],9340:[[40,57,41],256],9341:[[40,49,48,41],256],9342:[[40,49,49,41],256],9343:[[40,49,50,41],256],9344:[[40,49,51,41],256],9345:[[40,49,52,41],256],9346:[[40,49,53,41],256],9347:[[40,49,54,41],256],9348:[[40,49,55,41],256],9349:[[40,49,56,41],256],9350:[[40,49,57,41],256],9351:[[40,50,48,41],256],9352:[[49,46],256],9353:[[50,46],256],9354:[[51,46],256],9355:[[52,46],256],9356:[[53,46],256],9357:[[54,46],256],9358:[[55,46],256],9359:[[56,46],256],9360:[[57,46],256],9361:[[49,48,46],256],9362:[[49,49,46],256],9363:[[49,50,46],256],9364:[[49,51,46],256],9365:[[49,52,46],256],9366:[[49,53,46],256],9367:[[49,54,46],256],9368:[[49,55,46],256],9369:[[49,56,46],256],9370:[[49,57,46],256],9371:[[50,48,46],256],9372:[[40,97,41],256],9373:[[40,98,41],256],9374:[[40,99,41],256],9375:[[40,100,41],256],9376:[[40,101,41],256],9377:[[40,102,41],256],9378:[[40,103,41],256],9379:[[40,104,41],256],9380:[[40,105,41],256],9381:[[40,106,41],256],9382:[[40,107,41],256],9383:[[40,108,41],256],9384:[[40,109,41],256],9385:[[40,110,41],256],9386:[[40,111,41],256],9387:[[40,112,41],256],9388:[[40,113,41],256],9389:[[40,114,41],256],9390:[[40,115,41],256],9391:[[40,116,41],256],9392:[[40,117,41],256],9393:[[40,118,41],256],9394:[[40,119,41],256],9395:[[40,120,41],256],9396:[[40,121,41],256],9397:[[40,122,41],256],9398:[[65],256],9399:[[66],256],9400:[[67],256],9401:[[68],256],9402:[[69],256],9403:[[70],256],9404:[[71],256],9405:[[72],256],9406:[[73],256],9407:[[74],256],9408:[[75],256],9409:[[76],256],9410:[[77],256],9411:[[78],256],9412:[[79],256],9413:[[80],256],9414:[[81],256],9415:[[82],256],9416:[[83],256],9417:[[84],256],9418:[[85],256],9419:[[86],256],9420:[[87],256],9421:[[88],256],9422:[[89],256],9423:[[90],256],9424:[[97],256],9425:[[98],256],9426:[[99],256],9427:[[100],256],9428:[[101],256],9429:[[102],256],9430:[[103],256],9431:[[104],256],9432:[[105],256],9433:[[106],256],9434:[[107],256],9435:[[108],256],9436:[[109],256],9437:[[110],256],9438:[[111],256],9439:[[112],256],9440:[[113],256],9441:[[114],256],9442:[[115],256],9443:[[116],256],9444:[[117],256],9445:[[118],256],9446:[[119],256],9447:[[120],256],9448:[[121],256],9449:[[122],256],9450:[[48],256]}, +10752:{10764:[[8747,8747,8747,8747],256],10868:[[58,58,61],256],10869:[[61,61],256],10870:[[61,61,61],256],10972:[[10973,824],512]}, +11264:{11388:[[106],256],11389:[[86],256],11503:[,230],11504:[,230],11505:[,230]}, +11520:{11631:[[11617],256],11647:[,9],11744:[,230],11745:[,230],11746:[,230],11747:[,230],11748:[,230],11749:[,230],11750:[,230],11751:[,230],11752:[,230],11753:[,230],11754:[,230],11755:[,230],11756:[,230],11757:[,230],11758:[,230],11759:[,230],11760:[,230],11761:[,230],11762:[,230],11763:[,230],11764:[,230],11765:[,230],11766:[,230],11767:[,230],11768:[,230],11769:[,230],11770:[,230],11771:[,230],11772:[,230],11773:[,230],11774:[,230],11775:[,230]}, +11776:{11935:[[27597],256],12019:[[40863],256]}, +12032:{12032:[[19968],256],12033:[[20008],256],12034:[[20022],256],12035:[[20031],256],12036:[[20057],256],12037:[[20101],256],12038:[[20108],256],12039:[[20128],256],12040:[[20154],256],12041:[[20799],256],12042:[[20837],256],12043:[[20843],256],12044:[[20866],256],12045:[[20886],256],12046:[[20907],256],12047:[[20960],256],12048:[[20981],256],12049:[[20992],256],12050:[[21147],256],12051:[[21241],256],12052:[[21269],256],12053:[[21274],256],12054:[[21304],256],12055:[[21313],256],12056:[[21340],256],12057:[[21353],256],12058:[[21378],256],12059:[[21430],256],12060:[[21448],256],12061:[[21475],256],12062:[[22231],256],12063:[[22303],256],12064:[[22763],256],12065:[[22786],256],12066:[[22794],256],12067:[[22805],256],12068:[[22823],256],12069:[[22899],256],12070:[[23376],256],12071:[[23424],256],12072:[[23544],256],12073:[[23567],256],12074:[[23586],256],12075:[[23608],256],12076:[[23662],256],12077:[[23665],256],12078:[[24027],256],12079:[[24037],256],12080:[[24049],256],12081:[[24062],256],12082:[[24178],256],12083:[[24186],256],12084:[[24191],256],12085:[[24308],256],12086:[[24318],256],12087:[[24331],256],12088:[[24339],256],12089:[[24400],256],12090:[[24417],256],12091:[[24435],256],12092:[[24515],256],12093:[[25096],256],12094:[[25142],256],12095:[[25163],256],12096:[[25903],256],12097:[[25908],256],12098:[[25991],256],12099:[[26007],256],12100:[[26020],256],12101:[[26041],256],12102:[[26080],256],12103:[[26085],256],12104:[[26352],256],12105:[[26376],256],12106:[[26408],256],12107:[[27424],256],12108:[[27490],256],12109:[[27513],256],12110:[[27571],256],12111:[[27595],256],12112:[[27604],256],12113:[[27611],256],12114:[[27663],256],12115:[[27668],256],12116:[[27700],256],12117:[[28779],256],12118:[[29226],256],12119:[[29238],256],12120:[[29243],256],12121:[[29247],256],12122:[[29255],256],12123:[[29273],256],12124:[[29275],256],12125:[[29356],256],12126:[[29572],256],12127:[[29577],256],12128:[[29916],256],12129:[[29926],256],12130:[[29976],256],12131:[[29983],256],12132:[[29992],256],12133:[[30000],256],12134:[[30091],256],12135:[[30098],256],12136:[[30326],256],12137:[[30333],256],12138:[[30382],256],12139:[[30399],256],12140:[[30446],256],12141:[[30683],256],12142:[[30690],256],12143:[[30707],256],12144:[[31034],256],12145:[[31160],256],12146:[[31166],256],12147:[[31348],256],12148:[[31435],256],12149:[[31481],256],12150:[[31859],256],12151:[[31992],256],12152:[[32566],256],12153:[[32593],256],12154:[[32650],256],12155:[[32701],256],12156:[[32769],256],12157:[[32780],256],12158:[[32786],256],12159:[[32819],256],12160:[[32895],256],12161:[[32905],256],12162:[[33251],256],12163:[[33258],256],12164:[[33267],256],12165:[[33276],256],12166:[[33292],256],12167:[[33307],256],12168:[[33311],256],12169:[[33390],256],12170:[[33394],256],12171:[[33400],256],12172:[[34381],256],12173:[[34411],256],12174:[[34880],256],12175:[[34892],256],12176:[[34915],256],12177:[[35198],256],12178:[[35211],256],12179:[[35282],256],12180:[[35328],256],12181:[[35895],256],12182:[[35910],256],12183:[[35925],256],12184:[[35960],256],12185:[[35997],256],12186:[[36196],256],12187:[[36208],256],12188:[[36275],256],12189:[[36523],256],12190:[[36554],256],12191:[[36763],256],12192:[[36784],256],12193:[[36789],256],12194:[[37009],256],12195:[[37193],256],12196:[[37318],256],12197:[[37324],256],12198:[[37329],256],12199:[[38263],256],12200:[[38272],256],12201:[[38428],256],12202:[[38582],256],12203:[[38585],256],12204:[[38632],256],12205:[[38737],256],12206:[[38750],256],12207:[[38754],256],12208:[[38761],256],12209:[[38859],256],12210:[[38893],256],12211:[[38899],256],12212:[[38913],256],12213:[[39080],256],12214:[[39131],256],12215:[[39135],256],12216:[[39318],256],12217:[[39321],256],12218:[[39340],256],12219:[[39592],256],12220:[[39640],256],12221:[[39647],256],12222:[[39717],256],12223:[[39727],256],12224:[[39730],256],12225:[[39740],256],12226:[[39770],256],12227:[[40165],256],12228:[[40565],256],12229:[[40575],256],12230:[[40613],256],12231:[[40635],256],12232:[[40643],256],12233:[[40653],256],12234:[[40657],256],12235:[[40697],256],12236:[[40701],256],12237:[[40718],256],12238:[[40723],256],12239:[[40736],256],12240:[[40763],256],12241:[[40778],256],12242:[[40786],256],12243:[[40845],256],12244:[[40860],256],12245:[[40864],256]}, +12288:{12288:[[32],256],12330:[,218],12331:[,228],12332:[,232],12333:[,222],12334:[,224],12335:[,224],12342:[[12306],256],12344:[[21313],256],12345:[[21316],256],12346:[[21317],256],12358:[,,{12441:12436}],12363:[,,{12441:12364}],12364:[[12363,12441]],12365:[,,{12441:12366}],12366:[[12365,12441]],12367:[,,{12441:12368}],12368:[[12367,12441]],12369:[,,{12441:12370}],12370:[[12369,12441]],12371:[,,{12441:12372}],12372:[[12371,12441]],12373:[,,{12441:12374}],12374:[[12373,12441]],12375:[,,{12441:12376}],12376:[[12375,12441]],12377:[,,{12441:12378}],12378:[[12377,12441]],12379:[,,{12441:12380}],12380:[[12379,12441]],12381:[,,{12441:12382}],12382:[[12381,12441]],12383:[,,{12441:12384}],12384:[[12383,12441]],12385:[,,{12441:12386}],12386:[[12385,12441]],12388:[,,{12441:12389}],12389:[[12388,12441]],12390:[,,{12441:12391}],12391:[[12390,12441]],12392:[,,{12441:12393}],12393:[[12392,12441]],12399:[,,{12441:12400,12442:12401}],12400:[[12399,12441]],12401:[[12399,12442]],12402:[,,{12441:12403,12442:12404}],12403:[[12402,12441]],12404:[[12402,12442]],12405:[,,{12441:12406,12442:12407}],12406:[[12405,12441]],12407:[[12405,12442]],12408:[,,{12441:12409,12442:12410}],12409:[[12408,12441]],12410:[[12408,12442]],12411:[,,{12441:12412,12442:12413}],12412:[[12411,12441]],12413:[[12411,12442]],12436:[[12358,12441]],12441:[,8],12442:[,8],12443:[[32,12441],256],12444:[[32,12442],256],12445:[,,{12441:12446}],12446:[[12445,12441]],12447:[[12424,12426],256],12454:[,,{12441:12532}],12459:[,,{12441:12460}],12460:[[12459,12441]],12461:[,,{12441:12462}],12462:[[12461,12441]],12463:[,,{12441:12464}],12464:[[12463,12441]],12465:[,,{12441:12466}],12466:[[12465,12441]],12467:[,,{12441:12468}],12468:[[12467,12441]],12469:[,,{12441:12470}],12470:[[12469,12441]],12471:[,,{12441:12472}],12472:[[12471,12441]],12473:[,,{12441:12474}],12474:[[12473,12441]],12475:[,,{12441:12476}],12476:[[12475,12441]],12477:[,,{12441:12478}],12478:[[12477,12441]],12479:[,,{12441:12480}],12480:[[12479,12441]],12481:[,,{12441:12482}],12482:[[12481,12441]],12484:[,,{12441:12485}],12485:[[12484,12441]],12486:[,,{12441:12487}],12487:[[12486,12441]],12488:[,,{12441:12489}],12489:[[12488,12441]],12495:[,,{12441:12496,12442:12497}],12496:[[12495,12441]],12497:[[12495,12442]],12498:[,,{12441:12499,12442:12500}],12499:[[12498,12441]],12500:[[12498,12442]],12501:[,,{12441:12502,12442:12503}],12502:[[12501,12441]],12503:[[12501,12442]],12504:[,,{12441:12505,12442:12506}],12505:[[12504,12441]],12506:[[12504,12442]],12507:[,,{12441:12508,12442:12509}],12508:[[12507,12441]],12509:[[12507,12442]],12527:[,,{12441:12535}],12528:[,,{12441:12536}],12529:[,,{12441:12537}],12530:[,,{12441:12538}],12532:[[12454,12441]],12535:[[12527,12441]],12536:[[12528,12441]],12537:[[12529,12441]],12538:[[12530,12441]],12541:[,,{12441:12542}],12542:[[12541,12441]],12543:[[12467,12488],256]}, +12544:{12593:[[4352],256],12594:[[4353],256],12595:[[4522],256],12596:[[4354],256],12597:[[4524],256],12598:[[4525],256],12599:[[4355],256],12600:[[4356],256],12601:[[4357],256],12602:[[4528],256],12603:[[4529],256],12604:[[4530],256],12605:[[4531],256],12606:[[4532],256],12607:[[4533],256],12608:[[4378],256],12609:[[4358],256],12610:[[4359],256],12611:[[4360],256],12612:[[4385],256],12613:[[4361],256],12614:[[4362],256],12615:[[4363],256],12616:[[4364],256],12617:[[4365],256],12618:[[4366],256],12619:[[4367],256],12620:[[4368],256],12621:[[4369],256],12622:[[4370],256],12623:[[4449],256],12624:[[4450],256],12625:[[4451],256],12626:[[4452],256],12627:[[4453],256],12628:[[4454],256],12629:[[4455],256],12630:[[4456],256],12631:[[4457],256],12632:[[4458],256],12633:[[4459],256],12634:[[4460],256],12635:[[4461],256],12636:[[4462],256],12637:[[4463],256],12638:[[4464],256],12639:[[4465],256],12640:[[4466],256],12641:[[4467],256],12642:[[4468],256],12643:[[4469],256],12644:[[4448],256],12645:[[4372],256],12646:[[4373],256],12647:[[4551],256],12648:[[4552],256],12649:[[4556],256],12650:[[4558],256],12651:[[4563],256],12652:[[4567],256],12653:[[4569],256],12654:[[4380],256],12655:[[4573],256],12656:[[4575],256],12657:[[4381],256],12658:[[4382],256],12659:[[4384],256],12660:[[4386],256],12661:[[4387],256],12662:[[4391],256],12663:[[4393],256],12664:[[4395],256],12665:[[4396],256],12666:[[4397],256],12667:[[4398],256],12668:[[4399],256],12669:[[4402],256],12670:[[4406],256],12671:[[4416],256],12672:[[4423],256],12673:[[4428],256],12674:[[4593],256],12675:[[4594],256],12676:[[4439],256],12677:[[4440],256],12678:[[4441],256],12679:[[4484],256],12680:[[4485],256],12681:[[4488],256],12682:[[4497],256],12683:[[4498],256],12684:[[4500],256],12685:[[4510],256],12686:[[4513],256],12690:[[19968],256],12691:[[20108],256],12692:[[19977],256],12693:[[22235],256],12694:[[19978],256],12695:[[20013],256],12696:[[19979],256],12697:[[30002],256],12698:[[20057],256],12699:[[19993],256],12700:[[19969],256],12701:[[22825],256],12702:[[22320],256],12703:[[20154],256]}, +12800:{12800:[[40,4352,41],256],12801:[[40,4354,41],256],12802:[[40,4355,41],256],12803:[[40,4357,41],256],12804:[[40,4358,41],256],12805:[[40,4359,41],256],12806:[[40,4361,41],256],12807:[[40,4363,41],256],12808:[[40,4364,41],256],12809:[[40,4366,41],256],12810:[[40,4367,41],256],12811:[[40,4368,41],256],12812:[[40,4369,41],256],12813:[[40,4370,41],256],12814:[[40,4352,4449,41],256],12815:[[40,4354,4449,41],256],12816:[[40,4355,4449,41],256],12817:[[40,4357,4449,41],256],12818:[[40,4358,4449,41],256],12819:[[40,4359,4449,41],256],12820:[[40,4361,4449,41],256],12821:[[40,4363,4449,41],256],12822:[[40,4364,4449,41],256],12823:[[40,4366,4449,41],256],12824:[[40,4367,4449,41],256],12825:[[40,4368,4449,41],256],12826:[[40,4369,4449,41],256],12827:[[40,4370,4449,41],256],12828:[[40,4364,4462,41],256],12829:[[40,4363,4457,4364,4453,4523,41],256],12830:[[40,4363,4457,4370,4462,41],256],12832:[[40,19968,41],256],12833:[[40,20108,41],256],12834:[[40,19977,41],256],12835:[[40,22235,41],256],12836:[[40,20116,41],256],12837:[[40,20845,41],256],12838:[[40,19971,41],256],12839:[[40,20843,41],256],12840:[[40,20061,41],256],12841:[[40,21313,41],256],12842:[[40,26376,41],256],12843:[[40,28779,41],256],12844:[[40,27700,41],256],12845:[[40,26408,41],256],12846:[[40,37329,41],256],12847:[[40,22303,41],256],12848:[[40,26085,41],256],12849:[[40,26666,41],256],12850:[[40,26377,41],256],12851:[[40,31038,41],256],12852:[[40,21517,41],256],12853:[[40,29305,41],256],12854:[[40,36001,41],256],12855:[[40,31069,41],256],12856:[[40,21172,41],256],12857:[[40,20195,41],256],12858:[[40,21628,41],256],12859:[[40,23398,41],256],12860:[[40,30435,41],256],12861:[[40,20225,41],256],12862:[[40,36039,41],256],12863:[[40,21332,41],256],12864:[[40,31085,41],256],12865:[[40,20241,41],256],12866:[[40,33258,41],256],12867:[[40,33267,41],256],12868:[[21839],256],12869:[[24188],256],12870:[[25991],256],12871:[[31631],256],12880:[[80,84,69],256],12881:[[50,49],256],12882:[[50,50],256],12883:[[50,51],256],12884:[[50,52],256],12885:[[50,53],256],12886:[[50,54],256],12887:[[50,55],256],12888:[[50,56],256],12889:[[50,57],256],12890:[[51,48],256],12891:[[51,49],256],12892:[[51,50],256],12893:[[51,51],256],12894:[[51,52],256],12895:[[51,53],256],12896:[[4352],256],12897:[[4354],256],12898:[[4355],256],12899:[[4357],256],12900:[[4358],256],12901:[[4359],256],12902:[[4361],256],12903:[[4363],256],12904:[[4364],256],12905:[[4366],256],12906:[[4367],256],12907:[[4368],256],12908:[[4369],256],12909:[[4370],256],12910:[[4352,4449],256],12911:[[4354,4449],256],12912:[[4355,4449],256],12913:[[4357,4449],256],12914:[[4358,4449],256],12915:[[4359,4449],256],12916:[[4361,4449],256],12917:[[4363,4449],256],12918:[[4364,4449],256],12919:[[4366,4449],256],12920:[[4367,4449],256],12921:[[4368,4449],256],12922:[[4369,4449],256],12923:[[4370,4449],256],12924:[[4366,4449,4535,4352,4457],256],12925:[[4364,4462,4363,4468],256],12926:[[4363,4462],256],12928:[[19968],256],12929:[[20108],256],12930:[[19977],256],12931:[[22235],256],12932:[[20116],256],12933:[[20845],256],12934:[[19971],256],12935:[[20843],256],12936:[[20061],256],12937:[[21313],256],12938:[[26376],256],12939:[[28779],256],12940:[[27700],256],12941:[[26408],256],12942:[[37329],256],12943:[[22303],256],12944:[[26085],256],12945:[[26666],256],12946:[[26377],256],12947:[[31038],256],12948:[[21517],256],12949:[[29305],256],12950:[[36001],256],12951:[[31069],256],12952:[[21172],256],12953:[[31192],256],12954:[[30007],256],12955:[[22899],256],12956:[[36969],256],12957:[[20778],256],12958:[[21360],256],12959:[[27880],256],12960:[[38917],256],12961:[[20241],256],12962:[[20889],256],12963:[[27491],256],12964:[[19978],256],12965:[[20013],256],12966:[[19979],256],12967:[[24038],256],12968:[[21491],256],12969:[[21307],256],12970:[[23447],256],12971:[[23398],256],12972:[[30435],256],12973:[[20225],256],12974:[[36039],256],12975:[[21332],256],12976:[[22812],256],12977:[[51,54],256],12978:[[51,55],256],12979:[[51,56],256],12980:[[51,57],256],12981:[[52,48],256],12982:[[52,49],256],12983:[[52,50],256],12984:[[52,51],256],12985:[[52,52],256],12986:[[52,53],256],12987:[[52,54],256],12988:[[52,55],256],12989:[[52,56],256],12990:[[52,57],256],12991:[[53,48],256],12992:[[49,26376],256],12993:[[50,26376],256],12994:[[51,26376],256],12995:[[52,26376],256],12996:[[53,26376],256],12997:[[54,26376],256],12998:[[55,26376],256],12999:[[56,26376],256],13000:[[57,26376],256],13001:[[49,48,26376],256],13002:[[49,49,26376],256],13003:[[49,50,26376],256],13004:[[72,103],256],13005:[[101,114,103],256],13006:[[101,86],256],13007:[[76,84,68],256],13008:[[12450],256],13009:[[12452],256],13010:[[12454],256],13011:[[12456],256],13012:[[12458],256],13013:[[12459],256],13014:[[12461],256],13015:[[12463],256],13016:[[12465],256],13017:[[12467],256],13018:[[12469],256],13019:[[12471],256],13020:[[12473],256],13021:[[12475],256],13022:[[12477],256],13023:[[12479],256],13024:[[12481],256],13025:[[12484],256],13026:[[12486],256],13027:[[12488],256],13028:[[12490],256],13029:[[12491],256],13030:[[12492],256],13031:[[12493],256],13032:[[12494],256],13033:[[12495],256],13034:[[12498],256],13035:[[12501],256],13036:[[12504],256],13037:[[12507],256],13038:[[12510],256],13039:[[12511],256],13040:[[12512],256],13041:[[12513],256],13042:[[12514],256],13043:[[12516],256],13044:[[12518],256],13045:[[12520],256],13046:[[12521],256],13047:[[12522],256],13048:[[12523],256],13049:[[12524],256],13050:[[12525],256],13051:[[12527],256],13052:[[12528],256],13053:[[12529],256],13054:[[12530],256]}, +13056:{13056:[[12450,12497,12540,12488],256],13057:[[12450,12523,12501,12449],256],13058:[[12450,12531,12506,12450],256],13059:[[12450,12540,12523],256],13060:[[12452,12491,12531,12464],256],13061:[[12452,12531,12481],256],13062:[[12454,12457,12531],256],13063:[[12456,12473,12463,12540,12489],256],13064:[[12456,12540,12459,12540],256],13065:[[12458,12531,12473],256],13066:[[12458,12540,12512],256],13067:[[12459,12452,12522],256],13068:[[12459,12521,12483,12488],256],13069:[[12459,12525,12522,12540],256],13070:[[12460,12525,12531],256],13071:[[12460,12531,12510],256],13072:[[12462,12460],256],13073:[[12462,12491,12540],256],13074:[[12461,12517,12522,12540],256],13075:[[12462,12523,12480,12540],256],13076:[[12461,12525],256],13077:[[12461,12525,12464,12521,12512],256],13078:[[12461,12525,12513,12540,12488,12523],256],13079:[[12461,12525,12527,12483,12488],256],13080:[[12464,12521,12512],256],13081:[[12464,12521,12512,12488,12531],256],13082:[[12463,12523,12476,12452,12525],256],13083:[[12463,12525,12540,12493],256],13084:[[12465,12540,12473],256],13085:[[12467,12523,12490],256],13086:[[12467,12540,12509],256],13087:[[12469,12452,12463,12523],256],13088:[[12469,12531,12481,12540,12512],256],13089:[[12471,12522,12531,12464],256],13090:[[12475,12531,12481],256],13091:[[12475,12531,12488],256],13092:[[12480,12540,12473],256],13093:[[12487,12471],256],13094:[[12489,12523],256],13095:[[12488,12531],256],13096:[[12490,12494],256],13097:[[12494,12483,12488],256],13098:[[12495,12452,12484],256],13099:[[12497,12540,12475,12531,12488],256],13100:[[12497,12540,12484],256],13101:[[12496,12540,12524,12523],256],13102:[[12500,12450,12473,12488,12523],256],13103:[[12500,12463,12523],256],13104:[[12500,12467],256],13105:[[12499,12523],256],13106:[[12501,12449,12521,12483,12489],256],13107:[[12501,12451,12540,12488],256],13108:[[12502,12483,12471,12455,12523],256],13109:[[12501,12521,12531],256],13110:[[12504,12463,12479,12540,12523],256],13111:[[12506,12477],256],13112:[[12506,12491,12498],256],13113:[[12504,12523,12484],256],13114:[[12506,12531,12473],256],13115:[[12506,12540,12472],256],13116:[[12505,12540,12479],256],13117:[[12509,12452,12531,12488],256],13118:[[12508,12523,12488],256],13119:[[12507,12531],256],13120:[[12509,12531,12489],256],13121:[[12507,12540,12523],256],13122:[[12507,12540,12531],256],13123:[[12510,12452,12463,12525],256],13124:[[12510,12452,12523],256],13125:[[12510,12483,12495],256],13126:[[12510,12523,12463],256],13127:[[12510,12531,12471,12519,12531],256],13128:[[12511,12463,12525,12531],256],13129:[[12511,12522],256],13130:[[12511,12522,12496,12540,12523],256],13131:[[12513,12460],256],13132:[[12513,12460,12488,12531],256],13133:[[12513,12540,12488,12523],256],13134:[[12516,12540,12489],256],13135:[[12516,12540,12523],256],13136:[[12518,12450,12531],256],13137:[[12522,12483,12488,12523],256],13138:[[12522,12521],256],13139:[[12523,12500,12540],256],13140:[[12523,12540,12502,12523],256],13141:[[12524,12512],256],13142:[[12524,12531,12488,12466,12531],256],13143:[[12527,12483,12488],256],13144:[[48,28857],256],13145:[[49,28857],256],13146:[[50,28857],256],13147:[[51,28857],256],13148:[[52,28857],256],13149:[[53,28857],256],13150:[[54,28857],256],13151:[[55,28857],256],13152:[[56,28857],256],13153:[[57,28857],256],13154:[[49,48,28857],256],13155:[[49,49,28857],256],13156:[[49,50,28857],256],13157:[[49,51,28857],256],13158:[[49,52,28857],256],13159:[[49,53,28857],256],13160:[[49,54,28857],256],13161:[[49,55,28857],256],13162:[[49,56,28857],256],13163:[[49,57,28857],256],13164:[[50,48,28857],256],13165:[[50,49,28857],256],13166:[[50,50,28857],256],13167:[[50,51,28857],256],13168:[[50,52,28857],256],13169:[[104,80,97],256],13170:[[100,97],256],13171:[[65,85],256],13172:[[98,97,114],256],13173:[[111,86],256],13174:[[112,99],256],13175:[[100,109],256],13176:[[100,109,178],256],13177:[[100,109,179],256],13178:[[73,85],256],13179:[[24179,25104],256],13180:[[26157,21644],256],13181:[[22823,27491],256],13182:[[26126,27835],256],13183:[[26666,24335,20250,31038],256],13184:[[112,65],256],13185:[[110,65],256],13186:[[956,65],256],13187:[[109,65],256],13188:[[107,65],256],13189:[[75,66],256],13190:[[77,66],256],13191:[[71,66],256],13192:[[99,97,108],256],13193:[[107,99,97,108],256],13194:[[112,70],256],13195:[[110,70],256],13196:[[956,70],256],13197:[[956,103],256],13198:[[109,103],256],13199:[[107,103],256],13200:[[72,122],256],13201:[[107,72,122],256],13202:[[77,72,122],256],13203:[[71,72,122],256],13204:[[84,72,122],256],13205:[[956,8467],256],13206:[[109,8467],256],13207:[[100,8467],256],13208:[[107,8467],256],13209:[[102,109],256],13210:[[110,109],256],13211:[[956,109],256],13212:[[109,109],256],13213:[[99,109],256],13214:[[107,109],256],13215:[[109,109,178],256],13216:[[99,109,178],256],13217:[[109,178],256],13218:[[107,109,178],256],13219:[[109,109,179],256],13220:[[99,109,179],256],13221:[[109,179],256],13222:[[107,109,179],256],13223:[[109,8725,115],256],13224:[[109,8725,115,178],256],13225:[[80,97],256],13226:[[107,80,97],256],13227:[[77,80,97],256],13228:[[71,80,97],256],13229:[[114,97,100],256],13230:[[114,97,100,8725,115],256],13231:[[114,97,100,8725,115,178],256],13232:[[112,115],256],13233:[[110,115],256],13234:[[956,115],256],13235:[[109,115],256],13236:[[112,86],256],13237:[[110,86],256],13238:[[956,86],256],13239:[[109,86],256],13240:[[107,86],256],13241:[[77,86],256],13242:[[112,87],256],13243:[[110,87],256],13244:[[956,87],256],13245:[[109,87],256],13246:[[107,87],256],13247:[[77,87],256],13248:[[107,937],256],13249:[[77,937],256],13250:[[97,46,109,46],256],13251:[[66,113],256],13252:[[99,99],256],13253:[[99,100],256],13254:[[67,8725,107,103],256],13255:[[67,111,46],256],13256:[[100,66],256],13257:[[71,121],256],13258:[[104,97],256],13259:[[72,80],256],13260:[[105,110],256],13261:[[75,75],256],13262:[[75,77],256],13263:[[107,116],256],13264:[[108,109],256],13265:[[108,110],256],13266:[[108,111,103],256],13267:[[108,120],256],13268:[[109,98],256],13269:[[109,105,108],256],13270:[[109,111,108],256],13271:[[80,72],256],13272:[[112,46,109,46],256],13273:[[80,80,77],256],13274:[[80,82],256],13275:[[115,114],256],13276:[[83,118],256],13277:[[87,98],256],13278:[[86,8725,109],256],13279:[[65,8725,109],256],13280:[[49,26085],256],13281:[[50,26085],256],13282:[[51,26085],256],13283:[[52,26085],256],13284:[[53,26085],256],13285:[[54,26085],256],13286:[[55,26085],256],13287:[[56,26085],256],13288:[[57,26085],256],13289:[[49,48,26085],256],13290:[[49,49,26085],256],13291:[[49,50,26085],256],13292:[[49,51,26085],256],13293:[[49,52,26085],256],13294:[[49,53,26085],256],13295:[[49,54,26085],256],13296:[[49,55,26085],256],13297:[[49,56,26085],256],13298:[[49,57,26085],256],13299:[[50,48,26085],256],13300:[[50,49,26085],256],13301:[[50,50,26085],256],13302:[[50,51,26085],256],13303:[[50,52,26085],256],13304:[[50,53,26085],256],13305:[[50,54,26085],256],13306:[[50,55,26085],256],13307:[[50,56,26085],256],13308:[[50,57,26085],256],13309:[[51,48,26085],256],13310:[[51,49,26085],256],13311:[[103,97,108],256]}, +27136:{92912:[,1],92913:[,1],92914:[,1],92915:[,1],92916:[,1]}, +27392:{92976:[,230],92977:[,230],92978:[,230],92979:[,230],92980:[,230],92981:[,230],92982:[,230]}, +42496:{42607:[,230],42612:[,230],42613:[,230],42614:[,230],42615:[,230],42616:[,230],42617:[,230],42618:[,230],42619:[,230],42620:[,230],42621:[,230],42652:[[1098],256],42653:[[1100],256],42655:[,230],42736:[,230],42737:[,230]}, +42752:{42864:[[42863],256],43000:[[294],256],43001:[[339],256]}, +43008:{43014:[,9],43204:[,9],43232:[,230],43233:[,230],43234:[,230],43235:[,230],43236:[,230],43237:[,230],43238:[,230],43239:[,230],43240:[,230],43241:[,230],43242:[,230],43243:[,230],43244:[,230],43245:[,230],43246:[,230],43247:[,230],43248:[,230],43249:[,230]}, +43264:{43307:[,220],43308:[,220],43309:[,220],43347:[,9],43443:[,7],43456:[,9]}, +43520:{43696:[,230],43698:[,230],43699:[,230],43700:[,220],43703:[,230],43704:[,230],43710:[,230],43711:[,230],43713:[,230],43766:[,9]}, +43776:{43868:[[42791],256],43869:[[43831],256],43870:[[619],256],43871:[[43858],256],44013:[,9]}, +48128:{113822:[,1]}, +53504:{119134:[[119127,119141],512],119135:[[119128,119141],512],119136:[[119135,119150],512],119137:[[119135,119151],512],119138:[[119135,119152],512],119139:[[119135,119153],512],119140:[[119135,119154],512],119141:[,216],119142:[,216],119143:[,1],119144:[,1],119145:[,1],119149:[,226],119150:[,216],119151:[,216],119152:[,216],119153:[,216],119154:[,216],119163:[,220],119164:[,220],119165:[,220],119166:[,220],119167:[,220],119168:[,220],119169:[,220],119170:[,220],119173:[,230],119174:[,230],119175:[,230],119176:[,230],119177:[,230],119178:[,220],119179:[,220],119210:[,230],119211:[,230],119212:[,230],119213:[,230],119227:[[119225,119141],512],119228:[[119226,119141],512],119229:[[119227,119150],512],119230:[[119228,119150],512],119231:[[119227,119151],512],119232:[[119228,119151],512]}, +53760:{119362:[,230],119363:[,230],119364:[,230]}, +54272:{119808:[[65],256],119809:[[66],256],119810:[[67],256],119811:[[68],256],119812:[[69],256],119813:[[70],256],119814:[[71],256],119815:[[72],256],119816:[[73],256],119817:[[74],256],119818:[[75],256],119819:[[76],256],119820:[[77],256],119821:[[78],256],119822:[[79],256],119823:[[80],256],119824:[[81],256],119825:[[82],256],119826:[[83],256],119827:[[84],256],119828:[[85],256],119829:[[86],256],119830:[[87],256],119831:[[88],256],119832:[[89],256],119833:[[90],256],119834:[[97],256],119835:[[98],256],119836:[[99],256],119837:[[100],256],119838:[[101],256],119839:[[102],256],119840:[[103],256],119841:[[104],256],119842:[[105],256],119843:[[106],256],119844:[[107],256],119845:[[108],256],119846:[[109],256],119847:[[110],256],119848:[[111],256],119849:[[112],256],119850:[[113],256],119851:[[114],256],119852:[[115],256],119853:[[116],256],119854:[[117],256],119855:[[118],256],119856:[[119],256],119857:[[120],256],119858:[[121],256],119859:[[122],256],119860:[[65],256],119861:[[66],256],119862:[[67],256],119863:[[68],256],119864:[[69],256],119865:[[70],256],119866:[[71],256],119867:[[72],256],119868:[[73],256],119869:[[74],256],119870:[[75],256],119871:[[76],256],119872:[[77],256],119873:[[78],256],119874:[[79],256],119875:[[80],256],119876:[[81],256],119877:[[82],256],119878:[[83],256],119879:[[84],256],119880:[[85],256],119881:[[86],256],119882:[[87],256],119883:[[88],256],119884:[[89],256],119885:[[90],256],119886:[[97],256],119887:[[98],256],119888:[[99],256],119889:[[100],256],119890:[[101],256],119891:[[102],256],119892:[[103],256],119894:[[105],256],119895:[[106],256],119896:[[107],256],119897:[[108],256],119898:[[109],256],119899:[[110],256],119900:[[111],256],119901:[[112],256],119902:[[113],256],119903:[[114],256],119904:[[115],256],119905:[[116],256],119906:[[117],256],119907:[[118],256],119908:[[119],256],119909:[[120],256],119910:[[121],256],119911:[[122],256],119912:[[65],256],119913:[[66],256],119914:[[67],256],119915:[[68],256],119916:[[69],256],119917:[[70],256],119918:[[71],256],119919:[[72],256],119920:[[73],256],119921:[[74],256],119922:[[75],256],119923:[[76],256],119924:[[77],256],119925:[[78],256],119926:[[79],256],119927:[[80],256],119928:[[81],256],119929:[[82],256],119930:[[83],256],119931:[[84],256],119932:[[85],256],119933:[[86],256],119934:[[87],256],119935:[[88],256],119936:[[89],256],119937:[[90],256],119938:[[97],256],119939:[[98],256],119940:[[99],256],119941:[[100],256],119942:[[101],256],119943:[[102],256],119944:[[103],256],119945:[[104],256],119946:[[105],256],119947:[[106],256],119948:[[107],256],119949:[[108],256],119950:[[109],256],119951:[[110],256],119952:[[111],256],119953:[[112],256],119954:[[113],256],119955:[[114],256],119956:[[115],256],119957:[[116],256],119958:[[117],256],119959:[[118],256],119960:[[119],256],119961:[[120],256],119962:[[121],256],119963:[[122],256],119964:[[65],256],119966:[[67],256],119967:[[68],256],119970:[[71],256],119973:[[74],256],119974:[[75],256],119977:[[78],256],119978:[[79],256],119979:[[80],256],119980:[[81],256],119982:[[83],256],119983:[[84],256],119984:[[85],256],119985:[[86],256],119986:[[87],256],119987:[[88],256],119988:[[89],256],119989:[[90],256],119990:[[97],256],119991:[[98],256],119992:[[99],256],119993:[[100],256],119995:[[102],256],119997:[[104],256],119998:[[105],256],119999:[[106],256],120000:[[107],256],120001:[[108],256],120002:[[109],256],120003:[[110],256],120005:[[112],256],120006:[[113],256],120007:[[114],256],120008:[[115],256],120009:[[116],256],120010:[[117],256],120011:[[118],256],120012:[[119],256],120013:[[120],256],120014:[[121],256],120015:[[122],256],120016:[[65],256],120017:[[66],256],120018:[[67],256],120019:[[68],256],120020:[[69],256],120021:[[70],256],120022:[[71],256],120023:[[72],256],120024:[[73],256],120025:[[74],256],120026:[[75],256],120027:[[76],256],120028:[[77],256],120029:[[78],256],120030:[[79],256],120031:[[80],256],120032:[[81],256],120033:[[82],256],120034:[[83],256],120035:[[84],256],120036:[[85],256],120037:[[86],256],120038:[[87],256],120039:[[88],256],120040:[[89],256],120041:[[90],256],120042:[[97],256],120043:[[98],256],120044:[[99],256],120045:[[100],256],120046:[[101],256],120047:[[102],256],120048:[[103],256],120049:[[104],256],120050:[[105],256],120051:[[106],256],120052:[[107],256],120053:[[108],256],120054:[[109],256],120055:[[110],256],120056:[[111],256],120057:[[112],256],120058:[[113],256],120059:[[114],256],120060:[[115],256],120061:[[116],256],120062:[[117],256],120063:[[118],256]}, +54528:{120064:[[119],256],120065:[[120],256],120066:[[121],256],120067:[[122],256],120068:[[65],256],120069:[[66],256],120071:[[68],256],120072:[[69],256],120073:[[70],256],120074:[[71],256],120077:[[74],256],120078:[[75],256],120079:[[76],256],120080:[[77],256],120081:[[78],256],120082:[[79],256],120083:[[80],256],120084:[[81],256],120086:[[83],256],120087:[[84],256],120088:[[85],256],120089:[[86],256],120090:[[87],256],120091:[[88],256],120092:[[89],256],120094:[[97],256],120095:[[98],256],120096:[[99],256],120097:[[100],256],120098:[[101],256],120099:[[102],256],120100:[[103],256],120101:[[104],256],120102:[[105],256],120103:[[106],256],120104:[[107],256],120105:[[108],256],120106:[[109],256],120107:[[110],256],120108:[[111],256],120109:[[112],256],120110:[[113],256],120111:[[114],256],120112:[[115],256],120113:[[116],256],120114:[[117],256],120115:[[118],256],120116:[[119],256],120117:[[120],256],120118:[[121],256],120119:[[122],256],120120:[[65],256],120121:[[66],256],120123:[[68],256],120124:[[69],256],120125:[[70],256],120126:[[71],256],120128:[[73],256],120129:[[74],256],120130:[[75],256],120131:[[76],256],120132:[[77],256],120134:[[79],256],120138:[[83],256],120139:[[84],256],120140:[[85],256],120141:[[86],256],120142:[[87],256],120143:[[88],256],120144:[[89],256],120146:[[97],256],120147:[[98],256],120148:[[99],256],120149:[[100],256],120150:[[101],256],120151:[[102],256],120152:[[103],256],120153:[[104],256],120154:[[105],256],120155:[[106],256],120156:[[107],256],120157:[[108],256],120158:[[109],256],120159:[[110],256],120160:[[111],256],120161:[[112],256],120162:[[113],256],120163:[[114],256],120164:[[115],256],120165:[[116],256],120166:[[117],256],120167:[[118],256],120168:[[119],256],120169:[[120],256],120170:[[121],256],120171:[[122],256],120172:[[65],256],120173:[[66],256],120174:[[67],256],120175:[[68],256],120176:[[69],256],120177:[[70],256],120178:[[71],256],120179:[[72],256],120180:[[73],256],120181:[[74],256],120182:[[75],256],120183:[[76],256],120184:[[77],256],120185:[[78],256],120186:[[79],256],120187:[[80],256],120188:[[81],256],120189:[[82],256],120190:[[83],256],120191:[[84],256],120192:[[85],256],120193:[[86],256],120194:[[87],256],120195:[[88],256],120196:[[89],256],120197:[[90],256],120198:[[97],256],120199:[[98],256],120200:[[99],256],120201:[[100],256],120202:[[101],256],120203:[[102],256],120204:[[103],256],120205:[[104],256],120206:[[105],256],120207:[[106],256],120208:[[107],256],120209:[[108],256],120210:[[109],256],120211:[[110],256],120212:[[111],256],120213:[[112],256],120214:[[113],256],120215:[[114],256],120216:[[115],256],120217:[[116],256],120218:[[117],256],120219:[[118],256],120220:[[119],256],120221:[[120],256],120222:[[121],256],120223:[[122],256],120224:[[65],256],120225:[[66],256],120226:[[67],256],120227:[[68],256],120228:[[69],256],120229:[[70],256],120230:[[71],256],120231:[[72],256],120232:[[73],256],120233:[[74],256],120234:[[75],256],120235:[[76],256],120236:[[77],256],120237:[[78],256],120238:[[79],256],120239:[[80],256],120240:[[81],256],120241:[[82],256],120242:[[83],256],120243:[[84],256],120244:[[85],256],120245:[[86],256],120246:[[87],256],120247:[[88],256],120248:[[89],256],120249:[[90],256],120250:[[97],256],120251:[[98],256],120252:[[99],256],120253:[[100],256],120254:[[101],256],120255:[[102],256],120256:[[103],256],120257:[[104],256],120258:[[105],256],120259:[[106],256],120260:[[107],256],120261:[[108],256],120262:[[109],256],120263:[[110],256],120264:[[111],256],120265:[[112],256],120266:[[113],256],120267:[[114],256],120268:[[115],256],120269:[[116],256],120270:[[117],256],120271:[[118],256],120272:[[119],256],120273:[[120],256],120274:[[121],256],120275:[[122],256],120276:[[65],256],120277:[[66],256],120278:[[67],256],120279:[[68],256],120280:[[69],256],120281:[[70],256],120282:[[71],256],120283:[[72],256],120284:[[73],256],120285:[[74],256],120286:[[75],256],120287:[[76],256],120288:[[77],256],120289:[[78],256],120290:[[79],256],120291:[[80],256],120292:[[81],256],120293:[[82],256],120294:[[83],256],120295:[[84],256],120296:[[85],256],120297:[[86],256],120298:[[87],256],120299:[[88],256],120300:[[89],256],120301:[[90],256],120302:[[97],256],120303:[[98],256],120304:[[99],256],120305:[[100],256],120306:[[101],256],120307:[[102],256],120308:[[103],256],120309:[[104],256],120310:[[105],256],120311:[[106],256],120312:[[107],256],120313:[[108],256],120314:[[109],256],120315:[[110],256],120316:[[111],256],120317:[[112],256],120318:[[113],256],120319:[[114],256]}, +54784:{120320:[[115],256],120321:[[116],256],120322:[[117],256],120323:[[118],256],120324:[[119],256],120325:[[120],256],120326:[[121],256],120327:[[122],256],120328:[[65],256],120329:[[66],256],120330:[[67],256],120331:[[68],256],120332:[[69],256],120333:[[70],256],120334:[[71],256],120335:[[72],256],120336:[[73],256],120337:[[74],256],120338:[[75],256],120339:[[76],256],120340:[[77],256],120341:[[78],256],120342:[[79],256],120343:[[80],256],120344:[[81],256],120345:[[82],256],120346:[[83],256],120347:[[84],256],120348:[[85],256],120349:[[86],256],120350:[[87],256],120351:[[88],256],120352:[[89],256],120353:[[90],256],120354:[[97],256],120355:[[98],256],120356:[[99],256],120357:[[100],256],120358:[[101],256],120359:[[102],256],120360:[[103],256],120361:[[104],256],120362:[[105],256],120363:[[106],256],120364:[[107],256],120365:[[108],256],120366:[[109],256],120367:[[110],256],120368:[[111],256],120369:[[112],256],120370:[[113],256],120371:[[114],256],120372:[[115],256],120373:[[116],256],120374:[[117],256],120375:[[118],256],120376:[[119],256],120377:[[120],256],120378:[[121],256],120379:[[122],256],120380:[[65],256],120381:[[66],256],120382:[[67],256],120383:[[68],256],120384:[[69],256],120385:[[70],256],120386:[[71],256],120387:[[72],256],120388:[[73],256],120389:[[74],256],120390:[[75],256],120391:[[76],256],120392:[[77],256],120393:[[78],256],120394:[[79],256],120395:[[80],256],120396:[[81],256],120397:[[82],256],120398:[[83],256],120399:[[84],256],120400:[[85],256],120401:[[86],256],120402:[[87],256],120403:[[88],256],120404:[[89],256],120405:[[90],256],120406:[[97],256],120407:[[98],256],120408:[[99],256],120409:[[100],256],120410:[[101],256],120411:[[102],256],120412:[[103],256],120413:[[104],256],120414:[[105],256],120415:[[106],256],120416:[[107],256],120417:[[108],256],120418:[[109],256],120419:[[110],256],120420:[[111],256],120421:[[112],256],120422:[[113],256],120423:[[114],256],120424:[[115],256],120425:[[116],256],120426:[[117],256],120427:[[118],256],120428:[[119],256],120429:[[120],256],120430:[[121],256],120431:[[122],256],120432:[[65],256],120433:[[66],256],120434:[[67],256],120435:[[68],256],120436:[[69],256],120437:[[70],256],120438:[[71],256],120439:[[72],256],120440:[[73],256],120441:[[74],256],120442:[[75],256],120443:[[76],256],120444:[[77],256],120445:[[78],256],120446:[[79],256],120447:[[80],256],120448:[[81],256],120449:[[82],256],120450:[[83],256],120451:[[84],256],120452:[[85],256],120453:[[86],256],120454:[[87],256],120455:[[88],256],120456:[[89],256],120457:[[90],256],120458:[[97],256],120459:[[98],256],120460:[[99],256],120461:[[100],256],120462:[[101],256],120463:[[102],256],120464:[[103],256],120465:[[104],256],120466:[[105],256],120467:[[106],256],120468:[[107],256],120469:[[108],256],120470:[[109],256],120471:[[110],256],120472:[[111],256],120473:[[112],256],120474:[[113],256],120475:[[114],256],120476:[[115],256],120477:[[116],256],120478:[[117],256],120479:[[118],256],120480:[[119],256],120481:[[120],256],120482:[[121],256],120483:[[122],256],120484:[[305],256],120485:[[567],256],120488:[[913],256],120489:[[914],256],120490:[[915],256],120491:[[916],256],120492:[[917],256],120493:[[918],256],120494:[[919],256],120495:[[920],256],120496:[[921],256],120497:[[922],256],120498:[[923],256],120499:[[924],256],120500:[[925],256],120501:[[926],256],120502:[[927],256],120503:[[928],256],120504:[[929],256],120505:[[1012],256],120506:[[931],256],120507:[[932],256],120508:[[933],256],120509:[[934],256],120510:[[935],256],120511:[[936],256],120512:[[937],256],120513:[[8711],256],120514:[[945],256],120515:[[946],256],120516:[[947],256],120517:[[948],256],120518:[[949],256],120519:[[950],256],120520:[[951],256],120521:[[952],256],120522:[[953],256],120523:[[954],256],120524:[[955],256],120525:[[956],256],120526:[[957],256],120527:[[958],256],120528:[[959],256],120529:[[960],256],120530:[[961],256],120531:[[962],256],120532:[[963],256],120533:[[964],256],120534:[[965],256],120535:[[966],256],120536:[[967],256],120537:[[968],256],120538:[[969],256],120539:[[8706],256],120540:[[1013],256],120541:[[977],256],120542:[[1008],256],120543:[[981],256],120544:[[1009],256],120545:[[982],256],120546:[[913],256],120547:[[914],256],120548:[[915],256],120549:[[916],256],120550:[[917],256],120551:[[918],256],120552:[[919],256],120553:[[920],256],120554:[[921],256],120555:[[922],256],120556:[[923],256],120557:[[924],256],120558:[[925],256],120559:[[926],256],120560:[[927],256],120561:[[928],256],120562:[[929],256],120563:[[1012],256],120564:[[931],256],120565:[[932],256],120566:[[933],256],120567:[[934],256],120568:[[935],256],120569:[[936],256],120570:[[937],256],120571:[[8711],256],120572:[[945],256],120573:[[946],256],120574:[[947],256],120575:[[948],256]}, +55040:{120576:[[949],256],120577:[[950],256],120578:[[951],256],120579:[[952],256],120580:[[953],256],120581:[[954],256],120582:[[955],256],120583:[[956],256],120584:[[957],256],120585:[[958],256],120586:[[959],256],120587:[[960],256],120588:[[961],256],120589:[[962],256],120590:[[963],256],120591:[[964],256],120592:[[965],256],120593:[[966],256],120594:[[967],256],120595:[[968],256],120596:[[969],256],120597:[[8706],256],120598:[[1013],256],120599:[[977],256],120600:[[1008],256],120601:[[981],256],120602:[[1009],256],120603:[[982],256],120604:[[913],256],120605:[[914],256],120606:[[915],256],120607:[[916],256],120608:[[917],256],120609:[[918],256],120610:[[919],256],120611:[[920],256],120612:[[921],256],120613:[[922],256],120614:[[923],256],120615:[[924],256],120616:[[925],256],120617:[[926],256],120618:[[927],256],120619:[[928],256],120620:[[929],256],120621:[[1012],256],120622:[[931],256],120623:[[932],256],120624:[[933],256],120625:[[934],256],120626:[[935],256],120627:[[936],256],120628:[[937],256],120629:[[8711],256],120630:[[945],256],120631:[[946],256],120632:[[947],256],120633:[[948],256],120634:[[949],256],120635:[[950],256],120636:[[951],256],120637:[[952],256],120638:[[953],256],120639:[[954],256],120640:[[955],256],120641:[[956],256],120642:[[957],256],120643:[[958],256],120644:[[959],256],120645:[[960],256],120646:[[961],256],120647:[[962],256],120648:[[963],256],120649:[[964],256],120650:[[965],256],120651:[[966],256],120652:[[967],256],120653:[[968],256],120654:[[969],256],120655:[[8706],256],120656:[[1013],256],120657:[[977],256],120658:[[1008],256],120659:[[981],256],120660:[[1009],256],120661:[[982],256],120662:[[913],256],120663:[[914],256],120664:[[915],256],120665:[[916],256],120666:[[917],256],120667:[[918],256],120668:[[919],256],120669:[[920],256],120670:[[921],256],120671:[[922],256],120672:[[923],256],120673:[[924],256],120674:[[925],256],120675:[[926],256],120676:[[927],256],120677:[[928],256],120678:[[929],256],120679:[[1012],256],120680:[[931],256],120681:[[932],256],120682:[[933],256],120683:[[934],256],120684:[[935],256],120685:[[936],256],120686:[[937],256],120687:[[8711],256],120688:[[945],256],120689:[[946],256],120690:[[947],256],120691:[[948],256],120692:[[949],256],120693:[[950],256],120694:[[951],256],120695:[[952],256],120696:[[953],256],120697:[[954],256],120698:[[955],256],120699:[[956],256],120700:[[957],256],120701:[[958],256],120702:[[959],256],120703:[[960],256],120704:[[961],256],120705:[[962],256],120706:[[963],256],120707:[[964],256],120708:[[965],256],120709:[[966],256],120710:[[967],256],120711:[[968],256],120712:[[969],256],120713:[[8706],256],120714:[[1013],256],120715:[[977],256],120716:[[1008],256],120717:[[981],256],120718:[[1009],256],120719:[[982],256],120720:[[913],256],120721:[[914],256],120722:[[915],256],120723:[[916],256],120724:[[917],256],120725:[[918],256],120726:[[919],256],120727:[[920],256],120728:[[921],256],120729:[[922],256],120730:[[923],256],120731:[[924],256],120732:[[925],256],120733:[[926],256],120734:[[927],256],120735:[[928],256],120736:[[929],256],120737:[[1012],256],120738:[[931],256],120739:[[932],256],120740:[[933],256],120741:[[934],256],120742:[[935],256],120743:[[936],256],120744:[[937],256],120745:[[8711],256],120746:[[945],256],120747:[[946],256],120748:[[947],256],120749:[[948],256],120750:[[949],256],120751:[[950],256],120752:[[951],256],120753:[[952],256],120754:[[953],256],120755:[[954],256],120756:[[955],256],120757:[[956],256],120758:[[957],256],120759:[[958],256],120760:[[959],256],120761:[[960],256],120762:[[961],256],120763:[[962],256],120764:[[963],256],120765:[[964],256],120766:[[965],256],120767:[[966],256],120768:[[967],256],120769:[[968],256],120770:[[969],256],120771:[[8706],256],120772:[[1013],256],120773:[[977],256],120774:[[1008],256],120775:[[981],256],120776:[[1009],256],120777:[[982],256],120778:[[988],256],120779:[[989],256],120782:[[48],256],120783:[[49],256],120784:[[50],256],120785:[[51],256],120786:[[52],256],120787:[[53],256],120788:[[54],256],120789:[[55],256],120790:[[56],256],120791:[[57],256],120792:[[48],256],120793:[[49],256],120794:[[50],256],120795:[[51],256],120796:[[52],256],120797:[[53],256],120798:[[54],256],120799:[[55],256],120800:[[56],256],120801:[[57],256],120802:[[48],256],120803:[[49],256],120804:[[50],256],120805:[[51],256],120806:[[52],256],120807:[[53],256],120808:[[54],256],120809:[[55],256],120810:[[56],256],120811:[[57],256],120812:[[48],256],120813:[[49],256],120814:[[50],256],120815:[[51],256],120816:[[52],256],120817:[[53],256],120818:[[54],256],120819:[[55],256],120820:[[56],256],120821:[[57],256],120822:[[48],256],120823:[[49],256],120824:[[50],256],120825:[[51],256],120826:[[52],256],120827:[[53],256],120828:[[54],256],120829:[[55],256],120830:[[56],256],120831:[[57],256]}, +59392:{125136:[,220],125137:[,220],125138:[,220],125139:[,220],125140:[,220],125141:[,220],125142:[,220]}, +60928:{126464:[[1575],256],126465:[[1576],256],126466:[[1580],256],126467:[[1583],256],126469:[[1608],256],126470:[[1586],256],126471:[[1581],256],126472:[[1591],256],126473:[[1610],256],126474:[[1603],256],126475:[[1604],256],126476:[[1605],256],126477:[[1606],256],126478:[[1587],256],126479:[[1593],256],126480:[[1601],256],126481:[[1589],256],126482:[[1602],256],126483:[[1585],256],126484:[[1588],256],126485:[[1578],256],126486:[[1579],256],126487:[[1582],256],126488:[[1584],256],126489:[[1590],256],126490:[[1592],256],126491:[[1594],256],126492:[[1646],256],126493:[[1722],256],126494:[[1697],256],126495:[[1647],256],126497:[[1576],256],126498:[[1580],256],126500:[[1607],256],126503:[[1581],256],126505:[[1610],256],126506:[[1603],256],126507:[[1604],256],126508:[[1605],256],126509:[[1606],256],126510:[[1587],256],126511:[[1593],256],126512:[[1601],256],126513:[[1589],256],126514:[[1602],256],126516:[[1588],256],126517:[[1578],256],126518:[[1579],256],126519:[[1582],256],126521:[[1590],256],126523:[[1594],256],126530:[[1580],256],126535:[[1581],256],126537:[[1610],256],126539:[[1604],256],126541:[[1606],256],126542:[[1587],256],126543:[[1593],256],126545:[[1589],256],126546:[[1602],256],126548:[[1588],256],126551:[[1582],256],126553:[[1590],256],126555:[[1594],256],126557:[[1722],256],126559:[[1647],256],126561:[[1576],256],126562:[[1580],256],126564:[[1607],256],126567:[[1581],256],126568:[[1591],256],126569:[[1610],256],126570:[[1603],256],126572:[[1605],256],126573:[[1606],256],126574:[[1587],256],126575:[[1593],256],126576:[[1601],256],126577:[[1589],256],126578:[[1602],256],126580:[[1588],256],126581:[[1578],256],126582:[[1579],256],126583:[[1582],256],126585:[[1590],256],126586:[[1592],256],126587:[[1594],256],126588:[[1646],256],126590:[[1697],256],126592:[[1575],256],126593:[[1576],256],126594:[[1580],256],126595:[[1583],256],126596:[[1607],256],126597:[[1608],256],126598:[[1586],256],126599:[[1581],256],126600:[[1591],256],126601:[[1610],256],126603:[[1604],256],126604:[[1605],256],126605:[[1606],256],126606:[[1587],256],126607:[[1593],256],126608:[[1601],256],126609:[[1589],256],126610:[[1602],256],126611:[[1585],256],126612:[[1588],256],126613:[[1578],256],126614:[[1579],256],126615:[[1582],256],126616:[[1584],256],126617:[[1590],256],126618:[[1592],256],126619:[[1594],256],126625:[[1576],256],126626:[[1580],256],126627:[[1583],256],126629:[[1608],256],126630:[[1586],256],126631:[[1581],256],126632:[[1591],256],126633:[[1610],256],126635:[[1604],256],126636:[[1605],256],126637:[[1606],256],126638:[[1587],256],126639:[[1593],256],126640:[[1601],256],126641:[[1589],256],126642:[[1602],256],126643:[[1585],256],126644:[[1588],256],126645:[[1578],256],126646:[[1579],256],126647:[[1582],256],126648:[[1584],256],126649:[[1590],256],126650:[[1592],256],126651:[[1594],256]}, +61696:{127232:[[48,46],256],127233:[[48,44],256],127234:[[49,44],256],127235:[[50,44],256],127236:[[51,44],256],127237:[[52,44],256],127238:[[53,44],256],127239:[[54,44],256],127240:[[55,44],256],127241:[[56,44],256],127242:[[57,44],256],127248:[[40,65,41],256],127249:[[40,66,41],256],127250:[[40,67,41],256],127251:[[40,68,41],256],127252:[[40,69,41],256],127253:[[40,70,41],256],127254:[[40,71,41],256],127255:[[40,72,41],256],127256:[[40,73,41],256],127257:[[40,74,41],256],127258:[[40,75,41],256],127259:[[40,76,41],256],127260:[[40,77,41],256],127261:[[40,78,41],256],127262:[[40,79,41],256],127263:[[40,80,41],256],127264:[[40,81,41],256],127265:[[40,82,41],256],127266:[[40,83,41],256],127267:[[40,84,41],256],127268:[[40,85,41],256],127269:[[40,86,41],256],127270:[[40,87,41],256],127271:[[40,88,41],256],127272:[[40,89,41],256],127273:[[40,90,41],256],127274:[[12308,83,12309],256],127275:[[67],256],127276:[[82],256],127277:[[67,68],256],127278:[[87,90],256],127280:[[65],256],127281:[[66],256],127282:[[67],256],127283:[[68],256],127284:[[69],256],127285:[[70],256],127286:[[71],256],127287:[[72],256],127288:[[73],256],127289:[[74],256],127290:[[75],256],127291:[[76],256],127292:[[77],256],127293:[[78],256],127294:[[79],256],127295:[[80],256],127296:[[81],256],127297:[[82],256],127298:[[83],256],127299:[[84],256],127300:[[85],256],127301:[[86],256],127302:[[87],256],127303:[[88],256],127304:[[89],256],127305:[[90],256],127306:[[72,86],256],127307:[[77,86],256],127308:[[83,68],256],127309:[[83,83],256],127310:[[80,80,86],256],127311:[[87,67],256],127338:[[77,67],256],127339:[[77,68],256],127376:[[68,74],256]}, +61952:{127488:[[12411,12363],256],127489:[[12467,12467],256],127490:[[12469],256],127504:[[25163],256],127505:[[23383],256],127506:[[21452],256],127507:[[12487],256],127508:[[20108],256],127509:[[22810],256],127510:[[35299],256],127511:[[22825],256],127512:[[20132],256],127513:[[26144],256],127514:[[28961],256],127515:[[26009],256],127516:[[21069],256],127517:[[24460],256],127518:[[20877],256],127519:[[26032],256],127520:[[21021],256],127521:[[32066],256],127522:[[29983],256],127523:[[36009],256],127524:[[22768],256],127525:[[21561],256],127526:[[28436],256],127527:[[25237],256],127528:[[25429],256],127529:[[19968],256],127530:[[19977],256],127531:[[36938],256],127532:[[24038],256],127533:[[20013],256],127534:[[21491],256],127535:[[25351],256],127536:[[36208],256],127537:[[25171],256],127538:[[31105],256],127539:[[31354],256],127540:[[21512],256],127541:[[28288],256],127542:[[26377],256],127543:[[26376],256],127544:[[30003],256],127545:[[21106],256],127546:[[21942],256],127552:[[12308,26412,12309],256],127553:[[12308,19977,12309],256],127554:[[12308,20108,12309],256],127555:[[12308,23433,12309],256],127556:[[12308,28857,12309],256],127557:[[12308,25171,12309],256],127558:[[12308,30423,12309],256],127559:[[12308,21213,12309],256],127560:[[12308,25943,12309],256],127568:[[24471],256],127569:[[21487],256]}, +63488:{194560:[[20029]],194561:[[20024]],194562:[[20033]],194563:[[131362]],194564:[[20320]],194565:[[20398]],194566:[[20411]],194567:[[20482]],194568:[[20602]],194569:[[20633]],194570:[[20711]],194571:[[20687]],194572:[[13470]],194573:[[132666]],194574:[[20813]],194575:[[20820]],194576:[[20836]],194577:[[20855]],194578:[[132380]],194579:[[13497]],194580:[[20839]],194581:[[20877]],194582:[[132427]],194583:[[20887]],194584:[[20900]],194585:[[20172]],194586:[[20908]],194587:[[20917]],194588:[[168415]],194589:[[20981]],194590:[[20995]],194591:[[13535]],194592:[[21051]],194593:[[21062]],194594:[[21106]],194595:[[21111]],194596:[[13589]],194597:[[21191]],194598:[[21193]],194599:[[21220]],194600:[[21242]],194601:[[21253]],194602:[[21254]],194603:[[21271]],194604:[[21321]],194605:[[21329]],194606:[[21338]],194607:[[21363]],194608:[[21373]],194609:[[21375]],194610:[[21375]],194611:[[21375]],194612:[[133676]],194613:[[28784]],194614:[[21450]],194615:[[21471]],194616:[[133987]],194617:[[21483]],194618:[[21489]],194619:[[21510]],194620:[[21662]],194621:[[21560]],194622:[[21576]],194623:[[21608]],194624:[[21666]],194625:[[21750]],194626:[[21776]],194627:[[21843]],194628:[[21859]],194629:[[21892]],194630:[[21892]],194631:[[21913]],194632:[[21931]],194633:[[21939]],194634:[[21954]],194635:[[22294]],194636:[[22022]],194637:[[22295]],194638:[[22097]],194639:[[22132]],194640:[[20999]],194641:[[22766]],194642:[[22478]],194643:[[22516]],194644:[[22541]],194645:[[22411]],194646:[[22578]],194647:[[22577]],194648:[[22700]],194649:[[136420]],194650:[[22770]],194651:[[22775]],194652:[[22790]],194653:[[22810]],194654:[[22818]],194655:[[22882]],194656:[[136872]],194657:[[136938]],194658:[[23020]],194659:[[23067]],194660:[[23079]],194661:[[23000]],194662:[[23142]],194663:[[14062]],194664:[[14076]],194665:[[23304]],194666:[[23358]],194667:[[23358]],194668:[[137672]],194669:[[23491]],194670:[[23512]],194671:[[23527]],194672:[[23539]],194673:[[138008]],194674:[[23551]],194675:[[23558]],194676:[[24403]],194677:[[23586]],194678:[[14209]],194679:[[23648]],194680:[[23662]],194681:[[23744]],194682:[[23693]],194683:[[138724]],194684:[[23875]],194685:[[138726]],194686:[[23918]],194687:[[23915]],194688:[[23932]],194689:[[24033]],194690:[[24034]],194691:[[14383]],194692:[[24061]],194693:[[24104]],194694:[[24125]],194695:[[24169]],194696:[[14434]],194697:[[139651]],194698:[[14460]],194699:[[24240]],194700:[[24243]],194701:[[24246]],194702:[[24266]],194703:[[172946]],194704:[[24318]],194705:[[140081]],194706:[[140081]],194707:[[33281]],194708:[[24354]],194709:[[24354]],194710:[[14535]],194711:[[144056]],194712:[[156122]],194713:[[24418]],194714:[[24427]],194715:[[14563]],194716:[[24474]],194717:[[24525]],194718:[[24535]],194719:[[24569]],194720:[[24705]],194721:[[14650]],194722:[[14620]],194723:[[24724]],194724:[[141012]],194725:[[24775]],194726:[[24904]],194727:[[24908]],194728:[[24910]],194729:[[24908]],194730:[[24954]],194731:[[24974]],194732:[[25010]],194733:[[24996]],194734:[[25007]],194735:[[25054]],194736:[[25074]],194737:[[25078]],194738:[[25104]],194739:[[25115]],194740:[[25181]],194741:[[25265]],194742:[[25300]],194743:[[25424]],194744:[[142092]],194745:[[25405]],194746:[[25340]],194747:[[25448]],194748:[[25475]],194749:[[25572]],194750:[[142321]],194751:[[25634]],194752:[[25541]],194753:[[25513]],194754:[[14894]],194755:[[25705]],194756:[[25726]],194757:[[25757]],194758:[[25719]],194759:[[14956]],194760:[[25935]],194761:[[25964]],194762:[[143370]],194763:[[26083]],194764:[[26360]],194765:[[26185]],194766:[[15129]],194767:[[26257]],194768:[[15112]],194769:[[15076]],194770:[[20882]],194771:[[20885]],194772:[[26368]],194773:[[26268]],194774:[[32941]],194775:[[17369]],194776:[[26391]],194777:[[26395]],194778:[[26401]],194779:[[26462]],194780:[[26451]],194781:[[144323]],194782:[[15177]],194783:[[26618]],194784:[[26501]],194785:[[26706]],194786:[[26757]],194787:[[144493]],194788:[[26766]],194789:[[26655]],194790:[[26900]],194791:[[15261]],194792:[[26946]],194793:[[27043]],194794:[[27114]],194795:[[27304]],194796:[[145059]],194797:[[27355]],194798:[[15384]],194799:[[27425]],194800:[[145575]],194801:[[27476]],194802:[[15438]],194803:[[27506]],194804:[[27551]],194805:[[27578]],194806:[[27579]],194807:[[146061]],194808:[[138507]],194809:[[146170]],194810:[[27726]],194811:[[146620]],194812:[[27839]],194813:[[27853]],194814:[[27751]],194815:[[27926]]}, +63744:{63744:[[35912]],63745:[[26356]],63746:[[36554]],63747:[[36040]],63748:[[28369]],63749:[[20018]],63750:[[21477]],63751:[[40860]],63752:[[40860]],63753:[[22865]],63754:[[37329]],63755:[[21895]],63756:[[22856]],63757:[[25078]],63758:[[30313]],63759:[[32645]],63760:[[34367]],63761:[[34746]],63762:[[35064]],63763:[[37007]],63764:[[27138]],63765:[[27931]],63766:[[28889]],63767:[[29662]],63768:[[33853]],63769:[[37226]],63770:[[39409]],63771:[[20098]],63772:[[21365]],63773:[[27396]],63774:[[29211]],63775:[[34349]],63776:[[40478]],63777:[[23888]],63778:[[28651]],63779:[[34253]],63780:[[35172]],63781:[[25289]],63782:[[33240]],63783:[[34847]],63784:[[24266]],63785:[[26391]],63786:[[28010]],63787:[[29436]],63788:[[37070]],63789:[[20358]],63790:[[20919]],63791:[[21214]],63792:[[25796]],63793:[[27347]],63794:[[29200]],63795:[[30439]],63796:[[32769]],63797:[[34310]],63798:[[34396]],63799:[[36335]],63800:[[38706]],63801:[[39791]],63802:[[40442]],63803:[[30860]],63804:[[31103]],63805:[[32160]],63806:[[33737]],63807:[[37636]],63808:[[40575]],63809:[[35542]],63810:[[22751]],63811:[[24324]],63812:[[31840]],63813:[[32894]],63814:[[29282]],63815:[[30922]],63816:[[36034]],63817:[[38647]],63818:[[22744]],63819:[[23650]],63820:[[27155]],63821:[[28122]],63822:[[28431]],63823:[[32047]],63824:[[32311]],63825:[[38475]],63826:[[21202]],63827:[[32907]],63828:[[20956]],63829:[[20940]],63830:[[31260]],63831:[[32190]],63832:[[33777]],63833:[[38517]],63834:[[35712]],63835:[[25295]],63836:[[27138]],63837:[[35582]],63838:[[20025]],63839:[[23527]],63840:[[24594]],63841:[[29575]],63842:[[30064]],63843:[[21271]],63844:[[30971]],63845:[[20415]],63846:[[24489]],63847:[[19981]],63848:[[27852]],63849:[[25976]],63850:[[32034]],63851:[[21443]],63852:[[22622]],63853:[[30465]],63854:[[33865]],63855:[[35498]],63856:[[27578]],63857:[[36784]],63858:[[27784]],63859:[[25342]],63860:[[33509]],63861:[[25504]],63862:[[30053]],63863:[[20142]],63864:[[20841]],63865:[[20937]],63866:[[26753]],63867:[[31975]],63868:[[33391]],63869:[[35538]],63870:[[37327]],63871:[[21237]],63872:[[21570]],63873:[[22899]],63874:[[24300]],63875:[[26053]],63876:[[28670]],63877:[[31018]],63878:[[38317]],63879:[[39530]],63880:[[40599]],63881:[[40654]],63882:[[21147]],63883:[[26310]],63884:[[27511]],63885:[[36706]],63886:[[24180]],63887:[[24976]],63888:[[25088]],63889:[[25754]],63890:[[28451]],63891:[[29001]],63892:[[29833]],63893:[[31178]],63894:[[32244]],63895:[[32879]],63896:[[36646]],63897:[[34030]],63898:[[36899]],63899:[[37706]],63900:[[21015]],63901:[[21155]],63902:[[21693]],63903:[[28872]],63904:[[35010]],63905:[[35498]],63906:[[24265]],63907:[[24565]],63908:[[25467]],63909:[[27566]],63910:[[31806]],63911:[[29557]],63912:[[20196]],63913:[[22265]],63914:[[23527]],63915:[[23994]],63916:[[24604]],63917:[[29618]],63918:[[29801]],63919:[[32666]],63920:[[32838]],63921:[[37428]],63922:[[38646]],63923:[[38728]],63924:[[38936]],63925:[[20363]],63926:[[31150]],63927:[[37300]],63928:[[38584]],63929:[[24801]],63930:[[20102]],63931:[[20698]],63932:[[23534]],63933:[[23615]],63934:[[26009]],63935:[[27138]],63936:[[29134]],63937:[[30274]],63938:[[34044]],63939:[[36988]],63940:[[40845]],63941:[[26248]],63942:[[38446]],63943:[[21129]],63944:[[26491]],63945:[[26611]],63946:[[27969]],63947:[[28316]],63948:[[29705]],63949:[[30041]],63950:[[30827]],63951:[[32016]],63952:[[39006]],63953:[[20845]],63954:[[25134]],63955:[[38520]],63956:[[20523]],63957:[[23833]],63958:[[28138]],63959:[[36650]],63960:[[24459]],63961:[[24900]],63962:[[26647]],63963:[[29575]],63964:[[38534]],63965:[[21033]],63966:[[21519]],63967:[[23653]],63968:[[26131]],63969:[[26446]],63970:[[26792]],63971:[[27877]],63972:[[29702]],63973:[[30178]],63974:[[32633]],63975:[[35023]],63976:[[35041]],63977:[[37324]],63978:[[38626]],63979:[[21311]],63980:[[28346]],63981:[[21533]],63982:[[29136]],63983:[[29848]],63984:[[34298]],63985:[[38563]],63986:[[40023]],63987:[[40607]],63988:[[26519]],63989:[[28107]],63990:[[33256]],63991:[[31435]],63992:[[31520]],63993:[[31890]],63994:[[29376]],63995:[[28825]],63996:[[35672]],63997:[[20160]],63998:[[33590]],63999:[[21050]],194816:[[27966]],194817:[[28023]],194818:[[27969]],194819:[[28009]],194820:[[28024]],194821:[[28037]],194822:[[146718]],194823:[[27956]],194824:[[28207]],194825:[[28270]],194826:[[15667]],194827:[[28363]],194828:[[28359]],194829:[[147153]],194830:[[28153]],194831:[[28526]],194832:[[147294]],194833:[[147342]],194834:[[28614]],194835:[[28729]],194836:[[28702]],194837:[[28699]],194838:[[15766]],194839:[[28746]],194840:[[28797]],194841:[[28791]],194842:[[28845]],194843:[[132389]],194844:[[28997]],194845:[[148067]],194846:[[29084]],194847:[[148395]],194848:[[29224]],194849:[[29237]],194850:[[29264]],194851:[[149000]],194852:[[29312]],194853:[[29333]],194854:[[149301]],194855:[[149524]],194856:[[29562]],194857:[[29579]],194858:[[16044]],194859:[[29605]],194860:[[16056]],194861:[[16056]],194862:[[29767]],194863:[[29788]],194864:[[29809]],194865:[[29829]],194866:[[29898]],194867:[[16155]],194868:[[29988]],194869:[[150582]],194870:[[30014]],194871:[[150674]],194872:[[30064]],194873:[[139679]],194874:[[30224]],194875:[[151457]],194876:[[151480]],194877:[[151620]],194878:[[16380]],194879:[[16392]],194880:[[30452]],194881:[[151795]],194882:[[151794]],194883:[[151833]],194884:[[151859]],194885:[[30494]],194886:[[30495]],194887:[[30495]],194888:[[30538]],194889:[[16441]],194890:[[30603]],194891:[[16454]],194892:[[16534]],194893:[[152605]],194894:[[30798]],194895:[[30860]],194896:[[30924]],194897:[[16611]],194898:[[153126]],194899:[[31062]],194900:[[153242]],194901:[[153285]],194902:[[31119]],194903:[[31211]],194904:[[16687]],194905:[[31296]],194906:[[31306]],194907:[[31311]],194908:[[153980]],194909:[[154279]],194910:[[154279]],194911:[[31470]],194912:[[16898]],194913:[[154539]],194914:[[31686]],194915:[[31689]],194916:[[16935]],194917:[[154752]],194918:[[31954]],194919:[[17056]],194920:[[31976]],194921:[[31971]],194922:[[32000]],194923:[[155526]],194924:[[32099]],194925:[[17153]],194926:[[32199]],194927:[[32258]],194928:[[32325]],194929:[[17204]],194930:[[156200]],194931:[[156231]],194932:[[17241]],194933:[[156377]],194934:[[32634]],194935:[[156478]],194936:[[32661]],194937:[[32762]],194938:[[32773]],194939:[[156890]],194940:[[156963]],194941:[[32864]],194942:[[157096]],194943:[[32880]],194944:[[144223]],194945:[[17365]],194946:[[32946]],194947:[[33027]],194948:[[17419]],194949:[[33086]],194950:[[23221]],194951:[[157607]],194952:[[157621]],194953:[[144275]],194954:[[144284]],194955:[[33281]],194956:[[33284]],194957:[[36766]],194958:[[17515]],194959:[[33425]],194960:[[33419]],194961:[[33437]],194962:[[21171]],194963:[[33457]],194964:[[33459]],194965:[[33469]],194966:[[33510]],194967:[[158524]],194968:[[33509]],194969:[[33565]],194970:[[33635]],194971:[[33709]],194972:[[33571]],194973:[[33725]],194974:[[33767]],194975:[[33879]],194976:[[33619]],194977:[[33738]],194978:[[33740]],194979:[[33756]],194980:[[158774]],194981:[[159083]],194982:[[158933]],194983:[[17707]],194984:[[34033]],194985:[[34035]],194986:[[34070]],194987:[[160714]],194988:[[34148]],194989:[[159532]],194990:[[17757]],194991:[[17761]],194992:[[159665]],194993:[[159954]],194994:[[17771]],194995:[[34384]],194996:[[34396]],194997:[[34407]],194998:[[34409]],194999:[[34473]],195000:[[34440]],195001:[[34574]],195002:[[34530]],195003:[[34681]],195004:[[34600]],195005:[[34667]],195006:[[34694]],195007:[[17879]],195008:[[34785]],195009:[[34817]],195010:[[17913]],195011:[[34912]],195012:[[34915]],195013:[[161383]],195014:[[35031]],195015:[[35038]],195016:[[17973]],195017:[[35066]],195018:[[13499]],195019:[[161966]],195020:[[162150]],195021:[[18110]],195022:[[18119]],195023:[[35488]],195024:[[35565]],195025:[[35722]],195026:[[35925]],195027:[[162984]],195028:[[36011]],195029:[[36033]],195030:[[36123]],195031:[[36215]],195032:[[163631]],195033:[[133124]],195034:[[36299]],195035:[[36284]],195036:[[36336]],195037:[[133342]],195038:[[36564]],195039:[[36664]],195040:[[165330]],195041:[[165357]],195042:[[37012]],195043:[[37105]],195044:[[37137]],195045:[[165678]],195046:[[37147]],195047:[[37432]],195048:[[37591]],195049:[[37592]],195050:[[37500]],195051:[[37881]],195052:[[37909]],195053:[[166906]],195054:[[38283]],195055:[[18837]],195056:[[38327]],195057:[[167287]],195058:[[18918]],195059:[[38595]],195060:[[23986]],195061:[[38691]],195062:[[168261]],195063:[[168474]],195064:[[19054]],195065:[[19062]],195066:[[38880]],195067:[[168970]],195068:[[19122]],195069:[[169110]],195070:[[38923]],195071:[[38923]]}, +64000:{64000:[[20999]],64001:[[24230]],64002:[[25299]],64003:[[31958]],64004:[[23429]],64005:[[27934]],64006:[[26292]],64007:[[36667]],64008:[[34892]],64009:[[38477]],64010:[[35211]],64011:[[24275]],64012:[[20800]],64013:[[21952]],64016:[[22618]],64018:[[26228]],64021:[[20958]],64022:[[29482]],64023:[[30410]],64024:[[31036]],64025:[[31070]],64026:[[31077]],64027:[[31119]],64028:[[38742]],64029:[[31934]],64030:[[32701]],64032:[[34322]],64034:[[35576]],64037:[[36920]],64038:[[37117]],64042:[[39151]],64043:[[39164]],64044:[[39208]],64045:[[40372]],64046:[[37086]],64047:[[38583]],64048:[[20398]],64049:[[20711]],64050:[[20813]],64051:[[21193]],64052:[[21220]],64053:[[21329]],64054:[[21917]],64055:[[22022]],64056:[[22120]],64057:[[22592]],64058:[[22696]],64059:[[23652]],64060:[[23662]],64061:[[24724]],64062:[[24936]],64063:[[24974]],64064:[[25074]],64065:[[25935]],64066:[[26082]],64067:[[26257]],64068:[[26757]],64069:[[28023]],64070:[[28186]],64071:[[28450]],64072:[[29038]],64073:[[29227]],64074:[[29730]],64075:[[30865]],64076:[[31038]],64077:[[31049]],64078:[[31048]],64079:[[31056]],64080:[[31062]],64081:[[31069]],64082:[[31117]],64083:[[31118]],64084:[[31296]],64085:[[31361]],64086:[[31680]],64087:[[32244]],64088:[[32265]],64089:[[32321]],64090:[[32626]],64091:[[32773]],64092:[[33261]],64093:[[33401]],64094:[[33401]],64095:[[33879]],64096:[[35088]],64097:[[35222]],64098:[[35585]],64099:[[35641]],64100:[[36051]],64101:[[36104]],64102:[[36790]],64103:[[36920]],64104:[[38627]],64105:[[38911]],64106:[[38971]],64107:[[24693]],64108:[[148206]],64109:[[33304]],64112:[[20006]],64113:[[20917]],64114:[[20840]],64115:[[20352]],64116:[[20805]],64117:[[20864]],64118:[[21191]],64119:[[21242]],64120:[[21917]],64121:[[21845]],64122:[[21913]],64123:[[21986]],64124:[[22618]],64125:[[22707]],64126:[[22852]],64127:[[22868]],64128:[[23138]],64129:[[23336]],64130:[[24274]],64131:[[24281]],64132:[[24425]],64133:[[24493]],64134:[[24792]],64135:[[24910]],64136:[[24840]],64137:[[24974]],64138:[[24928]],64139:[[25074]],64140:[[25140]],64141:[[25540]],64142:[[25628]],64143:[[25682]],64144:[[25942]],64145:[[26228]],64146:[[26391]],64147:[[26395]],64148:[[26454]],64149:[[27513]],64150:[[27578]],64151:[[27969]],64152:[[28379]],64153:[[28363]],64154:[[28450]],64155:[[28702]],64156:[[29038]],64157:[[30631]],64158:[[29237]],64159:[[29359]],64160:[[29482]],64161:[[29809]],64162:[[29958]],64163:[[30011]],64164:[[30237]],64165:[[30239]],64166:[[30410]],64167:[[30427]],64168:[[30452]],64169:[[30538]],64170:[[30528]],64171:[[30924]],64172:[[31409]],64173:[[31680]],64174:[[31867]],64175:[[32091]],64176:[[32244]],64177:[[32574]],64178:[[32773]],64179:[[33618]],64180:[[33775]],64181:[[34681]],64182:[[35137]],64183:[[35206]],64184:[[35222]],64185:[[35519]],64186:[[35576]],64187:[[35531]],64188:[[35585]],64189:[[35582]],64190:[[35565]],64191:[[35641]],64192:[[35722]],64193:[[36104]],64194:[[36664]],64195:[[36978]],64196:[[37273]],64197:[[37494]],64198:[[38524]],64199:[[38627]],64200:[[38742]],64201:[[38875]],64202:[[38911]],64203:[[38923]],64204:[[38971]],64205:[[39698]],64206:[[40860]],64207:[[141386]],64208:[[141380]],64209:[[144341]],64210:[[15261]],64211:[[16408]],64212:[[16441]],64213:[[152137]],64214:[[154832]],64215:[[163539]],64216:[[40771]],64217:[[40846]],195072:[[38953]],195073:[[169398]],195074:[[39138]],195075:[[19251]],195076:[[39209]],195077:[[39335]],195078:[[39362]],195079:[[39422]],195080:[[19406]],195081:[[170800]],195082:[[39698]],195083:[[40000]],195084:[[40189]],195085:[[19662]],195086:[[19693]],195087:[[40295]],195088:[[172238]],195089:[[19704]],195090:[[172293]],195091:[[172558]],195092:[[172689]],195093:[[40635]],195094:[[19798]],195095:[[40697]],195096:[[40702]],195097:[[40709]],195098:[[40719]],195099:[[40726]],195100:[[40763]],195101:[[173568]]}, +64256:{64256:[[102,102],256],64257:[[102,105],256],64258:[[102,108],256],64259:[[102,102,105],256],64260:[[102,102,108],256],64261:[[383,116],256],64262:[[115,116],256],64275:[[1396,1398],256],64276:[[1396,1381],256],64277:[[1396,1387],256],64278:[[1406,1398],256],64279:[[1396,1389],256],64285:[[1497,1460],512],64286:[,26],64287:[[1522,1463],512],64288:[[1506],256],64289:[[1488],256],64290:[[1491],256],64291:[[1492],256],64292:[[1499],256],64293:[[1500],256],64294:[[1501],256],64295:[[1512],256],64296:[[1514],256],64297:[[43],256],64298:[[1513,1473],512],64299:[[1513,1474],512],64300:[[64329,1473],512],64301:[[64329,1474],512],64302:[[1488,1463],512],64303:[[1488,1464],512],64304:[[1488,1468],512],64305:[[1489,1468],512],64306:[[1490,1468],512],64307:[[1491,1468],512],64308:[[1492,1468],512],64309:[[1493,1468],512],64310:[[1494,1468],512],64312:[[1496,1468],512],64313:[[1497,1468],512],64314:[[1498,1468],512],64315:[[1499,1468],512],64316:[[1500,1468],512],64318:[[1502,1468],512],64320:[[1504,1468],512],64321:[[1505,1468],512],64323:[[1507,1468],512],64324:[[1508,1468],512],64326:[[1510,1468],512],64327:[[1511,1468],512],64328:[[1512,1468],512],64329:[[1513,1468],512],64330:[[1514,1468],512],64331:[[1493,1465],512],64332:[[1489,1471],512],64333:[[1499,1471],512],64334:[[1508,1471],512],64335:[[1488,1500],256],64336:[[1649],256],64337:[[1649],256],64338:[[1659],256],64339:[[1659],256],64340:[[1659],256],64341:[[1659],256],64342:[[1662],256],64343:[[1662],256],64344:[[1662],256],64345:[[1662],256],64346:[[1664],256],64347:[[1664],256],64348:[[1664],256],64349:[[1664],256],64350:[[1658],256],64351:[[1658],256],64352:[[1658],256],64353:[[1658],256],64354:[[1663],256],64355:[[1663],256],64356:[[1663],256],64357:[[1663],256],64358:[[1657],256],64359:[[1657],256],64360:[[1657],256],64361:[[1657],256],64362:[[1700],256],64363:[[1700],256],64364:[[1700],256],64365:[[1700],256],64366:[[1702],256],64367:[[1702],256],64368:[[1702],256],64369:[[1702],256],64370:[[1668],256],64371:[[1668],256],64372:[[1668],256],64373:[[1668],256],64374:[[1667],256],64375:[[1667],256],64376:[[1667],256],64377:[[1667],256],64378:[[1670],256],64379:[[1670],256],64380:[[1670],256],64381:[[1670],256],64382:[[1671],256],64383:[[1671],256],64384:[[1671],256],64385:[[1671],256],64386:[[1677],256],64387:[[1677],256],64388:[[1676],256],64389:[[1676],256],64390:[[1678],256],64391:[[1678],256],64392:[[1672],256],64393:[[1672],256],64394:[[1688],256],64395:[[1688],256],64396:[[1681],256],64397:[[1681],256],64398:[[1705],256],64399:[[1705],256],64400:[[1705],256],64401:[[1705],256],64402:[[1711],256],64403:[[1711],256],64404:[[1711],256],64405:[[1711],256],64406:[[1715],256],64407:[[1715],256],64408:[[1715],256],64409:[[1715],256],64410:[[1713],256],64411:[[1713],256],64412:[[1713],256],64413:[[1713],256],64414:[[1722],256],64415:[[1722],256],64416:[[1723],256],64417:[[1723],256],64418:[[1723],256],64419:[[1723],256],64420:[[1728],256],64421:[[1728],256],64422:[[1729],256],64423:[[1729],256],64424:[[1729],256],64425:[[1729],256],64426:[[1726],256],64427:[[1726],256],64428:[[1726],256],64429:[[1726],256],64430:[[1746],256],64431:[[1746],256],64432:[[1747],256],64433:[[1747],256],64467:[[1709],256],64468:[[1709],256],64469:[[1709],256],64470:[[1709],256],64471:[[1735],256],64472:[[1735],256],64473:[[1734],256],64474:[[1734],256],64475:[[1736],256],64476:[[1736],256],64477:[[1655],256],64478:[[1739],256],64479:[[1739],256],64480:[[1733],256],64481:[[1733],256],64482:[[1737],256],64483:[[1737],256],64484:[[1744],256],64485:[[1744],256],64486:[[1744],256],64487:[[1744],256],64488:[[1609],256],64489:[[1609],256],64490:[[1574,1575],256],64491:[[1574,1575],256],64492:[[1574,1749],256],64493:[[1574,1749],256],64494:[[1574,1608],256],64495:[[1574,1608],256],64496:[[1574,1735],256],64497:[[1574,1735],256],64498:[[1574,1734],256],64499:[[1574,1734],256],64500:[[1574,1736],256],64501:[[1574,1736],256],64502:[[1574,1744],256],64503:[[1574,1744],256],64504:[[1574,1744],256],64505:[[1574,1609],256],64506:[[1574,1609],256],64507:[[1574,1609],256],64508:[[1740],256],64509:[[1740],256],64510:[[1740],256],64511:[[1740],256]}, +64512:{64512:[[1574,1580],256],64513:[[1574,1581],256],64514:[[1574,1605],256],64515:[[1574,1609],256],64516:[[1574,1610],256],64517:[[1576,1580],256],64518:[[1576,1581],256],64519:[[1576,1582],256],64520:[[1576,1605],256],64521:[[1576,1609],256],64522:[[1576,1610],256],64523:[[1578,1580],256],64524:[[1578,1581],256],64525:[[1578,1582],256],64526:[[1578,1605],256],64527:[[1578,1609],256],64528:[[1578,1610],256],64529:[[1579,1580],256],64530:[[1579,1605],256],64531:[[1579,1609],256],64532:[[1579,1610],256],64533:[[1580,1581],256],64534:[[1580,1605],256],64535:[[1581,1580],256],64536:[[1581,1605],256],64537:[[1582,1580],256],64538:[[1582,1581],256],64539:[[1582,1605],256],64540:[[1587,1580],256],64541:[[1587,1581],256],64542:[[1587,1582],256],64543:[[1587,1605],256],64544:[[1589,1581],256],64545:[[1589,1605],256],64546:[[1590,1580],256],64547:[[1590,1581],256],64548:[[1590,1582],256],64549:[[1590,1605],256],64550:[[1591,1581],256],64551:[[1591,1605],256],64552:[[1592,1605],256],64553:[[1593,1580],256],64554:[[1593,1605],256],64555:[[1594,1580],256],64556:[[1594,1605],256],64557:[[1601,1580],256],64558:[[1601,1581],256],64559:[[1601,1582],256],64560:[[1601,1605],256],64561:[[1601,1609],256],64562:[[1601,1610],256],64563:[[1602,1581],256],64564:[[1602,1605],256],64565:[[1602,1609],256],64566:[[1602,1610],256],64567:[[1603,1575],256],64568:[[1603,1580],256],64569:[[1603,1581],256],64570:[[1603,1582],256],64571:[[1603,1604],256],64572:[[1603,1605],256],64573:[[1603,1609],256],64574:[[1603,1610],256],64575:[[1604,1580],256],64576:[[1604,1581],256],64577:[[1604,1582],256],64578:[[1604,1605],256],64579:[[1604,1609],256],64580:[[1604,1610],256],64581:[[1605,1580],256],64582:[[1605,1581],256],64583:[[1605,1582],256],64584:[[1605,1605],256],64585:[[1605,1609],256],64586:[[1605,1610],256],64587:[[1606,1580],256],64588:[[1606,1581],256],64589:[[1606,1582],256],64590:[[1606,1605],256],64591:[[1606,1609],256],64592:[[1606,1610],256],64593:[[1607,1580],256],64594:[[1607,1605],256],64595:[[1607,1609],256],64596:[[1607,1610],256],64597:[[1610,1580],256],64598:[[1610,1581],256],64599:[[1610,1582],256],64600:[[1610,1605],256],64601:[[1610,1609],256],64602:[[1610,1610],256],64603:[[1584,1648],256],64604:[[1585,1648],256],64605:[[1609,1648],256],64606:[[32,1612,1617],256],64607:[[32,1613,1617],256],64608:[[32,1614,1617],256],64609:[[32,1615,1617],256],64610:[[32,1616,1617],256],64611:[[32,1617,1648],256],64612:[[1574,1585],256],64613:[[1574,1586],256],64614:[[1574,1605],256],64615:[[1574,1606],256],64616:[[1574,1609],256],64617:[[1574,1610],256],64618:[[1576,1585],256],64619:[[1576,1586],256],64620:[[1576,1605],256],64621:[[1576,1606],256],64622:[[1576,1609],256],64623:[[1576,1610],256],64624:[[1578,1585],256],64625:[[1578,1586],256],64626:[[1578,1605],256],64627:[[1578,1606],256],64628:[[1578,1609],256],64629:[[1578,1610],256],64630:[[1579,1585],256],64631:[[1579,1586],256],64632:[[1579,1605],256],64633:[[1579,1606],256],64634:[[1579,1609],256],64635:[[1579,1610],256],64636:[[1601,1609],256],64637:[[1601,1610],256],64638:[[1602,1609],256],64639:[[1602,1610],256],64640:[[1603,1575],256],64641:[[1603,1604],256],64642:[[1603,1605],256],64643:[[1603,1609],256],64644:[[1603,1610],256],64645:[[1604,1605],256],64646:[[1604,1609],256],64647:[[1604,1610],256],64648:[[1605,1575],256],64649:[[1605,1605],256],64650:[[1606,1585],256],64651:[[1606,1586],256],64652:[[1606,1605],256],64653:[[1606,1606],256],64654:[[1606,1609],256],64655:[[1606,1610],256],64656:[[1609,1648],256],64657:[[1610,1585],256],64658:[[1610,1586],256],64659:[[1610,1605],256],64660:[[1610,1606],256],64661:[[1610,1609],256],64662:[[1610,1610],256],64663:[[1574,1580],256],64664:[[1574,1581],256],64665:[[1574,1582],256],64666:[[1574,1605],256],64667:[[1574,1607],256],64668:[[1576,1580],256],64669:[[1576,1581],256],64670:[[1576,1582],256],64671:[[1576,1605],256],64672:[[1576,1607],256],64673:[[1578,1580],256],64674:[[1578,1581],256],64675:[[1578,1582],256],64676:[[1578,1605],256],64677:[[1578,1607],256],64678:[[1579,1605],256],64679:[[1580,1581],256],64680:[[1580,1605],256],64681:[[1581,1580],256],64682:[[1581,1605],256],64683:[[1582,1580],256],64684:[[1582,1605],256],64685:[[1587,1580],256],64686:[[1587,1581],256],64687:[[1587,1582],256],64688:[[1587,1605],256],64689:[[1589,1581],256],64690:[[1589,1582],256],64691:[[1589,1605],256],64692:[[1590,1580],256],64693:[[1590,1581],256],64694:[[1590,1582],256],64695:[[1590,1605],256],64696:[[1591,1581],256],64697:[[1592,1605],256],64698:[[1593,1580],256],64699:[[1593,1605],256],64700:[[1594,1580],256],64701:[[1594,1605],256],64702:[[1601,1580],256],64703:[[1601,1581],256],64704:[[1601,1582],256],64705:[[1601,1605],256],64706:[[1602,1581],256],64707:[[1602,1605],256],64708:[[1603,1580],256],64709:[[1603,1581],256],64710:[[1603,1582],256],64711:[[1603,1604],256],64712:[[1603,1605],256],64713:[[1604,1580],256],64714:[[1604,1581],256],64715:[[1604,1582],256],64716:[[1604,1605],256],64717:[[1604,1607],256],64718:[[1605,1580],256],64719:[[1605,1581],256],64720:[[1605,1582],256],64721:[[1605,1605],256],64722:[[1606,1580],256],64723:[[1606,1581],256],64724:[[1606,1582],256],64725:[[1606,1605],256],64726:[[1606,1607],256],64727:[[1607,1580],256],64728:[[1607,1605],256],64729:[[1607,1648],256],64730:[[1610,1580],256],64731:[[1610,1581],256],64732:[[1610,1582],256],64733:[[1610,1605],256],64734:[[1610,1607],256],64735:[[1574,1605],256],64736:[[1574,1607],256],64737:[[1576,1605],256],64738:[[1576,1607],256],64739:[[1578,1605],256],64740:[[1578,1607],256],64741:[[1579,1605],256],64742:[[1579,1607],256],64743:[[1587,1605],256],64744:[[1587,1607],256],64745:[[1588,1605],256],64746:[[1588,1607],256],64747:[[1603,1604],256],64748:[[1603,1605],256],64749:[[1604,1605],256],64750:[[1606,1605],256],64751:[[1606,1607],256],64752:[[1610,1605],256],64753:[[1610,1607],256],64754:[[1600,1614,1617],256],64755:[[1600,1615,1617],256],64756:[[1600,1616,1617],256],64757:[[1591,1609],256],64758:[[1591,1610],256],64759:[[1593,1609],256],64760:[[1593,1610],256],64761:[[1594,1609],256],64762:[[1594,1610],256],64763:[[1587,1609],256],64764:[[1587,1610],256],64765:[[1588,1609],256],64766:[[1588,1610],256],64767:[[1581,1609],256]}, +64768:{64768:[[1581,1610],256],64769:[[1580,1609],256],64770:[[1580,1610],256],64771:[[1582,1609],256],64772:[[1582,1610],256],64773:[[1589,1609],256],64774:[[1589,1610],256],64775:[[1590,1609],256],64776:[[1590,1610],256],64777:[[1588,1580],256],64778:[[1588,1581],256],64779:[[1588,1582],256],64780:[[1588,1605],256],64781:[[1588,1585],256],64782:[[1587,1585],256],64783:[[1589,1585],256],64784:[[1590,1585],256],64785:[[1591,1609],256],64786:[[1591,1610],256],64787:[[1593,1609],256],64788:[[1593,1610],256],64789:[[1594,1609],256],64790:[[1594,1610],256],64791:[[1587,1609],256],64792:[[1587,1610],256],64793:[[1588,1609],256],64794:[[1588,1610],256],64795:[[1581,1609],256],64796:[[1581,1610],256],64797:[[1580,1609],256],64798:[[1580,1610],256],64799:[[1582,1609],256],64800:[[1582,1610],256],64801:[[1589,1609],256],64802:[[1589,1610],256],64803:[[1590,1609],256],64804:[[1590,1610],256],64805:[[1588,1580],256],64806:[[1588,1581],256],64807:[[1588,1582],256],64808:[[1588,1605],256],64809:[[1588,1585],256],64810:[[1587,1585],256],64811:[[1589,1585],256],64812:[[1590,1585],256],64813:[[1588,1580],256],64814:[[1588,1581],256],64815:[[1588,1582],256],64816:[[1588,1605],256],64817:[[1587,1607],256],64818:[[1588,1607],256],64819:[[1591,1605],256],64820:[[1587,1580],256],64821:[[1587,1581],256],64822:[[1587,1582],256],64823:[[1588,1580],256],64824:[[1588,1581],256],64825:[[1588,1582],256],64826:[[1591,1605],256],64827:[[1592,1605],256],64828:[[1575,1611],256],64829:[[1575,1611],256],64848:[[1578,1580,1605],256],64849:[[1578,1581,1580],256],64850:[[1578,1581,1580],256],64851:[[1578,1581,1605],256],64852:[[1578,1582,1605],256],64853:[[1578,1605,1580],256],64854:[[1578,1605,1581],256],64855:[[1578,1605,1582],256],64856:[[1580,1605,1581],256],64857:[[1580,1605,1581],256],64858:[[1581,1605,1610],256],64859:[[1581,1605,1609],256],64860:[[1587,1581,1580],256],64861:[[1587,1580,1581],256],64862:[[1587,1580,1609],256],64863:[[1587,1605,1581],256],64864:[[1587,1605,1581],256],64865:[[1587,1605,1580],256],64866:[[1587,1605,1605],256],64867:[[1587,1605,1605],256],64868:[[1589,1581,1581],256],64869:[[1589,1581,1581],256],64870:[[1589,1605,1605],256],64871:[[1588,1581,1605],256],64872:[[1588,1581,1605],256],64873:[[1588,1580,1610],256],64874:[[1588,1605,1582],256],64875:[[1588,1605,1582],256],64876:[[1588,1605,1605],256],64877:[[1588,1605,1605],256],64878:[[1590,1581,1609],256],64879:[[1590,1582,1605],256],64880:[[1590,1582,1605],256],64881:[[1591,1605,1581],256],64882:[[1591,1605,1581],256],64883:[[1591,1605,1605],256],64884:[[1591,1605,1610],256],64885:[[1593,1580,1605],256],64886:[[1593,1605,1605],256],64887:[[1593,1605,1605],256],64888:[[1593,1605,1609],256],64889:[[1594,1605,1605],256],64890:[[1594,1605,1610],256],64891:[[1594,1605,1609],256],64892:[[1601,1582,1605],256],64893:[[1601,1582,1605],256],64894:[[1602,1605,1581],256],64895:[[1602,1605,1605],256],64896:[[1604,1581,1605],256],64897:[[1604,1581,1610],256],64898:[[1604,1581,1609],256],64899:[[1604,1580,1580],256],64900:[[1604,1580,1580],256],64901:[[1604,1582,1605],256],64902:[[1604,1582,1605],256],64903:[[1604,1605,1581],256],64904:[[1604,1605,1581],256],64905:[[1605,1581,1580],256],64906:[[1605,1581,1605],256],64907:[[1605,1581,1610],256],64908:[[1605,1580,1581],256],64909:[[1605,1580,1605],256],64910:[[1605,1582,1580],256],64911:[[1605,1582,1605],256],64914:[[1605,1580,1582],256],64915:[[1607,1605,1580],256],64916:[[1607,1605,1605],256],64917:[[1606,1581,1605],256],64918:[[1606,1581,1609],256],64919:[[1606,1580,1605],256],64920:[[1606,1580,1605],256],64921:[[1606,1580,1609],256],64922:[[1606,1605,1610],256],64923:[[1606,1605,1609],256],64924:[[1610,1605,1605],256],64925:[[1610,1605,1605],256],64926:[[1576,1582,1610],256],64927:[[1578,1580,1610],256],64928:[[1578,1580,1609],256],64929:[[1578,1582,1610],256],64930:[[1578,1582,1609],256],64931:[[1578,1605,1610],256],64932:[[1578,1605,1609],256],64933:[[1580,1605,1610],256],64934:[[1580,1581,1609],256],64935:[[1580,1605,1609],256],64936:[[1587,1582,1609],256],64937:[[1589,1581,1610],256],64938:[[1588,1581,1610],256],64939:[[1590,1581,1610],256],64940:[[1604,1580,1610],256],64941:[[1604,1605,1610],256],64942:[[1610,1581,1610],256],64943:[[1610,1580,1610],256],64944:[[1610,1605,1610],256],64945:[[1605,1605,1610],256],64946:[[1602,1605,1610],256],64947:[[1606,1581,1610],256],64948:[[1602,1605,1581],256],64949:[[1604,1581,1605],256],64950:[[1593,1605,1610],256],64951:[[1603,1605,1610],256],64952:[[1606,1580,1581],256],64953:[[1605,1582,1610],256],64954:[[1604,1580,1605],256],64955:[[1603,1605,1605],256],64956:[[1604,1580,1605],256],64957:[[1606,1580,1581],256],64958:[[1580,1581,1610],256],64959:[[1581,1580,1610],256],64960:[[1605,1580,1610],256],64961:[[1601,1605,1610],256],64962:[[1576,1581,1610],256],64963:[[1603,1605,1605],256],64964:[[1593,1580,1605],256],64965:[[1589,1605,1605],256],64966:[[1587,1582,1610],256],64967:[[1606,1580,1610],256],65008:[[1589,1604,1746],256],65009:[[1602,1604,1746],256],65010:[[1575,1604,1604,1607],256],65011:[[1575,1603,1576,1585],256],65012:[[1605,1581,1605,1583],256],65013:[[1589,1604,1593,1605],256],65014:[[1585,1587,1608,1604],256],65015:[[1593,1604,1610,1607],256],65016:[[1608,1587,1604,1605],256],65017:[[1589,1604,1609],256],65018:[[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605],256],65019:[[1580,1604,32,1580,1604,1575,1604,1607],256],65020:[[1585,1740,1575,1604],256]}, +65024:{65040:[[44],256],65041:[[12289],256],65042:[[12290],256],65043:[[58],256],65044:[[59],256],65045:[[33],256],65046:[[63],256],65047:[[12310],256],65048:[[12311],256],65049:[[8230],256],65056:[,230],65057:[,230],65058:[,230],65059:[,230],65060:[,230],65061:[,230],65062:[,230],65063:[,220],65064:[,220],65065:[,220],65066:[,220],65067:[,220],65068:[,220],65069:[,220],65072:[[8229],256],65073:[[8212],256],65074:[[8211],256],65075:[[95],256],65076:[[95],256],65077:[[40],256],65078:[[41],256],65079:[[123],256],65080:[[125],256],65081:[[12308],256],65082:[[12309],256],65083:[[12304],256],65084:[[12305],256],65085:[[12298],256],65086:[[12299],256],65087:[[12296],256],65088:[[12297],256],65089:[[12300],256],65090:[[12301],256],65091:[[12302],256],65092:[[12303],256],65095:[[91],256],65096:[[93],256],65097:[[8254],256],65098:[[8254],256],65099:[[8254],256],65100:[[8254],256],65101:[[95],256],65102:[[95],256],65103:[[95],256],65104:[[44],256],65105:[[12289],256],65106:[[46],256],65108:[[59],256],65109:[[58],256],65110:[[63],256],65111:[[33],256],65112:[[8212],256],65113:[[40],256],65114:[[41],256],65115:[[123],256],65116:[[125],256],65117:[[12308],256],65118:[[12309],256],65119:[[35],256],65120:[[38],256],65121:[[42],256],65122:[[43],256],65123:[[45],256],65124:[[60],256],65125:[[62],256],65126:[[61],256],65128:[[92],256],65129:[[36],256],65130:[[37],256],65131:[[64],256],65136:[[32,1611],256],65137:[[1600,1611],256],65138:[[32,1612],256],65140:[[32,1613],256],65142:[[32,1614],256],65143:[[1600,1614],256],65144:[[32,1615],256],65145:[[1600,1615],256],65146:[[32,1616],256],65147:[[1600,1616],256],65148:[[32,1617],256],65149:[[1600,1617],256],65150:[[32,1618],256],65151:[[1600,1618],256],65152:[[1569],256],65153:[[1570],256],65154:[[1570],256],65155:[[1571],256],65156:[[1571],256],65157:[[1572],256],65158:[[1572],256],65159:[[1573],256],65160:[[1573],256],65161:[[1574],256],65162:[[1574],256],65163:[[1574],256],65164:[[1574],256],65165:[[1575],256],65166:[[1575],256],65167:[[1576],256],65168:[[1576],256],65169:[[1576],256],65170:[[1576],256],65171:[[1577],256],65172:[[1577],256],65173:[[1578],256],65174:[[1578],256],65175:[[1578],256],65176:[[1578],256],65177:[[1579],256],65178:[[1579],256],65179:[[1579],256],65180:[[1579],256],65181:[[1580],256],65182:[[1580],256],65183:[[1580],256],65184:[[1580],256],65185:[[1581],256],65186:[[1581],256],65187:[[1581],256],65188:[[1581],256],65189:[[1582],256],65190:[[1582],256],65191:[[1582],256],65192:[[1582],256],65193:[[1583],256],65194:[[1583],256],65195:[[1584],256],65196:[[1584],256],65197:[[1585],256],65198:[[1585],256],65199:[[1586],256],65200:[[1586],256],65201:[[1587],256],65202:[[1587],256],65203:[[1587],256],65204:[[1587],256],65205:[[1588],256],65206:[[1588],256],65207:[[1588],256],65208:[[1588],256],65209:[[1589],256],65210:[[1589],256],65211:[[1589],256],65212:[[1589],256],65213:[[1590],256],65214:[[1590],256],65215:[[1590],256],65216:[[1590],256],65217:[[1591],256],65218:[[1591],256],65219:[[1591],256],65220:[[1591],256],65221:[[1592],256],65222:[[1592],256],65223:[[1592],256],65224:[[1592],256],65225:[[1593],256],65226:[[1593],256],65227:[[1593],256],65228:[[1593],256],65229:[[1594],256],65230:[[1594],256],65231:[[1594],256],65232:[[1594],256],65233:[[1601],256],65234:[[1601],256],65235:[[1601],256],65236:[[1601],256],65237:[[1602],256],65238:[[1602],256],65239:[[1602],256],65240:[[1602],256],65241:[[1603],256],65242:[[1603],256],65243:[[1603],256],65244:[[1603],256],65245:[[1604],256],65246:[[1604],256],65247:[[1604],256],65248:[[1604],256],65249:[[1605],256],65250:[[1605],256],65251:[[1605],256],65252:[[1605],256],65253:[[1606],256],65254:[[1606],256],65255:[[1606],256],65256:[[1606],256],65257:[[1607],256],65258:[[1607],256],65259:[[1607],256],65260:[[1607],256],65261:[[1608],256],65262:[[1608],256],65263:[[1609],256],65264:[[1609],256],65265:[[1610],256],65266:[[1610],256],65267:[[1610],256],65268:[[1610],256],65269:[[1604,1570],256],65270:[[1604,1570],256],65271:[[1604,1571],256],65272:[[1604,1571],256],65273:[[1604,1573],256],65274:[[1604,1573],256],65275:[[1604,1575],256],65276:[[1604,1575],256]}, +65280:{65281:[[33],256],65282:[[34],256],65283:[[35],256],65284:[[36],256],65285:[[37],256],65286:[[38],256],65287:[[39],256],65288:[[40],256],65289:[[41],256],65290:[[42],256],65291:[[43],256],65292:[[44],256],65293:[[45],256],65294:[[46],256],65295:[[47],256],65296:[[48],256],65297:[[49],256],65298:[[50],256],65299:[[51],256],65300:[[52],256],65301:[[53],256],65302:[[54],256],65303:[[55],256],65304:[[56],256],65305:[[57],256],65306:[[58],256],65307:[[59],256],65308:[[60],256],65309:[[61],256],65310:[[62],256],65311:[[63],256],65312:[[64],256],65313:[[65],256],65314:[[66],256],65315:[[67],256],65316:[[68],256],65317:[[69],256],65318:[[70],256],65319:[[71],256],65320:[[72],256],65321:[[73],256],65322:[[74],256],65323:[[75],256],65324:[[76],256],65325:[[77],256],65326:[[78],256],65327:[[79],256],65328:[[80],256],65329:[[81],256],65330:[[82],256],65331:[[83],256],65332:[[84],256],65333:[[85],256],65334:[[86],256],65335:[[87],256],65336:[[88],256],65337:[[89],256],65338:[[90],256],65339:[[91],256],65340:[[92],256],65341:[[93],256],65342:[[94],256],65343:[[95],256],65344:[[96],256],65345:[[97],256],65346:[[98],256],65347:[[99],256],65348:[[100],256],65349:[[101],256],65350:[[102],256],65351:[[103],256],65352:[[104],256],65353:[[105],256],65354:[[106],256],65355:[[107],256],65356:[[108],256],65357:[[109],256],65358:[[110],256],65359:[[111],256],65360:[[112],256],65361:[[113],256],65362:[[114],256],65363:[[115],256],65364:[[116],256],65365:[[117],256],65366:[[118],256],65367:[[119],256],65368:[[120],256],65369:[[121],256],65370:[[122],256],65371:[[123],256],65372:[[124],256],65373:[[125],256],65374:[[126],256],65375:[[10629],256],65376:[[10630],256],65377:[[12290],256],65378:[[12300],256],65379:[[12301],256],65380:[[12289],256],65381:[[12539],256],65382:[[12530],256],65383:[[12449],256],65384:[[12451],256],65385:[[12453],256],65386:[[12455],256],65387:[[12457],256],65388:[[12515],256],65389:[[12517],256],65390:[[12519],256],65391:[[12483],256],65392:[[12540],256],65393:[[12450],256],65394:[[12452],256],65395:[[12454],256],65396:[[12456],256],65397:[[12458],256],65398:[[12459],256],65399:[[12461],256],65400:[[12463],256],65401:[[12465],256],65402:[[12467],256],65403:[[12469],256],65404:[[12471],256],65405:[[12473],256],65406:[[12475],256],65407:[[12477],256],65408:[[12479],256],65409:[[12481],256],65410:[[12484],256],65411:[[12486],256],65412:[[12488],256],65413:[[12490],256],65414:[[12491],256],65415:[[12492],256],65416:[[12493],256],65417:[[12494],256],65418:[[12495],256],65419:[[12498],256],65420:[[12501],256],65421:[[12504],256],65422:[[12507],256],65423:[[12510],256],65424:[[12511],256],65425:[[12512],256],65426:[[12513],256],65427:[[12514],256],65428:[[12516],256],65429:[[12518],256],65430:[[12520],256],65431:[[12521],256],65432:[[12522],256],65433:[[12523],256],65434:[[12524],256],65435:[[12525],256],65436:[[12527],256],65437:[[12531],256],65438:[[12441],256],65439:[[12442],256],65440:[[12644],256],65441:[[12593],256],65442:[[12594],256],65443:[[12595],256],65444:[[12596],256],65445:[[12597],256],65446:[[12598],256],65447:[[12599],256],65448:[[12600],256],65449:[[12601],256],65450:[[12602],256],65451:[[12603],256],65452:[[12604],256],65453:[[12605],256],65454:[[12606],256],65455:[[12607],256],65456:[[12608],256],65457:[[12609],256],65458:[[12610],256],65459:[[12611],256],65460:[[12612],256],65461:[[12613],256],65462:[[12614],256],65463:[[12615],256],65464:[[12616],256],65465:[[12617],256],65466:[[12618],256],65467:[[12619],256],65468:[[12620],256],65469:[[12621],256],65470:[[12622],256],65474:[[12623],256],65475:[[12624],256],65476:[[12625],256],65477:[[12626],256],65478:[[12627],256],65479:[[12628],256],65482:[[12629],256],65483:[[12630],256],65484:[[12631],256],65485:[[12632],256],65486:[[12633],256],65487:[[12634],256],65490:[[12635],256],65491:[[12636],256],65492:[[12637],256],65493:[[12638],256],65494:[[12639],256],65495:[[12640],256],65498:[[12641],256],65499:[[12642],256],65500:[[12643],256],65504:[[162],256],65505:[[163],256],65506:[[172],256],65507:[[175],256],65508:[[166],256],65509:[[165],256],65510:[[8361],256],65512:[[9474],256],65513:[[8592],256],65514:[[8593],256],65515:[[8594],256],65516:[[8595],256],65517:[[9632],256],65518:[[9675],256]} + +}; + + /***** Module to export */ + var unorm = { + nfc: nfc, + nfd: nfd, + nfkc: nfkc, + nfkd: nfkd + }; + + /*globals module:true,define:true*/ + + // CommonJS + if (typeof module === "object") { + module.exports = unorm; + + // AMD + } else if (typeof define === "function" && define.amd) { + define("unorm", function () { + return unorm; + }); + + // Global + } else { + root.unorm = unorm; + } + + /***** Export as shim for String::normalize method *****/ + /* + http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#november_8_2013_draft_rev_21 + + 21.1.3.12 String.prototype.normalize(form="NFC") + When the normalize method is called with one argument form, the following steps are taken: + + 1. Let O be CheckObjectCoercible(this value). + 2. Let S be ToString(O). + 3. ReturnIfAbrupt(S). + 4. If form is not provided or undefined let form be "NFC". + 5. Let f be ToString(form). + 6. ReturnIfAbrupt(f). + 7. If f is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw a RangeError Exception. + 8. Let ns be the String value is the result of normalizing S into the normalization form named by f as specified in Unicode Standard Annex #15, UnicodeNormalizatoin Forms. + 9. Return ns. + + The length property of the normalize method is 0. + + *NOTE* The normalize function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method. + */ + unorm.shimApplied = false; + + if (!String.prototype.normalize) { + String.prototype.normalize = function(form) { + var str = "" + this; + form = form === undefined ? "NFC" : form; + + if (form === "NFC") { + return unorm.nfc(str); + } else if (form === "NFD") { + return unorm.nfd(str); + } else if (form === "NFKC") { + return unorm.nfkc(str); + } else if (form === "NFKD") { + return unorm.nfkd(str); + } else { + throw new RangeError("Invalid normalization form: " + form); + } + }; + + unorm.shimApplied = true; + } +}(this)); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/package.json new file mode 100644 index 0000000..a394fea --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/unorm/package.json @@ -0,0 +1,73 @@ +{ + "_from": "unorm@^1.3.3", + "_id": "unorm@1.4.1", + "_inBundle": true, + "_integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", + "_location": "/cordova-android/unorm", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "unorm@^1.3.3", + "name": "unorm", + "escapedName": "unorm", + "rawSpec": "^1.3.3", + "saveSpec": null, + "fetchSpec": "^1.3.3" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/cordova-common" + ], + "_resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", + "_shasum": "364200d5f13646ca8bcd44490271335614792300", + "_spec": "unorm@^1.3.3", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common", + "author": { + "name": "Bjarke Walling", + "email": "bwp@bwp.dk" + }, + "bugs": { + "url": "https://github.com/walling/unorm/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Bjarke Walling", + "email": "bwp@bwp.dk" + }, + { + "name": "Oleg Grenrus", + "email": "oleg.grenrus@iki.fi" + }, + { + "name": "Matsuza", + "email": "matsuza@gmail.com" + } + ], + "deprecated": false, + "description": "JavaScript Unicode 8.0 Normalization - NFC, NFD, NFKC, NFKD. Read UAX #15 Unicode Normalization Forms.", + "devDependencies": { + "benchmark": "~1.0.0", + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.8.0", + "grunt-contrib-watch": "~0.5.0", + "grunt-simple-mocha": "~0.4.0", + "unorm": "1.4.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/walling/unorm#readme", + "license": "MIT or GPL-2.0", + "main": "./lib/unorm.js", + "name": "unorm", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/walling/unorm.git" + }, + "scripts": { + "test": "grunt test" + }, + "version": "1.4.1" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/README.md new file mode 100644 index 0000000..98eab25 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/package.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/package.json new file mode 100644 index 0000000..974e9fa --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/package.json @@ -0,0 +1,60 @@ +{ + "_from": "wrappy@1", + "_id": "wrappy@1.0.2", + "_inBundle": true, + "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "_location": "/cordova-android/wrappy", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "wrappy@1", + "name": "wrappy", + "escapedName": "wrappy", + "rawSpec": "1", + "saveSpec": null, + "fetchSpec": "1" + }, + "_requiredBy": [ + "/cordova-android", + "/cordova-android/inflight", + "/cordova-android/once" + ], + "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "_spec": "wrappy@1", + "_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/inflight", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Callback wrapping utility", + "devDependencies": { + "tap": "^2.3.1" + }, + "directories": { + "test": "test" + }, + "files": [ + "wrappy.js" + ], + "homepage": "https://github.com/npm/wrappy", + "license": "ISC", + "main": "wrappy.js", + "name": "wrappy", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/wrappy.git" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "version": "1.0.2" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/wrappy.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/wrappy.js new file mode 100644 index 0000000..bb7e7d6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/.npmignore new file mode 100644 index 0000000..b6ad1f6 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/.npmignore @@ -0,0 +1,5 @@ +.travis.yml +src +test +perf +coverage diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/CHANGELOG.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/CHANGELOG.md new file mode 100644 index 0000000..b0cb178 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/CHANGELOG.md @@ -0,0 +1,395 @@ +# Change Log + +All notable changes to this project are documented in this file. This project adheres to [Semantic Versioning](http://semver.org/#semantic-versioning-200). + +## [8.2.2] - 2016-04-08 +- Falsy values can now be used as a text node in callback mode. + +## [8.2.1] - 2016-04-07 +- Falsy values can now be used as a text node. See +[#117](https://github.com/oozcitak/xmlbuilder-js/issues/117). + +## [8.2.0] - 2016-04-01 +- Removed lodash dependency to keep the library small and simple. See +[#114](https://github.com/oozcitak/xmlbuilder-js/issues/114), +[#53](https://github.com/oozcitak/xmlbuilder-js/issues/53), +and [#43](https://github.com/oozcitak/xmlbuilder-js/issues/43). +- Added title case to name conversion options. + +## [8.1.0] - 2016-03-29 +- Added the callback option to the `begin` export function. When used with a +callback function, the XML document will be generated in chunks and each chunk +will be passed to the supplied function. In this mode, `begin` uses a different +code path and the builder should use much less memory since the entire XML tree +is not kept. There are a few drawbacks though. For example, traversing the document +tree or adding attributes to a node after it is written is not possible. It is +also not possible to remove nodes or attributes. + +``` js +var result = ''; + +builder.begin(function(chunk) { result += chunk; }) + .dec() + .ele('root') + .ele('xmlbuilder').up() + .end(); +``` + +- Replaced native `Object.assign` with `lodash.assign` to support old JS engines. See [#111](https://github.com/oozcitak/xmlbuilder-js/issues/111). + +## [8.0.0] - 2016-03-25 +- Added the `begin` export function. See the wiki for details. +- Added the ability to add comments and processing instructions before and after the root element. Added `commentBefore`, `commentAfter`, `instructionBefore` and `instructionAfter` functions for this purpose. +- Dropped support for old node.js releases. Minimum required node.js version is now 4.0. + +## [7.0.0] - 2016-03-21 +- Processing instructions are now created as regular nodes. This is a major breaking change if you are using processing instructions. Previously processing instructions were inserted before their parent node. After this change processing instructions are appended to the children of the parent node. Note that it is not currently possible to insert processing instructions before or after the root element. +```js +root.ele('node').ins('pi'); +// pre-v7 + +// v7 + +``` + +## [6.0.0] - 2016-03-20 +- Added custom XML writers. The default string conversion functions are now collected under the `XMLStringWriter` class which can be accessed by the `stringWriter(options)` function exported by the module. An `XMLStreamWriter` is also added which outputs the XML document to a writable stream. A stream writer can be created by calling the `streamWriter(stream, options)` function exported by the module. Both classes are heavily customizable and the details are added to the wiki. It is also possible to write an XML writer from scratch and use it when calling `end()` on the XML document. + +## [5.0.1] - 2016-03-08 +- Moved require statements for text case conversion to the top of files to reduce lazy requires. + +## [5.0.0] - 2016-03-05 +- Added text case option for element names and attribute names. Valid cases are `lower`, `upper`, `camel`, `kebab` and `snake`. +- Attribute and element values are escaped according to the [Canonical XML 1.0 specification](http://www.w3.org/TR/2000/WD-xml-c14n-20000119.html#charescaping). See [#54](https://github.com/oozcitak/xmlbuilder-js/issues/54) and [#86](https://github.com/oozcitak/xmlbuilder-js/issues/86). +- Added the `allowEmpty` option to `end()`. When this option is set, empty elements are not self-closed. +- Added support for [nested CDATA](https://en.wikipedia.org/wiki/CDATA#Nesting). The triad `]]>` in CDATA is now automatically replaced with `]]]]>`. + +## [4.2.1] - 2016-01-15 +- Updated lodash dependency to 4.0.0. + +## [4.2.0] - 2015-12-16 +- Added the `noDoubleEncoding` option to `create()` to control whether existing html entities are encoded. + +## [4.1.0] - 2015-11-11 +- Added the `separateArrayItems` option to `create()` to control how arrays are handled when converting from objects. e.g. + +```js +root.ele({ number: [ "one", "two" ]}); +// with separateArrayItems: true + + + + +// with separateArrayItems: false +one +two +``` + +## [4.0.0] - 2015-11-01 +- Removed the `#list` decorator. Array items are now created as child nodes by default. +- Fixed a bug where the XML encoding string was checked partially. + +## [3.1.0] - 2015-09-19 +- `#list` decorator ignores empty arrays. + +## [3.0.0] - 2015-09-10 +- Allow `\r`, `\n` and `\t` in attribute values without escaping. See [#86](https://github.com/oozcitak/xmlbuilder-js/issues/86). + +## [2.6.5] - 2015-09-09 +- Use native `isArray` instead of lodash. +- Indentation of processing instructions are set to the parent element's. + +## [2.6.4] - 2015-05-27 +- Updated lodash dependency to 3.5.0. + +## [2.6.3] - 2015-05-27 +- Bumped version because previous release was not published on npm. + +## [2.6.2] - 2015-03-10 +- Updated lodash dependency to 3.5.0. + +## [2.6.1] - 2015-02-20 +- Updated lodash dependency to 3.3.0. + +## [2.6.0] - 2015-02-20 +- Fixed a bug where the `XMLNode` constructor overwrote the super class parent. +- Removed document property from cloned nodes. +- Switched to mocha.js for testing. + +## [2.5.2] - 2015-02-16 +- Updated lodash dependency to 3.2.0. + +## [2.5.1] - 2015-02-09 +- Updated lodash dependency to 3.1.0. +- Support all node >= 0.8. + +## [2.5.0] - 2015-00-03 +- Updated lodash dependency to 3.0.0. + +## [2.4.6] - 2015-01-26 +- Show more information from attribute creation with null values. +- Added iojs as an engine. +- Self close elements with empty text. + +## [2.4.5] - 2014-11-15 +- Fixed prepublish script to run on windows. +- Fixed bug in XMLStringifier where an undefined value was used while reporting an invalid encoding value. +- Moved require statements to the top of files to reduce lazy requires. See [#62](https://github.com/oozcitak/xmlbuilder-js/issues/62). + +## [2.4.4] - 2014-09-08 +- Added the `offset` option to `toString()` for use in XML fragments. + +## [2.4.3] - 2014-08-13 +- Corrected license in package description. + +## [2.4.2] - 2014-08-13 +- Dropped performance test and memwatch dependency. + +## [2.4.1] - 2014-08-12 +- Fixed a bug where empty indent string was omitted when pretty printing. See [#59](https://github.com/oozcitak/xmlbuilder-js/issues/59). + +## [2.4.0] - 2014-08-04 +- Correct cases of pubID and sysID. +- Use single lodash instead of separate npm modules. See [#53](https://github.com/oozcitak/xmlbuilder-js/issues/53). +- Escape according to Canonical XML 1.0. See [#54](https://github.com/oozcitak/xmlbuilder-js/issues/54). + +## [2.3.0] - 2014-07-17 +- Convert objects to JS primitives while sanitizing user input. +- Object builder preserves items with null values. See [#44](https://github.com/oozcitak/xmlbuilder-js/issues/44). +- Use modularized lodash functions to cut down dependencies. +- Process empty objects when converting from objects so that we don't throw on empty child objects. + +## [2.2.1] - 2014-04-04 +- Bumped version because previous release was not published on npm. + +## [2.2.0] - 2014-04-04 +- Switch to lodash from underscore. +- Removed legacy `ext` option from `create()`. +- Drop old node versions: 0.4, 0.5, 0.6. 0.8 is the minimum requirement from now on. + +## [2.1.0] - 2013-12-30 +- Removed duplicate null checks from constructors. +- Fixed node count in performance test. +- Added option for skipping null attribute values. See [#26](https://github.com/oozcitak/xmlbuilder-js/issues/26). +- Allow multiple values in `att()` and `ins()`. +- Added ability to run individual performance tests. +- Added flag for ignoring decorator strings. + +## [2.0.1] - 2013-12-24 +- Removed performance tests from npm package. + +## [2.0.0] - 2013-12-24 +- Combined loops for speed up. +- Added support for the DTD and XML declaration. +- `clone` includes attributes. +- Added performance tests. +- Evaluate attribute value if function. +- Evaluate instruction value if function. + +## [1.1.2] - 2013-12-11 +- Changed processing instruction decorator to `?`. + +## [1.1.1] - 2013-12-11 +- Added processing instructions to JS object conversion. + +## [1.1.0] - 2013-12-10 +- Added license to package. +- `create()` and `element()` accept JS object to fully build the document. +- Added `nod()` and `n()` aliases for `node()`. +- Renamed `convertAttChar` decorator to `convertAttKey`. +- Ignore empty decorator strings when converting JS objects. + +## [1.0.2] - 2013-11-27 +- Removed temp file which was accidentally included in the package. + +## [1.0.1] - 2013-11-27 +- Custom stringify functions affect current instance only. + +## [1.0.0] - 2013-11-27 +- Added processing instructions. +- Added stringify functions to sanitize and convert input values. +- Added option for headless XML documents. +- Added vows tests. +- Removed Makefile. Using npm publish scripts instead. +- Removed the `begin()` function. `create()` begins the document by creating the root node. + +## [0.4.3] - 2013-11-08 +- Added option to include surrogate pairs in XML content. See [#29](https://github.com/oozcitak/xmlbuilder-js/issues/29). +- Fixed empty value string representation in pretty mode. +- Added pre and postpublish scripts to package.json. +- Filtered out prototype properties when appending attributes. See [#31](https://github.com/oozcitak/xmlbuilder-js/issues/31). + +## [0.4.2] - 2012-09-14 +- Removed README.md from `.npmignore`. + +## [0.4.1] - 2012-08-31 +- Removed `begin()` calls in favor of `XMLBuilder` constructor. +- Added the `end()` function. `end()` is a convenience over `doc().toString()`. + +## [0.4.0] - 2012-08-31 +- Added arguments to `XMLBuilder` constructor to allow the name of the root element and XML prolog to be defined in one line. +- Soft deprecated `begin()`. + +## [0.3.11] - 2012-08-13 +- Package keywords are fixed to be an array of values. + +## [0.3.10] - 2012-08-13 +- Brought back npm package contents which were lost due to incorrect configuration of `package.json` in previous releases. + +## [0.3.3] - 2012-07-27 +- Implemented `importXMLBuilder()`. + +## [0.3.2] - 2012-07-20 +- Fixed a duplicated escaping problem on `element()`. +- Fixed a problem with text node creation from empty string. +- Calling `root()` on the document element returns the root element. +- `XMLBuilder` no longer extends `XMLFragment`. + +## [0.3.1] - 2011-11-28 +- Added guards for document element so that nodes cannot be inserted at document level. + +## [0.3.0] - 2011-11-28 +- Added `doc()` to return the document element. + +## [0.2.2] - 2011-11-28 +- Prevent code relying on `up()`'s older behavior to break. + +## [0.2.1] - 2011-11-28 +- Added the `root()` function. + +## [0.2.0] - 2011-11-21 +- Added Travis-CI integration. +- Added coffee-script dependency. +- Added insert, traversal and delete functions. + +## [0.1.7] - 2011-10-25 +- No changes. Accidental release. + +## [0.1.6] - 2011-10-25 +- Corrected `package.json` bugs link to `url` from `web`. + +## [0.1.5] - 2011-08-08 +- Added missing npm package contents. + +## [0.1.4] - 2011-07-29 +- Text-only nodes are no longer indented. +- Added documentation for multiple instances. + +## [0.1.3] - 2011-07-27 +- Exported the `create()` function to return a new instance. This allows multiple builder instances to be constructed. +- Fixed `u()` function so that it now correctly calls `up()`. +- Fixed typo in `element()` so that `attributes` and `text` can be passed interchangeably. + +## [0.1.2] - 2011-06-03 +- `ele()` accepts element text. +- `attributes()` now overrides existing attributes if passed the same attribute name. + +## [0.1.1] - 2011-05-19 +- Added the raw output option. +- Removed most validity checks. + +## [0.1.0] - 2011-04-27 +- `text()` and `cdata()` now return parent element. +- Attribute values are escaped. + +## [0.0.7] - 2011-04-23 +- Coerced text values to string. + +## [0.0.6] - 2011-02-23 +- Added support for XML comments. +- Text nodes are checked against CharData. + +## [0.0.5] - 2010-12-31 +- Corrected the name of the main npm module in `package.json`. + +## [0.0.4] - 2010-12-28 +- Added `.npmignore`. + +## [0.0.3] - 2010-12-27 +- root element is now constructed in `begin()`. +- moved prolog to `begin()`. +- Added the ability to have CDATA in element text. +- Removed unused prolog aliases. +- Removed `builder()` function from main module. +- Added the name of the main npm module in `package.json`. + +## [0.0.2] - 2010-11-03 +- `element()` expands nested arrays. +- Added pretty printing. +- Added the `up()`, `build()` and `prolog()` functions. +- Added readme. + +## 0.0.1 - 2010-11-02 +- Initial release + +[8.2.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.2.1...v8.2.2 +[8.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.2.0...v8.2.1 +[8.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.1.0...v8.2.0 +[8.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v8.0.0...v8.1.0 +[8.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v7.0.0...v8.0.0 +[7.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v6.0.0...v7.0.0 +[6.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v5.0.1...v6.0.0 +[5.0.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v5.0.0...v5.0.1 +[5.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.2.1...v5.0.0 +[4.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.2.0...v4.2.1 +[4.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.1.0...v4.2.0 +[4.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v4.0.0...v4.1.0 +[4.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v3.1.0...v4.0.0 +[3.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v3.0.0...v3.1.0 +[3.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.5...v3.0.0 +[2.6.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.4...v2.6.5 +[2.6.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.3...v2.6.4 +[2.6.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.2...v2.6.3 +[2.6.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.1...v2.6.2 +[2.6.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.6.0...v2.6.1 +[2.6.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.5.2...v2.6.0 +[2.5.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.5.1...v2.5.2 +[2.5.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.5.0...v2.5.1 +[2.5.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.6...v2.5.0 +[2.4.6]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.5...v2.4.6 +[2.4.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.4...v2.4.5 +[2.4.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.3...v2.4.4 +[2.4.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.2...v2.4.3 +[2.4.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.1...v2.4.2 +[2.4.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.4.0...v2.4.1 +[2.4.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.3.0...v2.4.0 +[2.3.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.2.1...v2.3.0 +[2.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.2.0...v2.2.1 +[2.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.1.0...v2.2.0 +[2.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.0.1...v2.1.0 +[2.0.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v2.0.0...v2.0.1 +[2.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.1.2...v2.0.0 +[1.1.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.1.1...v1.1.2 +[1.1.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.0.2...v1.1.0 +[1.0.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.0.1...v1.0.2 +[1.0.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v1.0.0...v1.0.1 +[1.0.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.3...v1.0.0 +[0.4.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.2...v0.4.3 +[0.4.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.1...v0.4.2 +[0.4.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.11...v0.4.0 +[0.3.11]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.10...v0.3.11 +[0.3.10]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.3...v0.3.10 +[0.3.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.2...v0.3.3 +[0.3.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.1...v0.3.2 +[0.3.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.3.0...v0.3.1 +[0.3.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.2.2...v0.3.0 +[0.2.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.7...v0.2.0 +[0.1.7]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.6...v0.1.7 +[0.1.6]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.5...v0.1.6 +[0.1.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.4...v0.1.5 +[0.1.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.3...v0.1.4 +[0.1.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.2...v0.1.3 +[0.1.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.7...v0.1.0 +[0.0.7]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.6...v0.0.7 +[0.0.6]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.5...v0.0.6 +[0.0.5]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.4...v0.0.5 +[0.0.4]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.3...v0.0.4 +[0.0.3]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.2...v0.0.3 +[0.0.2]: https://github.com/oozcitak/xmlbuilder-js/compare/v0.0.1...v0.0.2 + diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/LICENSE new file mode 100644 index 0000000..e7cbac9 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +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. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/README.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/README.md new file mode 100644 index 0000000..d465aa4 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/README.md @@ -0,0 +1,85 @@ +# xmlbuilder-js + +An XML builder for [node.js](https://nodejs.org/) similar to +[java-xmlbuilder](https://github.com/jmurty/java-xmlbuilder). + +[![License](http://img.shields.io/npm/l/xmlbuilder.svg?style=flat-square)](http://opensource.org/licenses/MIT) +[![NPM Version](http://img.shields.io/npm/v/xmlbuilder.svg?style=flat-square)](https://npmjs.com/package/xmlbuilder) +[![NPM Downloads](https://img.shields.io/npm/dm/xmlbuilder.svg?style=flat-square)](https://npmjs.com/package/xmlbuilder) + +[![Build Status](http://img.shields.io/travis/oozcitak/xmlbuilder-js.svg?style=flat-square)](http://travis-ci.org/oozcitak/xmlbuilder-js) +[![Dev Dependency Status](http://img.shields.io/david/dev/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://david-dm.org/oozcitak/xmlbuilder-js) +[![Code Coverage](https://img.shields.io/coveralls/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://coveralls.io/github/oozcitak/xmlbuilder-js) + +### Installation: + +``` sh +npm install xmlbuilder +``` + +### Usage: + +``` js +var builder = require('xmlbuilder'); +var xml = builder.create('root') + .ele('xmlbuilder') + .ele('repo', {'type': 'git'}, 'git://github.com/oozcitak/xmlbuilder-js.git') + .end({ pretty: true}); + +console.log(xml); +``` + +will result in: + +``` xml + + + + git://github.com/oozcitak/xmlbuilder-js.git + + +``` + +It is also possible to convert objects into nodes: + +``` js +builder.create({ + root: { + xmlbuilder: { + repo: { + '@type': 'git', // attributes start with @ + '#text': 'git://github.com/oozcitak/xmlbuilder-js.git' // text node + } + } + } +}); +``` + +If you need to do some processing: + +``` js +var root = builder.create('squares'); +root.com('f(x) = x^2'); +for(var i = 1; i <= 5; i++) +{ + var item = root.ele('data'); + item.att('x', i); + item.att('y', i * i); +} +``` + +This will result in: + +``` xml + + + + + + + + + +``` + +See the [wiki](https://github.com/oozcitak/xmlbuilder-js/wiki) for details. diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/Utility.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/Utility.js new file mode 100644 index 0000000..aca1d1e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/Utility.js @@ -0,0 +1,139 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var assign, camelCase, capitalize, isArray, isEmpty, isFunction, isObject, isPlainObject, kebabCase, snakeCase, titleCase, words, + slice = [].slice, + hasProp = {}.hasOwnProperty; + + assign = function() { + var i, key, len, source, sources, target; + target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : []; + if (isFunction(Object.assign)) { + Object.assign.apply(null, arguments); + } else { + for (i = 0, len = sources.length; i < len; i++) { + source = sources[i]; + if (source != null) { + for (key in source) { + if (!hasProp.call(source, key)) continue; + target[key] = source[key]; + } + } + } + } + return target; + }; + + isFunction = function(val) { + return !!val && Object.prototype.toString.call(val) === '[object Function]'; + }; + + isObject = function(val) { + var ref; + return !!val && ((ref = typeof val) === 'function' || ref === 'object'); + }; + + isArray = function(val) { + if (isFunction(Array.isArray)) { + return Array.isArray(val); + } else { + return Object.prototype.toString.call(val) === '[object Array]'; + } + }; + + isEmpty = function(val) { + var key; + if (isArray(val)) { + return !val.length; + } else { + for (key in val) { + if (!hasProp.call(val, key)) continue; + return false; + } + return true; + } + }; + + isPlainObject = function(val) { + var ctor, proto; + return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object)); + }; + + words = function(val) { + return (val.split(/[-_\s]+|(?=[A-Z][a-z])/) || []).filter(function(n) { + return !!n; + }); + }; + + camelCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += index ? capitalize(word.toLowerCase()) : word.toLowerCase(); + } + return r; + }; + + titleCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += capitalize(word.toLowerCase()); + } + return r; + }; + + kebabCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += (index ? '-' : '') + word.toLowerCase(); + } + return r; + }; + + snakeCase = function(val) { + var i, index, len, r, ref, word; + r = ''; + ref = words(val); + for (index = i = 0, len = ref.length; i < len; index = ++i) { + word = ref[index]; + r += (index ? '_' : '') + word.toLowerCase(); + } + return r; + }; + + capitalize = function(val) { + return val.charAt(0).toUpperCase() + val.slice(1); + }; + + module.exports.assign = assign; + + module.exports.isFunction = isFunction; + + module.exports.isObject = isObject; + + module.exports.isArray = isArray; + + module.exports.isEmpty = isEmpty; + + module.exports.isPlainObject = isPlainObject; + + module.exports.camelCase = camelCase; + + module.exports.titleCase = titleCase; + + module.exports.kebabCase = kebabCase; + + module.exports.snakeCase = snakeCase; + + module.exports.capitalize = capitalize; + + module.exports.words = words; + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLAttribute.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLAttribute.js new file mode 100644 index 0000000..51ccebe --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLAttribute.js @@ -0,0 +1,31 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLAttribute; + + module.exports = XMLAttribute = (function() { + function XMLAttribute(parent, name, value) { + this.options = parent.options; + this.stringify = parent.stringify; + if (name == null) { + throw new Error("Missing attribute name of element " + parent.name); + } + if (value == null) { + throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); + } + this.name = this.stringify.attName(name); + this.value = this.stringify.attValue(value); + } + + XMLAttribute.prototype.clone = function() { + return Object.create(this); + }; + + XMLAttribute.prototype.toString = function(options) { + return this.options.writer.set(options).attribute(this); + }; + + return XMLAttribute; + + })(); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLCData.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLCData.js new file mode 100644 index 0000000..8ee861d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLCData.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLCData = (function(superClass) { + extend(XMLCData, superClass); + + function XMLCData(parent, text) { + XMLCData.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing CDATA text"); + } + this.text = this.stringify.cdata(text); + } + + XMLCData.prototype.clone = function() { + return Object.create(this); + }; + + XMLCData.prototype.toString = function(options) { + return this.options.writer.set(options).cdata(this); + }; + + return XMLCData; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLComment.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLComment.js new file mode 100644 index 0000000..2c987a3 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLComment.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLComment, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLComment = (function(superClass) { + extend(XMLComment, superClass); + + function XMLComment(parent, text) { + XMLComment.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing comment text"); + } + this.text = this.stringify.comment(text); + } + + XMLComment.prototype.clone = function() { + return Object.create(this); + }; + + XMLComment.prototype.toString = function(options) { + return this.options.writer.set(options).comment(this); + }; + + return XMLComment; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDAttList.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDAttList.js new file mode 100644 index 0000000..1d7e18e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDAttList.js @@ -0,0 +1,50 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDAttList, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDAttList = (function(superClass) { + extend(XMLDTDAttList, superClass); + + function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { + XMLDTDAttList.__super__.constructor.call(this, parent); + if (elementName == null) { + throw new Error("Missing DTD element name"); + } + if (attributeName == null) { + throw new Error("Missing DTD attribute name"); + } + if (!attributeType) { + throw new Error("Missing DTD attribute type"); + } + if (!defaultValueType) { + throw new Error("Missing DTD attribute default"); + } + if (defaultValueType.indexOf('#') !== 0) { + defaultValueType = '#' + defaultValueType; + } + if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { + throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); + } + if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { + throw new Error("Default value only applies to #FIXED or #DEFAULT"); + } + this.elementName = this.stringify.eleName(elementName); + this.attributeName = this.stringify.attName(attributeName); + this.attributeType = this.stringify.dtdAttType(attributeType); + this.defaultValue = this.stringify.dtdAttDefault(defaultValue); + this.defaultValueType = defaultValueType; + } + + XMLDTDAttList.prototype.toString = function(options) { + return this.options.writer.set(options).dtdAttList(this); + }; + + return XMLDTDAttList; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDElement.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDElement.js new file mode 100644 index 0000000..d206771 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDElement.js @@ -0,0 +1,35 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDElement, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDElement = (function(superClass) { + extend(XMLDTDElement, superClass); + + function XMLDTDElement(parent, name, value) { + XMLDTDElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing DTD element name"); + } + if (!value) { + value = '(#PCDATA)'; + } + if (Array.isArray(value)) { + value = '(' + value.join(',') + ')'; + } + this.name = this.stringify.eleName(name); + this.value = this.stringify.dtdElementValue(value); + } + + XMLDTDElement.prototype.toString = function(options) { + return this.options.writer.set(options).dtdElement(this); + }; + + return XMLDTDElement; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDEntity.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDEntity.js new file mode 100644 index 0000000..4cfd422 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDEntity.js @@ -0,0 +1,56 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDEntity, XMLNode, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isObject = require('./Utility').isObject; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDEntity = (function(superClass) { + extend(XMLDTDEntity, superClass); + + function XMLDTDEntity(parent, pe, name, value) { + XMLDTDEntity.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing entity name"); + } + if (value == null) { + throw new Error("Missing entity value"); + } + this.pe = !!pe; + this.name = this.stringify.eleName(name); + if (!isObject(value)) { + this.value = this.stringify.dtdEntityValue(value); + } else { + if (!value.pubID && !value.sysID) { + throw new Error("Public and/or system identifiers are required for an external entity"); + } + if (value.pubID && !value.sysID) { + throw new Error("System identifier is required for a public external entity"); + } + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + if (value.nData != null) { + this.nData = this.stringify.dtdNData(value.nData); + } + if (this.pe && this.nData) { + throw new Error("Notation declaration is not allowed in a parameter entity"); + } + } + } + + XMLDTDEntity.prototype.toString = function(options) { + return this.options.writer.set(options).dtdEntity(this); + }; + + return XMLDTDEntity; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDNotation.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDNotation.js new file mode 100644 index 0000000..8747d9d --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDTDNotation.js @@ -0,0 +1,37 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDNotation, XMLNode, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDTDNotation = (function(superClass) { + extend(XMLDTDNotation, superClass); + + function XMLDTDNotation(parent, name, value) { + XMLDTDNotation.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing notation name"); + } + if (!value.pubID && !value.sysID) { + throw new Error("Public or system identifiers are required for an external entity"); + } + this.name = this.stringify.eleName(name); + if (value.pubID != null) { + this.pubID = this.stringify.dtdPubID(value.pubID); + } + if (value.sysID != null) { + this.sysID = this.stringify.dtdSysID(value.sysID); + } + } + + XMLDTDNotation.prototype.toString = function(options) { + return this.options.writer.set(options).dtdNotation(this); + }; + + return XMLDTDNotation; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDeclaration.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDeclaration.js new file mode 100644 index 0000000..c8f2c06 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDeclaration.js @@ -0,0 +1,40 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDeclaration, XMLNode, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isObject = require('./Utility').isObject; + + XMLNode = require('./XMLNode'); + + module.exports = XMLDeclaration = (function(superClass) { + extend(XMLDeclaration, superClass); + + function XMLDeclaration(parent, version, encoding, standalone) { + var ref; + XMLDeclaration.__super__.constructor.call(this, parent); + if (isObject(version)) { + ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; + } + if (!version) { + version = '1.0'; + } + this.version = this.stringify.xmlVersion(version); + if (encoding != null) { + this.encoding = this.stringify.xmlEncoding(encoding); + } + if (standalone != null) { + this.standalone = this.stringify.xmlStandalone(standalone); + } + } + + XMLDeclaration.prototype.toString = function(options) { + return this.options.writer.set(options).declaration(this); + }; + + return XMLDeclaration; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocType.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocType.js new file mode 100644 index 0000000..fa5e020 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocType.js @@ -0,0 +1,107 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isObject = require('./Utility').isObject; + + XMLNode = require('./XMLNode'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + module.exports = XMLDocType = (function(superClass) { + extend(XMLDocType, superClass); + + function XMLDocType(parent, pubID, sysID) { + var ref, ref1; + XMLDocType.__super__.constructor.call(this, parent); + this.documentObject = parent; + if (isObject(pubID)) { + ref = pubID, pubID = ref.pubID, sysID = ref.sysID; + } + if (sysID == null) { + ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; + } + if (pubID != null) { + this.pubID = this.stringify.dtdPubID(pubID); + } + if (sysID != null) { + this.sysID = this.stringify.dtdSysID(sysID); + } + } + + XMLDocType.prototype.element = function(name, value) { + var child; + child = new XMLDTDElement(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var child; + child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.entity = function(name, value) { + var child; + child = new XMLDTDEntity(this, false, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.pEntity = function(name, value) { + var child; + child = new XMLDTDEntity(this, true, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.notation = function(name, value) { + var child; + child = new XMLDTDNotation(this, name, value); + this.children.push(child); + return this; + }; + + XMLDocType.prototype.toString = function(options) { + return this.options.writer.set(options).docType(this); + }; + + XMLDocType.prototype.ele = function(name, value) { + return this.element(name, value); + }; + + XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); + }; + + XMLDocType.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocType.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocType.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + XMLDocType.prototype.up = function() { + return this.root() || this.documentObject; + }; + + return XMLDocType; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocument.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocument.js new file mode 100644 index 0000000..2882faf --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocument.js @@ -0,0 +1,48 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + isPlainObject = require('./Utility').isPlainObject; + + XMLNode = require('./XMLNode'); + + XMLStringifier = require('./XMLStringifier'); + + XMLStringWriter = require('./XMLStringWriter'); + + module.exports = XMLDocument = (function(superClass) { + extend(XMLDocument, superClass); + + function XMLDocument(options) { + XMLDocument.__super__.constructor.call(this, null); + options || (options = {}); + if (!options.writer) { + options.writer = new XMLStringWriter(); + } + this.options = options; + this.stringify = new XMLStringifier(options); + this.isDocument = true; + } + + XMLDocument.prototype.end = function(writer) { + var writerOptions; + if (!writer) { + writer = this.options.writer; + } else if (isPlainObject(writer)) { + writerOptions = writer; + writer = this.options.writer.set(writerOptions); + } + return writer.document(this); + }; + + XMLDocument.prototype.toString = function(options) { + return this.options.writer.set(options).document(this); + }; + + return XMLDocument; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocumentCB.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocumentCB.js new file mode 100644 index 0000000..b8506e2 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLDocumentCB.js @@ -0,0 +1,402 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject; + + XMLElement = require('./XMLElement'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLRaw = require('./XMLRaw'); + + XMLText = require('./XMLText'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLAttribute = require('./XMLAttribute'); + + XMLStringifier = require('./XMLStringifier'); + + XMLStringWriter = require('./XMLStringWriter'); + + module.exports = XMLDocumentCB = (function() { + function XMLDocumentCB(options, onData, onEnd) { + var writerOptions; + options || (options = {}); + if (!options.writer) { + options.writer = new XMLStringWriter(options); + } else if (isPlainObject(options.writer)) { + writerOptions = options.writer; + options.writer = new XMLStringWriter(writerOptions); + } + this.options = options; + this.writer = options.writer; + this.stringify = new XMLStringifier(options); + this.onDataCallback = onData || function() {}; + this.onEndCallback = onEnd || function() {}; + this.currentNode = null; + this.currentLevel = -1; + this.openTags = {}; + this.documentStarted = false; + this.documentCompleted = false; + this.root = null; + } + + XMLDocumentCB.prototype.node = function(name, attributes, text) { + var ref1; + if (name == null) { + throw new Error("Missing node name"); + } + if (this.root && this.currentLevel === -1) { + throw new Error("Document can only have one root node"); + } + this.openCurrent(); + name = name.valueOf(); + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; + } + this.currentNode = new XMLElement(this, name, attributes); + this.currentNode.children = false; + this.currentLevel++; + this.openTags[this.currentLevel] = this.currentNode; + if (text != null) { + this.text(text); + } + return this; + }; + + XMLDocumentCB.prototype.element = function(name, attributes, text) { + if (this.currentNode && this.currentNode instanceof XMLDocType) { + return this.dtdElement.apply(this, arguments); + } else { + return this.node(name, attributes, text); + } + }; + + XMLDocumentCB.prototype.attribute = function(name, value) { + var attName, attValue; + if (!this.currentNode || this.currentNode.children) { + throw new Error("att() can only be used immediately after an ele() call in callback mode"); + } + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.currentNode.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLDocumentCB.prototype.text = function(value) { + var node; + this.openCurrent(); + node = new XMLText(this, value); + this.onData(this.writer.text(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.cdata = function(value) { + var node; + this.openCurrent(); + node = new XMLCData(this, value); + this.onData(this.writer.cdata(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.comment = function(value) { + var node; + this.openCurrent(); + node = new XMLComment(this, value); + this.onData(this.writer.comment(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.raw = function(value) { + var node; + this.openCurrent(); + node = new XMLRaw(this, value); + this.onData(this.writer.raw(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.instruction = function(target, value) { + var i, insTarget, insValue, len, node; + this.openCurrent(); + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (i = 0, len = target.length; i < len; i++) { + insTarget = target[i]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + node = new XMLProcessingInstruction(this, target, value); + this.onData(this.writer.processingInstruction(node, this.currentLevel + 1)); + } + return this; + }; + + XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) { + var node; + this.openCurrent(); + if (this.documentStarted) { + throw new Error("declaration() must be the first node"); + } + node = new XMLDeclaration(this, version, encoding, standalone); + this.onData(this.writer.declaration(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) { + this.openCurrent(); + if (root == null) { + throw new Error("Missing root node name"); + } + if (this.root) { + throw new Error("dtd() must come before the root node"); + } + this.currentNode = new XMLDocType(this, pubID, sysID); + this.currentNode.rootNodeName = root; + this.currentNode.children = false; + this.currentLevel++; + this.openTags[this.currentLevel] = this.currentNode; + return this; + }; + + XMLDocumentCB.prototype.dtdElement = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDElement(this, name, value); + this.onData(this.writer.dtdElement(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { + var node; + this.openCurrent(); + node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); + this.onData(this.writer.dtdAttList(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.entity = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDEntity(this, false, name, value); + this.onData(this.writer.dtdEntity(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.pEntity = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDEntity(this, true, name, value); + this.onData(this.writer.dtdEntity(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.notation = function(name, value) { + var node; + this.openCurrent(); + node = new XMLDTDNotation(this, name, value); + this.onData(this.writer.dtdNotation(node, this.currentLevel + 1)); + return this; + }; + + XMLDocumentCB.prototype.up = function() { + if (this.currentLevel < 0) { + throw new Error("The document node has no parent"); + } + if (this.currentNode) { + if (this.currentNode.children) { + this.closeNode(this.currentNode); + } else { + this.openNode(this.currentNode); + } + this.currentNode = null; + } else { + this.closeNode(this.openTags[this.currentLevel]); + } + delete this.openTags[this.currentLevel]; + this.currentLevel--; + return this; + }; + + XMLDocumentCB.prototype.end = function() { + while (this.currentLevel >= 0) { + this.up(); + } + return this.onEnd(); + }; + + XMLDocumentCB.prototype.openCurrent = function() { + if (this.currentNode) { + this.currentNode.children = true; + return this.openNode(this.currentNode); + } + }; + + XMLDocumentCB.prototype.openNode = function(node) { + if (!node.isOpen) { + if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) { + this.root = node; + } + this.onData(this.writer.openNode(node, this.currentLevel)); + return node.isOpen = true; + } + }; + + XMLDocumentCB.prototype.closeNode = function(node) { + if (!node.isClosed) { + this.onData(this.writer.closeNode(node, this.currentLevel)); + return node.isClosed = true; + } + }; + + XMLDocumentCB.prototype.onData = function(chunk) { + this.documentStarted = true; + return this.onDataCallback(chunk); + }; + + XMLDocumentCB.prototype.onEnd = function() { + this.documentCompleted = true; + return this.onEndCallback(); + }; + + XMLDocumentCB.prototype.ele = function() { + return this.element.apply(this, arguments); + }; + + XMLDocumentCB.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLDocumentCB.prototype.txt = function(value) { + return this.text(value); + }; + + XMLDocumentCB.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLDocumentCB.prototype.com = function(value) { + return this.comment(value); + }; + + XMLDocumentCB.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocumentCB.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) { + return this.doctype(root, pubID, sysID); + }; + + XMLDocumentCB.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLDocumentCB.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLDocumentCB.prototype.t = function(value) { + return this.text(value); + }; + + XMLDocumentCB.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLDocumentCB.prototype.c = function(value) { + return this.comment(value); + }; + + XMLDocumentCB.prototype.r = function(value) { + return this.raw(value); + }; + + XMLDocumentCB.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + XMLDocumentCB.prototype.att = function() { + if (this.currentNode && this.currentNode instanceof XMLDocType) { + return this.attList.apply(this, arguments); + } else { + return this.attribute.apply(this, arguments); + } + }; + + XMLDocumentCB.prototype.a = function() { + if (this.currentNode && this.currentNode instanceof XMLDocType) { + return this.attList.apply(this, arguments); + } else { + return this.attribute.apply(this, arguments); + } + }; + + XMLDocumentCB.prototype.ent = function(name, value) { + return this.entity(name, value); + }; + + XMLDocumentCB.prototype.pent = function(name, value) { + return this.pEntity(name, value); + }; + + XMLDocumentCB.prototype.not = function(name, value) { + return this.notation(name, value); + }; + + return XMLDocumentCB; + + })(); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLElement.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLElement.js new file mode 100644 index 0000000..620714b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLElement.js @@ -0,0 +1,111 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction; + + XMLNode = require('./XMLNode'); + + XMLAttribute = require('./XMLAttribute'); + + module.exports = XMLElement = (function(superClass) { + extend(XMLElement, superClass); + + function XMLElement(parent, name, attributes) { + XMLElement.__super__.constructor.call(this, parent); + if (name == null) { + throw new Error("Missing element name"); + } + this.name = this.stringify.eleName(name); + this.attributes = {}; + if (attributes != null) { + this.attribute(attributes); + } + if (parent.isDocument) { + this.isRoot = true; + this.documentObject = parent; + parent.rootObject = this; + } + } + + XMLElement.prototype.clone = function() { + var att, attName, clonedSelf, ref1; + clonedSelf = Object.create(this); + if (clonedSelf.isRoot) { + clonedSelf.documentObject = null; + } + clonedSelf.attributes = {}; + ref1 = this.attributes; + for (attName in ref1) { + if (!hasProp.call(ref1, attName)) continue; + att = ref1[attName]; + clonedSelf.attributes[attName] = att.clone(); + } + clonedSelf.children = []; + this.children.forEach(function(child) { + var clonedChild; + clonedChild = child.clone(); + clonedChild.parent = clonedSelf; + return clonedSelf.children.push(clonedChild); + }); + return clonedSelf; + }; + + XMLElement.prototype.attribute = function(name, value) { + var attName, attValue; + if (name != null) { + name = name.valueOf(); + } + if (isObject(name)) { + for (attName in name) { + if (!hasProp.call(name, attName)) continue; + attValue = name[attName]; + this.attribute(attName, attValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + if (!this.options.skipNullAttributes || (value != null)) { + this.attributes[name] = new XMLAttribute(this, name, value); + } + } + return this; + }; + + XMLElement.prototype.removeAttribute = function(name) { + var attName, i, len; + if (name == null) { + throw new Error("Missing attribute name"); + } + name = name.valueOf(); + if (Array.isArray(name)) { + for (i = 0, len = name.length; i < len; i++) { + attName = name[i]; + delete this.attributes[attName]; + } + } else { + delete this.attributes[name]; + } + return this; + }; + + XMLElement.prototype.toString = function(options) { + return this.options.writer.set(options).element(this); + }; + + XMLElement.prototype.att = function(name, value) { + return this.attribute(name, value); + }; + + XMLElement.prototype.a = function(name, value) { + return this.attribute(name, value); + }; + + return XMLElement; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLNode.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLNode.js new file mode 100644 index 0000000..1b3b456 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLNode.js @@ -0,0 +1,432 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty; + + XMLElement = null; + + XMLCData = null; + + XMLComment = null; + + XMLDeclaration = null; + + XMLDocType = null; + + XMLRaw = null; + + XMLText = null; + + XMLProcessingInstruction = null; + + module.exports = XMLNode = (function() { + function XMLNode(parent) { + this.parent = parent; + if (this.parent) { + this.options = this.parent.options; + this.stringify = this.parent.stringify; + } + this.children = []; + if (!XMLElement) { + XMLElement = require('./XMLElement'); + XMLCData = require('./XMLCData'); + XMLComment = require('./XMLComment'); + XMLDeclaration = require('./XMLDeclaration'); + XMLDocType = require('./XMLDocType'); + XMLRaw = require('./XMLRaw'); + XMLText = require('./XMLText'); + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + } + } + + XMLNode.prototype.element = function(name, attributes, text) { + var childNode, item, j, k, key, lastChild, len, len1, ref1, val; + lastChild = null; + if (attributes == null) { + attributes = {}; + } + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; + } + if (name != null) { + name = name.valueOf(); + } + if (Array.isArray(name)) { + for (j = 0, len = name.length; j < len; j++) { + item = name[j]; + lastChild = this.element(item); + } + } else if (isFunction(name)) { + lastChild = this.element(name.apply()); + } else if (isObject(name)) { + for (key in name) { + if (!hasProp.call(name, key)) continue; + val = name[key]; + if (isFunction(val)) { + val = val.apply(); + } + if ((isObject(val)) && (isEmpty(val))) { + val = null; + } + if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { + lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); + } else if (!this.options.separateArrayItems && Array.isArray(val)) { + for (k = 0, len1 = val.length; k < len1; k++) { + item = val[k]; + childNode = {}; + childNode[key] = item; + lastChild = this.element(childNode); + } + } else if (isObject(val)) { + lastChild = this.element(key); + lastChild.element(val); + } else { + lastChild = this.element(key, val); + } + } + } else { + if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { + lastChild = this.text(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { + lastChild = this.cdata(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { + lastChild = this.comment(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { + lastChild = this.raw(text); + } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) { + lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text); + } else { + lastChild = this.node(name, attributes, text); + } + } + if (lastChild == null) { + throw new Error("Could not create any elements with: " + name); + } + return lastChild; + }; + + XMLNode.prototype.insertBefore = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.insertAfter = function(name, attributes, text) { + var child, i, removed; + if (this.isRoot) { + throw new Error("Cannot insert elements at root level"); + } + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.element(name, attributes, text); + Array.prototype.push.apply(this.parent.children, removed); + return child; + }; + + XMLNode.prototype.remove = function() { + var i, ref1; + if (this.isRoot) { + throw new Error("Cannot remove the root element"); + } + i = this.parent.children.indexOf(this); + [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1; + return this.parent; + }; + + XMLNode.prototype.node = function(name, attributes, text) { + var child, ref1; + if (name != null) { + name = name.valueOf(); + } + attributes || (attributes = {}); + attributes = attributes.valueOf(); + if (!isObject(attributes)) { + ref1 = [attributes, text], text = ref1[0], attributes = ref1[1]; + } + child = new XMLElement(this, name, attributes); + if (text != null) { + child.text(text); + } + this.children.push(child); + return child; + }; + + XMLNode.prototype.text = function(value) { + var child; + child = new XMLText(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.cdata = function(value) { + var child; + child = new XMLCData(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.comment = function(value) { + var child; + child = new XMLComment(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.commentBefore = function(value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.comment(value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.commentAfter = function(value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.comment(value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.raw = function(value) { + var child; + child = new XMLRaw(this, value); + this.children.push(child); + return this; + }; + + XMLNode.prototype.instruction = function(target, value) { + var insTarget, insValue, instruction, j, len; + if (target != null) { + target = target.valueOf(); + } + if (value != null) { + value = value.valueOf(); + } + if (Array.isArray(target)) { + for (j = 0, len = target.length; j < len; j++) { + insTarget = target[j]; + this.instruction(insTarget); + } + } else if (isObject(target)) { + for (insTarget in target) { + if (!hasProp.call(target, insTarget)) continue; + insValue = target[insTarget]; + this.instruction(insTarget, insValue); + } + } else { + if (isFunction(value)) { + value = value.apply(); + } + instruction = new XMLProcessingInstruction(this, target, value); + this.children.push(instruction); + } + return this; + }; + + XMLNode.prototype.instructionBefore = function(target, value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i); + child = this.parent.instruction(target, value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.instructionAfter = function(target, value) { + var child, i, removed; + i = this.parent.children.indexOf(this); + removed = this.parent.children.splice(i + 1); + child = this.parent.instruction(target, value); + Array.prototype.push.apply(this.parent.children, removed); + return this; + }; + + XMLNode.prototype.declaration = function(version, encoding, standalone) { + var doc, xmldec; + doc = this.document(); + xmldec = new XMLDeclaration(doc, version, encoding, standalone); + if (doc.children[0] instanceof XMLDeclaration) { + doc.children[0] = xmldec; + } else { + doc.children.unshift(xmldec); + } + return doc.root() || doc; + }; + + XMLNode.prototype.doctype = function(pubID, sysID) { + var child, doc, doctype, i, j, k, len, len1, ref1, ref2; + doc = this.document(); + doctype = new XMLDocType(doc, pubID, sysID); + ref1 = doc.children; + for (i = j = 0, len = ref1.length; j < len; i = ++j) { + child = ref1[i]; + if (child instanceof XMLDocType) { + doc.children[i] = doctype; + return doctype; + } + } + ref2 = doc.children; + for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) { + child = ref2[i]; + if (child.isRoot) { + doc.children.splice(i, 0, doctype); + return doctype; + } + } + doc.children.push(doctype); + return doctype; + }; + + XMLNode.prototype.up = function() { + if (this.isRoot) { + throw new Error("The root node has no parent. Use doc() if you need to get the document object."); + } + return this.parent; + }; + + XMLNode.prototype.root = function() { + var node; + node = this; + while (node) { + if (node.isDocument) { + return node.rootObject; + } else if (node.isRoot) { + return node; + } else { + node = node.parent; + } + } + }; + + XMLNode.prototype.document = function() { + var node; + node = this; + while (node) { + if (node.isDocument) { + return node; + } else { + node = node.parent; + } + } + }; + + XMLNode.prototype.end = function(options) { + return this.document().end(options); + }; + + XMLNode.prototype.prev = function() { + var i; + i = this.parent.children.indexOf(this); + if (i < 1) { + throw new Error("Already at the first node"); + } + return this.parent.children[i - 1]; + }; + + XMLNode.prototype.next = function() { + var i; + i = this.parent.children.indexOf(this); + if (i === -1 || i === this.parent.children.length - 1) { + throw new Error("Already at the last node"); + } + return this.parent.children[i + 1]; + }; + + XMLNode.prototype.importDocument = function(doc) { + var clonedRoot; + clonedRoot = doc.root().clone(); + clonedRoot.parent = this; + clonedRoot.isRoot = false; + this.children.push(clonedRoot); + return this; + }; + + XMLNode.prototype.ele = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.nod = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.txt = function(value) { + return this.text(value); + }; + + XMLNode.prototype.dat = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.com = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.ins = function(target, value) { + return this.instruction(target, value); + }; + + XMLNode.prototype.doc = function() { + return this.document(); + }; + + XMLNode.prototype.dec = function(version, encoding, standalone) { + return this.declaration(version, encoding, standalone); + }; + + XMLNode.prototype.dtd = function(pubID, sysID) { + return this.doctype(pubID, sysID); + }; + + XMLNode.prototype.e = function(name, attributes, text) { + return this.element(name, attributes, text); + }; + + XMLNode.prototype.n = function(name, attributes, text) { + return this.node(name, attributes, text); + }; + + XMLNode.prototype.t = function(value) { + return this.text(value); + }; + + XMLNode.prototype.d = function(value) { + return this.cdata(value); + }; + + XMLNode.prototype.c = function(value) { + return this.comment(value); + }; + + XMLNode.prototype.r = function(value) { + return this.raw(value); + }; + + XMLNode.prototype.i = function(target, value) { + return this.instruction(target, value); + }; + + XMLNode.prototype.u = function() { + return this.up(); + }; + + XMLNode.prototype.importXMLBuilder = function(doc) { + return this.importDocument(doc); + }; + + return XMLNode; + + })(); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js new file mode 100644 index 0000000..a15be34 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js @@ -0,0 +1,35 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLNode, XMLProcessingInstruction, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLProcessingInstruction = (function(superClass) { + extend(XMLProcessingInstruction, superClass); + + function XMLProcessingInstruction(parent, target, value) { + XMLProcessingInstruction.__super__.constructor.call(this, parent); + if (target == null) { + throw new Error("Missing instruction target"); + } + this.target = this.stringify.insTarget(target); + if (value) { + this.value = this.stringify.insValue(value); + } + } + + XMLProcessingInstruction.prototype.clone = function() { + return Object.create(this); + }; + + XMLProcessingInstruction.prototype.toString = function(options) { + return this.options.writer.set(options).processingInstruction(this); + }; + + return XMLProcessingInstruction; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLRaw.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLRaw.js new file mode 100644 index 0000000..152f83b --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLRaw.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLNode, XMLRaw, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLNode = require('./XMLNode'); + + module.exports = XMLRaw = (function(superClass) { + extend(XMLRaw, superClass); + + function XMLRaw(parent, text) { + XMLRaw.__super__.constructor.call(this, parent); + if (text == null) { + throw new Error("Missing raw text"); + } + this.value = this.stringify.raw(text); + } + + XMLRaw.prototype.clone = function() { + return Object.create(this); + }; + + XMLRaw.prototype.toString = function(options) { + return this.options.writer.set(options).raw(this); + }; + + return XMLRaw; + + })(XMLNode); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStreamWriter.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStreamWriter.js new file mode 100644 index 0000000..10a0926 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStreamWriter.js @@ -0,0 +1,278 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLElement = require('./XMLElement'); + + XMLRaw = require('./XMLRaw'); + + XMLText = require('./XMLText'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLWriterBase = require('./XMLWriterBase'); + + module.exports = XMLStreamWriter = (function(superClass) { + extend(XMLStreamWriter, superClass); + + function XMLStreamWriter(stream, options) { + this.stream = stream; + XMLStreamWriter.__super__.constructor.call(this, options); + } + + XMLStreamWriter.prototype.document = function(doc) { + var child, i, j, len, len1, ref, ref1, results; + ref = doc.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + child.isLastRootNode = false; + } + doc.children[doc.children.length - 1].isLastRootNode = true; + ref1 = doc.children; + results = []; + for (j = 0, len1 = ref1.length; j < len1; j++) { + child = ref1[j]; + switch (false) { + case !(child instanceof XMLDeclaration): + results.push(this.declaration(child)); + break; + case !(child instanceof XMLDocType): + results.push(this.docType(child)); + break; + case !(child instanceof XMLComment): + results.push(this.comment(child)); + break; + case !(child instanceof XMLProcessingInstruction): + results.push(this.processingInstruction(child)); + break; + default: + results.push(this.element(child)); + } + } + return results; + }; + + XMLStreamWriter.prototype.attribute = function(att) { + return this.stream.write(' ' + att.name + '="' + att.value + '"'); + }; + + XMLStreamWriter.prototype.cdata = function(node, level) { + return this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.comment = function(node, level) { + return this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.declaration = function(node, level) { + this.stream.write(this.space(level)); + this.stream.write(''); + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.docType = function(node, level) { + var child, i, len, ref; + level || (level = 0); + this.stream.write(this.space(level)); + this.stream.write(' 0) { + this.stream.write(' ['); + this.stream.write(this.endline(node)); + ref = node.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + switch (false) { + case !(child instanceof XMLDTDAttList): + this.dtdAttList(child, level + 1); + break; + case !(child instanceof XMLDTDElement): + this.dtdElement(child, level + 1); + break; + case !(child instanceof XMLDTDEntity): + this.dtdEntity(child, level + 1); + break; + case !(child instanceof XMLDTDNotation): + this.dtdNotation(child, level + 1); + break; + case !(child instanceof XMLCData): + this.cdata(child, level + 1); + break; + case !(child instanceof XMLComment): + this.comment(child, level + 1); + break; + case !(child instanceof XMLProcessingInstruction): + this.processingInstruction(child, level + 1); + break; + default: + throw new Error("Unknown DTD node type: " + child.constructor.name); + } + } + this.stream.write(']'); + } + this.stream.write('>'); + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.element = function(node, level) { + var att, child, i, len, name, ref, ref1, space; + level || (level = 0); + space = this.space(level); + this.stream.write(space + '<' + node.name); + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + this.attribute(att); + } + if (node.children.length === 0 || node.children.every(function(e) { + return e.value === ''; + })) { + if (this.allowEmpty) { + this.stream.write('>'); + } else { + this.stream.write('/>'); + } + } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) { + this.stream.write('>'); + this.stream.write(node.children[0].value); + this.stream.write(''); + } else { + this.stream.write('>' + this.newline); + ref1 = node.children; + for (i = 0, len = ref1.length; i < len; i++) { + child = ref1[i]; + switch (false) { + case !(child instanceof XMLCData): + this.cdata(child, level + 1); + break; + case !(child instanceof XMLComment): + this.comment(child, level + 1); + break; + case !(child instanceof XMLElement): + this.element(child, level + 1); + break; + case !(child instanceof XMLRaw): + this.raw(child, level + 1); + break; + case !(child instanceof XMLText): + this.text(child, level + 1); + break; + case !(child instanceof XMLProcessingInstruction): + this.processingInstruction(child, level + 1); + break; + default: + throw new Error("Unknown XML node type: " + child.constructor.name); + } + } + this.stream.write(space + ''); + } + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.processingInstruction = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.raw = function(node, level) { + return this.stream.write(this.space(level) + node.value + this.endline(node)); + }; + + XMLStreamWriter.prototype.text = function(node, level) { + return this.stream.write(this.space(level) + node.value + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdAttList = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdElement = function(node, level) { + return this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdEntity = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdNotation = function(node, level) { + this.stream.write(this.space(level) + '' + this.endline(node)); + }; + + XMLStreamWriter.prototype.endline = function(node) { + if (!node.isLastRootNode) { + return this.newline; + } else { + return ''; + } + }; + + return XMLStreamWriter; + + })(XMLWriterBase); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringWriter.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringWriter.js new file mode 100644 index 0000000..3164006 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringWriter.js @@ -0,0 +1,302 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + XMLDeclaration = require('./XMLDeclaration'); + + XMLDocType = require('./XMLDocType'); + + XMLCData = require('./XMLCData'); + + XMLComment = require('./XMLComment'); + + XMLElement = require('./XMLElement'); + + XMLRaw = require('./XMLRaw'); + + XMLText = require('./XMLText'); + + XMLProcessingInstruction = require('./XMLProcessingInstruction'); + + XMLDTDAttList = require('./XMLDTDAttList'); + + XMLDTDElement = require('./XMLDTDElement'); + + XMLDTDEntity = require('./XMLDTDEntity'); + + XMLDTDNotation = require('./XMLDTDNotation'); + + XMLWriterBase = require('./XMLWriterBase'); + + module.exports = XMLStringWriter = (function(superClass) { + extend(XMLStringWriter, superClass); + + function XMLStringWriter(options) { + XMLStringWriter.__super__.constructor.call(this, options); + } + + XMLStringWriter.prototype.document = function(doc) { + var child, i, len, r, ref; + r = ''; + ref = doc.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + r += (function() { + switch (false) { + case !(child instanceof XMLDeclaration): + return this.declaration(child); + case !(child instanceof XMLDocType): + return this.docType(child); + case !(child instanceof XMLComment): + return this.comment(child); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child); + default: + return this.element(child, 0); + } + }).call(this); + } + if (this.pretty && r.slice(-this.newline.length) === this.newline) { + r = r.slice(0, -this.newline.length); + } + return r; + }; + + XMLStringWriter.prototype.attribute = function(att) { + return ' ' + att.name + '="' + att.value + '"'; + }; + + XMLStringWriter.prototype.cdata = function(node, level) { + return this.space(level) + '' + this.newline; + }; + + XMLStringWriter.prototype.comment = function(node, level) { + return this.space(level) + '' + this.newline; + }; + + XMLStringWriter.prototype.declaration = function(node, level) { + var r; + r = this.space(level); + r += ''; + r += this.newline; + return r; + }; + + XMLStringWriter.prototype.docType = function(node, level) { + var child, i, len, r, ref; + level || (level = 0); + r = this.space(level); + r += ' 0) { + r += ' ['; + r += this.newline; + ref = node.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + r += (function() { + switch (false) { + case !(child instanceof XMLDTDAttList): + return this.dtdAttList(child, level + 1); + case !(child instanceof XMLDTDElement): + return this.dtdElement(child, level + 1); + case !(child instanceof XMLDTDEntity): + return this.dtdEntity(child, level + 1); + case !(child instanceof XMLDTDNotation): + return this.dtdNotation(child, level + 1); + case !(child instanceof XMLCData): + return this.cdata(child, level + 1); + case !(child instanceof XMLComment): + return this.comment(child, level + 1); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child, level + 1); + default: + throw new Error("Unknown DTD node type: " + child.constructor.name); + } + }).call(this); + } + r += ']'; + } + r += '>'; + r += this.newline; + return r; + }; + + XMLStringWriter.prototype.element = function(node, level) { + var att, child, i, len, name, r, ref, ref1, space; + level || (level = 0); + space = this.space(level); + r = ''; + r += space + '<' + node.name; + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + r += this.attribute(att); + } + if (node.children.length === 0 || node.children.every(function(e) { + return e.value === ''; + })) { + if (this.allowEmpty) { + r += '>' + this.newline; + } else { + r += '/>' + this.newline; + } + } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) { + r += '>'; + r += node.children[0].value; + r += '' + this.newline; + } else { + r += '>' + this.newline; + ref1 = node.children; + for (i = 0, len = ref1.length; i < len; i++) { + child = ref1[i]; + r += (function() { + switch (false) { + case !(child instanceof XMLCData): + return this.cdata(child, level + 1); + case !(child instanceof XMLComment): + return this.comment(child, level + 1); + case !(child instanceof XMLElement): + return this.element(child, level + 1); + case !(child instanceof XMLRaw): + return this.raw(child, level + 1); + case !(child instanceof XMLText): + return this.text(child, level + 1); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child, level + 1); + default: + throw new Error("Unknown XML node type: " + child.constructor.name); + } + }).call(this); + } + r += space + '' + this.newline; + } + return r; + }; + + XMLStringWriter.prototype.processingInstruction = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.raw = function(node, level) { + return this.space(level) + node.value + this.newline; + }; + + XMLStringWriter.prototype.text = function(node, level) { + return this.space(level) + node.value + this.newline; + }; + + XMLStringWriter.prototype.dtdAttList = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.dtdElement = function(node, level) { + return this.space(level) + '' + this.newline; + }; + + XMLStringWriter.prototype.dtdEntity = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.dtdNotation = function(node, level) { + var r; + r = this.space(level) + '' + this.newline; + return r; + }; + + XMLStringWriter.prototype.openNode = function(node, level) { + var att, name, r, ref; + level || (level = 0); + if (node instanceof XMLElement) { + r = this.space(level) + '<' + node.name; + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + r += this.attribute(att); + } + r += (node.children ? '>' : '/>') + this.newline; + return r; + } else { + r = this.space(level) + '') + this.newline; + return r; + } + }; + + XMLStringWriter.prototype.closeNode = function(node, level) { + level || (level = 0); + switch (false) { + case !(node instanceof XMLElement): + return this.space(level) + '' + this.newline; + case !(node instanceof XMLDocType): + return this.space(level) + ']>' + this.newline; + } + }; + + return XMLStringWriter; + + })(XMLWriterBase); + +}).call(this); diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringifier.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringifier.js new file mode 100644 index 0000000..f549461 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmlbuilder/lib/XMLStringifier.js @@ -0,0 +1,192 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var XMLStringifier, camelCase, kebabCase, ref, snakeCase, titleCase, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + hasProp = {}.hasOwnProperty; + + ref = require('./Utility'), camelCase = ref.camelCase, titleCase = ref.titleCase, kebabCase = ref.kebabCase, snakeCase = ref.snakeCase; + + module.exports = XMLStringifier = (function() { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref1, value; + options || (options = {}); + this.allowSurrogateChars = options.allowSurrogateChars; + this.noDoubleEncoding = options.noDoubleEncoding; + this.textCase = options.textCase; + ref1 = options.stringify || {}; + for (key in ref1) { + if (!hasProp.call(ref1, key)) continue; + value = ref1[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function(val) { + val = '' + val || ''; + val = this.applyCase(val); + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function(val) { + val = '' + val || ''; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function(val) { + val = '' + val || ''; + val = val.replace(']]>', ']]]]>'); + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function(val) { + val = '' + val || ''; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.attName = function(val) { + val = '' + val || ''; + return val = this.applyCase(val); + }; + + XMLStringifier.prototype.attValue = function(val) { + val = '' + val || ''; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.insValue = function(val) { + val = '' + val || ''; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function(val) { + val = '' + val || ''; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function(val) { + val = '' + val || ''; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function(val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdSysID = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdElementValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttType = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdAttDefault = function(val) { + if (val != null) { + return '' + val || ''; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.dtdNData = function(val) { + return '' + val || ''; + }; + + XMLStringifier.prototype.convertAttKey = '@'; + + XMLStringifier.prototype.convertPIKey = '?'; + + XMLStringifier.prototype.convertTextKey = '#text'; + + XMLStringifier.prototype.convertCDataKey = '#cdata'; + + XMLStringifier.prototype.convertCommentKey = '#comment'; + + XMLStringifier.prototype.convertRawKey = '#raw'; + + XMLStringifier.prototype.assertLegalChar = function(str) { + var chars, chr; + if (this.allowSurrogateChars) { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; + } else { + chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; + } + chr = str.match(chars); + if (chr) { + throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); + } + return str; + }; + + XMLStringifier.prototype.applyCase = function(str) { + switch (this.textCase) { + case "camel": + return camelCase(str); + case "title": + return titleCase(str); + case "kebab": + case "lower": + return kebabCase(str); + case "snake": + return snakeCase(str); + case "upper": + return kebabCase(str).toUpperCase(); + default: + return str; + } + }; + + XMLStringifier.prototype.elEscape = function(str) { + var ampregex; + ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; + return str.replace(ampregex, '&').replace(//g, '>').replace(/\r/g, ' '); + }; + + XMLStringifier.prototype.attEscape = function(str) { + var ampregex; + ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; + return str.replace(ampregex, '&').replace(/=4.0" + }, + "homepage": "http://github.com/oozcitak/xmlbuilder-js", + "keywords": [ + "xml", + "xmlbuilder" + ], + "license": "MIT", + "main": "./lib/index", + "name": "xmlbuilder", + "repository": { + "type": "git", + "url": "git://github.com/oozcitak/xmlbuilder-js.git" + }, + "scripts": { + "postpublish": "rm -rf lib", + "prepublish": "coffee -co lib src", + "test": "mocha && istanbul report text lcov" + }, + "version": "8.2.2" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.npmignore b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.npmignore new file mode 100644 index 0000000..b094a44 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.npmignore @@ -0,0 +1,5 @@ +test +t +travis.yml +.project +changelog diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.travis.yml b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.travis.yml new file mode 100644 index 0000000..b95408e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/.travis.yml @@ -0,0 +1,22 @@ +language: node_js + +node_js: + - '0.10' + +branches: + only: + - master + - proof + - travis-ci + +# Not using `npm install --dev` because it is recursive. It will pull in the all +# development dependencies for CoffeeScript. Way too much spew in the Travis CI +# build output. + +before_install: + - npm install + - npm install istanbul coveralls + +env: + global: + - secure: "BxUHTsa1WVANLQoimilbZwa1MCWSdM9hOmPWBE/rsYb7uT/iiqkRXXwnWhKtN5CLvTvIQbiAzq4iyPID0S8UHrnxClYQrOuA6QkrtwgIEuDAmijao/bgxobPOremvkwXcpMGIwzYKyYQQtSEaEIQbqf6gSSKW9dBh/GZ/vfTsqo=" diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/LICENSE b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/LICENSE new file mode 100644 index 0000000..68a9b5e --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/LICENSE @@ -0,0 +1,8 @@ +You can choose any one of those: + +The MIT License (MIT): + +link:http://opensource.org/licenses/MIT + +LGPL: +http://www.gnu.org/licenses/lgpl.html diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/__package__.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/__package__.js new file mode 100644 index 0000000..b4cad28 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/__package__.js @@ -0,0 +1,4 @@ +this.addScript('dom.js',['DOMImplementation','XMLSerializer']); +this.addScript('dom-parser.js',['DOMHandler','DOMParser'], + ['DOMImplementation','XMLReader']); +this.addScript('sax.js','XMLReader'); \ No newline at end of file diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/changelog b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/changelog new file mode 100644 index 0000000..ab815bb --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/changelog @@ -0,0 +1,14 @@ +### Version 0.1.16 + +Sat May 4 14:58:03 UTC 2013 + + * Correctly handle multibyte Unicode greater than two byts. #57. #56. + * Initial unit testing and test coverage. #53. #46. #19. + * Create Bower `component.json` #52. + +### Version 0.1.8 + + * Add: some test case from node-o3-xml(excludes xpath support) + * Fix: remove existed attribute before setting (bug introduced in v0.1.5) + * Fix: index direct access for childNodes and any NodeList collection(not w3c standard) + * Fix: remove last child bug diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/component.json b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/component.json new file mode 100644 index 0000000..93b4d57 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/component.json @@ -0,0 +1,10 @@ +{ + "name": "xmldom", + "version": "0.1.15", + "main": "dom-parser.js", + "ignore": [ + "**/.*", + "node_modules", + "components" + ] +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom-parser.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom-parser.js new file mode 100644 index 0000000..41d5226 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom-parser.js @@ -0,0 +1,251 @@ +function DOMParser(options){ + this.options = options ||{locator:{}}; + +} +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} + +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error('[xmldom fatalError]\t'+error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +//if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +//} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom.js new file mode 100644 index 0000000..b290df0 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/dom.js @@ -0,0 +1,1244 @@ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + }, + toString:function(isHTML,nodeFilter){ + for(var buf = [], i = 0;i=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + //console.log() + var i = this.length; + while(i--){ + var attr = this[i]; + //console.log(attr.nodeName,key) + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.implementation = this; + doc.childNodes = new NodeList(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == ELEMENT_NODE){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + //console.log(this == oldAttr.ownerElement) + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){ + return nodeSerializeToString.call(node,isHtml,nodeFilter); +} +Node.prototype.toString = nodeSerializeToString; +function nodeSerializeToString(isHtml,nodeFilter){ + var buf = []; + var refNode = this.nodeType == 9?this.documentElement:this; + var prefix = refNode.prefix; + var uri = refNode.namespaceURI; + + if(uri && prefix == null){ + //console.log(prefix) + var prefix = refNode.lookupPrefix(uri); + if(prefix == null){ + //isHTML = true; + var visibleNamespaces=[ + {namespace:uri,prefix:null} + //{namespace:uri,prefix:''} + ] + } + } + serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces); + //console.log('###',this.nodeType,uri,prefix,buf.join('')) + return buf.join(''); +} +function needNamespaceDefine(node,isHTML, visibleNamespaces) { + var prefix = node.prefix||''; + var uri = node.namespaceURI; + if (!prefix && !uri){ + return false; + } + if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" + || uri == 'http://www.w3.org/2000/xmlns/'){ + return false; + } + + var i = visibleNamespaces.length + //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces) + while (i--) { + var ns = visibleNamespaces[i]; + // get namespace prefix + //console.log(node.nodeType,node.tagName,ns.prefix,prefix) + if (ns.prefix == prefix){ + return ns.namespace != uri; + } + } + //console.log(isHTML,uri,prefix=='') + //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){ + // return false; + //} + //node.flag = '11111' + //console.error(3,true,node.flag,node.prefix,node.namespaceURI) + return true; +} +function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){ + if(nodeFilter){ + node = nodeFilter(node); + if(node){ + if(typeof node == 'string'){ + buf.push(node); + return; + } + }else{ + return; + } + //buf.sort.apply(attrs, attributeSorter); + } + switch(node.nodeType){ + case ELEMENT_NODE: + if (!visibleNamespaces) visibleNamespaces = []; + var startVisibleNamespaces = visibleNamespaces.length; + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + + isHTML = (htmlns === node.namespaceURI) ||isHTML + buf.push('<',nodeName); + + + + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + while(child){ + if(child.data){ + buf.push(child.data); + }else{ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + } + child = child.nextSibling; + } + }else + { + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + // remove added visible namespaces + //visibleNamespaces.length = startVisibleNamespaces; + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i=0.1" + }, + "homepage": "https://github.com/jindw/xmldom", + "keywords": [ + "w3c", + "dom", + "xml", + "parser", + "javascript", + "DOMParser", + "XMLSerializer" + ], + "licenses": [ + { + "type": "LGPL", + "url": "http://www.gnu.org/licenses/lgpl.html", + "MIT": "http://opensource.org/licenses/MIT" + } + ], + "main": "./dom-parser.js", + "maintainers": [ + { + "name": "jindw", + "email": "jindw@xidea.org", + "url": "http://www.xidea.org" + } + ], + "name": "xmldom", + "repository": { + "type": "git", + "url": "git://github.com/jindw/xmldom.git" + }, + "scripts": { + "test": "proof platform win32 && proof test */*/*.t.js || t/test" + }, + "version": "0.1.27" +} diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/readme.md b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/readme.md new file mode 100644 index 0000000..f832c44 --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/readme.md @@ -0,0 +1,219 @@ +# XMLDOM [![Build Status](https://secure.travis-ci.org/bigeasy/xmldom.png?branch=master)](http://travis-ci.org/bigeasy/xmldom) [![Coverage Status](https://coveralls.io/repos/bigeasy/xmldom/badge.png?branch=master)](https://coveralls.io/r/bigeasy/xmldom) [![NPM version](https://badge.fury.io/js/xmldom.png)](http://badge.fury.io/js/xmldom) + +A JavaScript implementation of W3C DOM for Node.js, Rhino and the browser. Fully +compatible with `W3C DOM level2`; and some compatible with `level3`. Supports +`DOMParser` and `XMLSerializer` interface such as in browser. + +Install: +------- +>npm install xmldom + +Example: +==== +```javascript +var DOMParser = require('xmldom').DOMParser; +var doc = new DOMParser().parseFromString( + '\n'+ + '\ttest\n'+ + '\t\n'+ + '\t\n'+ + '' + ,'text/xml'); +doc.documentElement.setAttribute('x','y'); +doc.documentElement.setAttributeNS('./lite','c:x','y2'); +var nsAttr = doc.documentElement.getAttributeNS('./lite','x') +console.info(nsAttr) +console.info(doc) +``` +API Reference +===== + + * [DOMParser](https://developer.mozilla.org/en/DOMParser): + + ```javascript + parseFromString(xmlsource,mimeType) + ``` + * **options extension** _by xmldom_(not BOM standard!!) + + ```javascript + //added the options argument + new DOMParser(options) + + //errorHandler is supported + new DOMParser({ + /** + * locator is always need for error position info + */ + locator:{}, + /** + * you can override the errorHandler for xml parser + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + errorHandler:{warning:function(w){console.warn(w)},error:callback,fatalError:callback} + //only callback model + //errorHandler:function(level,msg){console.log(level,msg)} + }) + + ``` + + * [XMLSerializer](https://developer.mozilla.org/en/XMLSerializer) + + ```javascript + serializeToString(node) + ``` +DOM level2 method and attribute: +------ + + * [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247) + + attribute: + nodeValue|prefix + readonly attribute: + nodeName|nodeType|parentNode|childNodes|firstChild|lastChild|previousSibling|nextSibling|attributes|ownerDocument|namespaceURI|localName + method: + insertBefore(newChild, refChild) + replaceChild(newChild, oldChild) + removeChild(oldChild) + appendChild(newChild) + hasChildNodes() + cloneNode(deep) + normalize() + isSupported(feature, version) + hasAttributes() + + * [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490) + + method: + hasFeature(feature, version) + createDocumentType(qualifiedName, publicId, systemId) + createDocument(namespaceURI, qualifiedName, doctype) + + * [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node + + readonly attribute: + doctype|implementation|documentElement + method: + createElement(tagName) + createDocumentFragment() + createTextNode(data) + createComment(data) + createCDATASection(data) + createProcessingInstruction(target, data) + createAttribute(name) + createEntityReference(name) + getElementsByTagName(tagname) + importNode(importedNode, deep) + createElementNS(namespaceURI, qualifiedName) + createAttributeNS(namespaceURI, qualifiedName) + getElementsByTagNameNS(namespaceURI, localName) + getElementById(elementId) + + * [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node + * [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node + + readonly attribute: + tagName + method: + getAttribute(name) + setAttribute(name, value) + removeAttribute(name) + getAttributeNode(name) + setAttributeNode(newAttr) + removeAttributeNode(oldAttr) + getElementsByTagName(name) + getAttributeNS(namespaceURI, localName) + setAttributeNS(namespaceURI, qualifiedName, value) + removeAttributeNS(namespaceURI, localName) + getAttributeNodeNS(namespaceURI, localName) + setAttributeNodeNS(newAttr) + getElementsByTagNameNS(namespaceURI, localName) + hasAttribute(name) + hasAttributeNS(namespaceURI, localName) + + * [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node + + attribute: + value + readonly attribute: + name|specified|ownerElement + + * [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177) + + readonly attribute: + length + method: + item(index) + + * [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922) + + readonly attribute: + length + method: + getNamedItem(name) + setNamedItem(arg) + removeNamedItem(name) + item(index) + getNamedItemNS(namespaceURI, localName) + setNamedItemNS(arg) + removeNamedItemNS(namespaceURI, localName) + + * [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node + + method: + substringData(offset, count) + appendData(arg) + insertData(offset, arg) + deleteData(offset, count) + replaceData(offset, count, arg) + + * [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData + + method: + splitText(offset) + + * [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212) + * [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData + + * [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927) + + readonly attribute: + name|entities|notations|publicId|systemId|internalSubset + + * Notation : Node + + readonly attribute: + publicId|systemId + + * Entity : Node + + readonly attribute: + publicId|systemId|notationName + + * EntityReference : Node + * ProcessingInstruction : Node + + attribute: + data + readonly attribute: + target + +DOM level 3 support: +----- + + * [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent) + + attribute: + textContent + method: + isDefaultNamespace(namespaceURI){ + lookupNamespaceURI(prefix) + +DOM extension by xmldom +--- + * [Node] Source position extension; + + attribute: + //Numbered starting from '1' + lineNumber + //Numbered starting from '1' + columnNumber diff --git a/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/sax.js b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/sax.js new file mode 100644 index 0000000..b33635f --- /dev/null +++ b/asciiblaster-cordoba/platforms/android/cordova/node_modules/xmldom/sax.js @@ -0,0 +1,633 @@ +//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] +//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] +//[5] Name ::= NameStartChar (NameChar)* +var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF +var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"); +var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); +//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ +//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') + +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE +var S_TAG = 0;//tag name offerring +var S_ATTR = 1;//attr name offerring +var S_ATTR_SPACE=2;//attr name end and space offer +var S_EQ = 3;//=space? +var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only) +var S_ATTR_END = 5;//attr value end and no space(quot end) +var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer) +var S_TAG_CLOSE = 7;//closed el + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + if(end>start){ + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + } + function position(p,m){ + while(p>=lineEnd && (m = linePattern.exec(source))){ + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p-lineStart+1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + try{ + var tagStart = source.indexOf('<',start); + if(tagStart<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(tagStart>start){ + appendText(tagStart); + } + switch(source.charAt(tagStart+1)){ + case '/': + var end = source.indexOf('>',tagStart+3); + var tagName = source.substring(tagStart+2,end); + var config = parseStack.pop(); + if(end<0){ + + tagName = source.substring(tagStart+2).replace(/[\s<].*/,''); + //console.error('#@@@@@@'+tagName) + errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName); + end = tagStart+1+tagName.length; + }else if(tagName.match(/\s + locator&&position(tagStart); + end = parseInstruction(source,tagStart,domBuilder); + break; + case '!':// start){ + start = end; + }else{ + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart,start)+1); + } + } +} +function copyLocator(f,t){ + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; +} + +/** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){ + var attrName; + var value; + var p = ++start; + var s = S_TAG;//status + while(true){ + var c = source.charAt(p); + switch(c){ + case '=': + if(s === S_ATTR){//attrName + attrName = source.slice(start,p); + s = S_EQ; + }else if(s === S_ATTR_SPACE){ + s = S_EQ; + }else{ + //fatalError: equal must after attrName or space after attrName + throw new Error('attribute equal must after attrName'); + } + break; + case '\'': + case '"': + if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE + ){//equal + if(s === S_ATTR){ + errorHandler.warning('attribute value must after "="') + attrName = source.slice(start,p) + } + start = p+1; + p = source.indexOf(c,start) + if(p>0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_ATTR_END; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_ATTR_NOQUOT_VALUE){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_ATTR_END + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s =S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + if(s == S_TAG){ + el.setTagName(source.slice(start,p)); + } + return p; + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break;//normal + case S_ATTR_NOQUOT_VALUE://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_SPACE: + if(s === S_ATTR_SPACE){ + value = attrName; + } + if(s == S_ATTR_NOQUOT_VALUE){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + } + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!') + } + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + }//end outer switch + //console.log('p++',p) + p++; + } +} +/** + * @return true if has new namespace define + */ +function appendElement(el,domBuilder,currentNSMap){ + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix || ''] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = source.lastIndexOf('') + if(pos',start+4); + //append comment source.substring(4,end)// + +# Contributing to Apache Cordova + +Anyone can contribute to Cordova. And we need your contributions. + +There are multiple ways to contribute: report bugs, improve the docs, and +contribute code. + +For instructions on this, start with the +[contribution overview](http://cordova.apache.org/contribute/). + +The details are explained there, but the important items are: + - Sign and submit an Apache ICLA (Contributor License Agreement). + - Have a Jira issue open that corresponds to your contribution. + - Run the tests so your patch doesn't break existing functionality. + +We look forward to your contributions! diff --git a/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/LICENSE b/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/LICENSE new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. \ No newline at end of file diff --git a/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/NOTICE b/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/NOTICE new file mode 100644 index 0000000..8ec56a5 --- /dev/null +++ b/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/NOTICE @@ -0,0 +1,5 @@ +Apache Cordova +Copyright 2012 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/README.md b/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/README.md new file mode 100644 index 0000000..e19d230 --- /dev/null +++ b/asciiblaster-cordoba/plugins/cordova-plugin-whitelist/README.md @@ -0,0 +1,163 @@ +--- +title: Whitelist +description: Whitelist external content accessible by your app. +--- + + +# cordova-plugin-whitelist + +This plugin implements a whitelist policy for navigating the application webview on Cordova 4.0 + +:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Whitelist%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + +## Installation + +You can install whitelist plugin with Cordova CLI, from npm: + +``` +$ cordova plugin add cordova-plugin-whitelist +$ cordova prepare +``` + +## Supported Cordova Platforms + +* Android 4.0.0 or above + +## Navigation Whitelist +Controls which URLs the WebView itself can be navigated to. Applies to +top-level navigations only. + +Quirks: on Android it also applies to iframes for non-http(s) schemes. + +By default, navigations only to `file://` URLs, are allowed. To allow others URLs, you must add `` tags to your `config.xml`: + + + + + + + + + + + + + + + +## Intent Whitelist +Controls which URLs the app is allowed to ask the system to open. +By default, no external URLs are allowed. + +On Android, this equates to sending an intent of type BROWSEABLE. + +This whitelist does not apply to plugins, only hyperlinks and calls to `window.open()`. + +In `config.xml`, add `` tags, like this: + + + + + + + + + + + + + + + + + + + + + + + +## Network Request Whitelist +Controls which network requests (images, XHRs, etc) are allowed to be made (via cordova native hooks). + +Note: We suggest you use a Content Security Policy (see below), which is more secure. This whitelist is mostly historical for webviews which do not support CSP. + +In `config.xml`, add `` tags, like this: + + + + + + + + + + + + + + + + + +Without any `` tags, only requests to `file://` URLs are allowed. However, the default Cordova application includes `` by default. + + +Note: Whitelist cannot block network redirects from a whitelisted remote website (i.e. http or https) to a non-whitelisted website. Use CSP rules to mitigate redirects to non-whitelisted websites for webviews that support CSP. + +Quirk: Android also allows requests to https://ssl.gstatic.com/accessibility/javascript/android/ by default, since this is required for TalkBack to function properly. + +### Content Security Policy +Controls which network requests (images, XHRs, etc) are allowed to be made (via webview directly). + +On Android and iOS, the network request whitelist (see above) is not able to filter all types of requests (e.g. `

    S`Q|gx$1}cXIadFm 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%0D?g3^xC>AK{I&qNv}~LL@V0JJ+W_p!>Q0*5ikrCK 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≷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Π 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

N-lOjW3TPZ78Ry*&Jiiy@74H67eE%< zu+OPC&?aKe`&9$AgLxzqfMC{r+%`6^UG}$7>$-{f8XuS(?A7%Tw_AA6t355=XAFP) z9;=luO7=FO1zKbRjrFOLij9>!uy?n%<+p4C$@A5B1**N!1Lr-w_k(v0;41xKnPAB| zB>88Dl!T!`0LhH2xic`;R8IIKWO<-U&kqddbLRI@<}At=nK!Qd3?6(7tLHFK$~?M! zQP)&xx!vvFFDhmE+|Gavykx%`3#TxZOslS>zTeMpFgITJNJ$@2J+WHkVQ*{}!O|9z zH*8=Ft0s>V?<$8Tzbof^irda@uje9W@6`9E=r)l7TJ$gikBj~gGH_GdBe-s zK}8tN623~K4P`{c<)qJ2tBFVV=L?C?5Bh`|-sdXviWgJ*(dY=SsclXI&+jW$4D8<# zs@a&yhhzb&Z96&gz~qDW`151HD!%Zpt>cI?tFY?OV`XvOjk`%*c@gS%%F(TmZvk-0(vjD?s7 z#4eh4^2I;5CaLq>o(0X&81IG07xuMvo>jJ&iw;;=-fNl5z8JPK>yHLrf^5gPxO%31 zD8J3wi1ejLzftwVWB#^T1iDSXo~s+pFP;t*>>NLrhfE zL7Gyv9BZ|-jML?^wE;&i)?+n)Eq8!pb(mIu_Lb|peK1Xf2&v*ImL(JEMy=!X69VE* znMFk3rwcz{>pAb2#$XeAp`ddn(VDkvb=1<#L96PeFN$Wm!L@qF<|wU4*yc0I zu>j*3KCAI59|B$LMQvkUIs5DSP6Ej}MH^ZPQBbQ22NV;5z5-v(bI@Qf)pJOQm|xdW zRjMnk{XiuROEdQ;6?G%ZYDGdr-x@yTpncr9uJJjU#i_HIMGR~g_f}KOjOMJq@95&n zt0fegO35&56@u!eMoL!+o`i2h1L<7d3&}*#CT6o1Kg_n`!&{g=%()Sxt#a4<+(WC= zBF%a#P6SF*M<&5eCD2C2j-bKMlb>)-vw%ZE?_{+wE1p$$t9e1@f?vd}<3NVJ12Oa5 zbEuUog{yQ!xtpl9b$Ayb&l5NNc{zsh-1rULUcM?hy zSy4aLt#g)`SM+6Th-w+`x$fwWpBbVu3$BM1;r4@w4id%kS|2&iI($wY<$w^g}PSd8~*AL1;`4 zM?W?uj#w9-BZ>j0RLN?q?QX*jdR@@m9tOC=1HC`R2Gs|3bf5gRdZ*|Yo;enz#aFZ*GF-8t??`OKHi>j}rt?&4P*JS%(eqiWGbba@P#y;Tn z==k=*e$vBzW*Orjv%!C4Q1kqN?+W|`Y=1Yubo#f(zc}V^>iO&B|IYe-^8aA`hvPpU z|LOS8#(y#X%kf{2|91R$<9`_c)A(P;|HizI)V8lr6({d6-)ReTU>{GhO_ch|L#ruz z;QADQ<*<1;GyD1Ey?K$1UvR~`RqqKg>3uYfM=E00?&i9P@zI_8!2lU;HV7L!%ep<; zf%kq7(Z2QV2(9%y7bzXzoZ?Hs2fqKyC(-Ba3Ao1@D1YITK`5W@&R?^ZycodUixz*2 zeSbavZ$A2e&gakF#N?vTrdzKzb@*g{q!9LTHq&`}#ClwwJ+@~2WIB6s9jaS|!(&)v8*L?! zO`ysnbhfPIsC+tXneFxfmS!x_bA0BvZF1dn)wJGk&z|Se*nY(QByK#X$2y|ufBeOm zY^hJbjPLXx56|AI7)JSwa!xbhhp2{BK8f3^s^F7Ev>#yc$yXMQ&nKTy^K&8jD`)EN z?-3jR%JlDzKjt@p|8)Eve*O2)#=kxO-SO{@e}DW(<3Aby`S`EKe>493@js6LdHk>A zf7goWpXV=Nvu2dn+a{K6iiS^(;GSm$3iO~?gj|;au3;o{@3HrM{N=J zxww0gij_(~x&n|_YhK^xmU3U68LF=w>oV_e=7_TPvANPAD_fp(B%!j6ddqvm&laIw zswPDKYQR6qj#u+>{mKlxIg;cNHEq%Fn9GHZ3$~oyEZ;+rjn>%X>-^L;`)2dR34SRt zWvmo)Y(1P5Bp25iV#d}aDd2vzj}6;d*OTTo-uG|p+7XFWaEW@fqbxUMV|HMZZ-WnU z7kOkP_)Ra8Ge-0wGQwwAP@EypA^$Pg{?ku@4t^hxn_Kk)8k!9=LbO$m{|oYL z@r9Q=-ViB(nTGv+Nx8Y5nS^#)dy{ON;6C6B%2q*=Pe822GUT6MJ){GI^Th4^P8Ry`B=Zjq*6f|WjW-Y%oI1Iuav3OQrvGC#t z5|KrIi&y%_s?WP#)oaB;?>nv}c>BuZoQca)0)*1G?`z}4E_rJr_mdUl7uacv_)VrO zWfPSne)?#dqnxrs*|k{H>_EOMd%)4ztKDPf%lsX|obtEG9Nl1EOwYT&jsT*-X`B@k zS=;p4c-dd_{HdRi<%xEdGRqfD!-crTWEL*(v#qhn?2PW!&sZ(=RSz=6a=Xk> zMlT2`r^`>vk!LUjePE>@NP;p~ik;)3Q1 zIt5hPgtSKewBgi=Wk@RF3{1QfZjm~sU`!c&6wcq%Uu zFq^BUeXb5|E7N$cxL(&DUi8OC4E-?Adj~xGUU;O<%wp=H@HU)*Nx@bI>w}mV{}-HW zV#yE=ADK)~F%2;+ottIDRc798J7ngOws?+yvGhLA%3?{IU2p8O6X**@N35{2vV1up z#m2Fr*Hv%OZ&Y9ZtkuVMpIU$P#1#lfX}}OHeA#C?cVC;?VX*b_-kX>WPgaibSA6yV z0DLVfxo)QSNMGpSs5&|7Nd&)m?`%CEQkk`oeVpS<1fQ>o;?%I)KGXJoP4e!4 z{odGh*+v>4EFGKpulkVD zX*~`s0gPF&!v|^$c()Ji3QC*eldimp!pmxV?>la_Z6=Y2S8bQ3G;`5%m}ITfOGb2(E zVdUtZauLsRO7^mikJ;W7U<(>3*ZL8;-Mc3`u0-2io?2d-ybx&bqnt?ErMXcFtIpbH z9L_oDZdK1DOAPz6D9@TEb)QB09Ua9fNN~K<0_{Y2dP()|Urkp|-j#!^6huPboNUenxIt{H)Bj_NGKc zx3tK!AE8F5bEv<2F&;Zq{q(7896;Eu!LE!j?ta+TL+^~OW8LMG!O;De%q!i(j=5iL zmYDaosX1__Zu^#fth(q0D~o6QSix^uDiuvsr21HM>*V03C({Sa^R`w|*OenlNx8F9 z27?;Ahs|qr*Dfb_S4Ofhr+t^QlWS@zAlDh1YsamO;1!Rcj!F4sMU^NG=t!$}#?z%go*96QvL1#ay-XF?G?jkX}hE z{j(ZT8S^??)CfckY{}+W(tc6aO{xEjuqD|Yw&A)oazVa9wVBsbyYIEtE`?i%up{le zq+!kEu)U={2k%!p?6p+a(rC^|_r-epcIG`))Hm{O&r@QGzXu54iz7aZ8Gqr-d*A)` zt4B9f7mpV@>Bno0(Qc$`Ya?SgLBm((I;v267`b>U=S1Th8C4e_8czai>}In2LDuOHHjZ%>*;~~MR3f6Mw8+bN#(uD75SV2Z3)2DYC)fw+B)!b895iO}+WRV?Y`?O}r3Y*?!4p>x3}W8e*fRzn^VzJnJ$p^lm&>fb8~Lch9{91AeS2%zEkIp; z%&zZSGp9G}Mvt#HcBna+#DZ#Vw;4V)Z}m&m1=k}Kv6VNr z#6guq8rRhY9596nr|8AAZExqkVkr3}_m3<-rV_=I%(Xpc43X@SiX>Z+r`&lZ7?I95 zFO$slWNJF>;FZN(vO-p`m`mAIOWf4!b2FyUbFk1iPd(?{)F54xNIQY69!^mg+-Pw^wXt3aD0{FbyFV{E8c3XD@2pA;w{Nt7!r36~lQp+ux^o1uy zDX5kj5uy-cs5itu^Y?u<%c%`o#MUUJIdgj$eS(FHc9np<8$PoXq3blpeQg@AkT+5{ z%j1hVBr$_3hx5vJFtz54PAUo}s!h)5xy;JvmuJJwSh5cQZk`E4(H({2b=$vH-pFW< zy4^ISGuyEu0sB(R>+m~9l}5FXZ++IU+>dG^26p&_HQr|)n7+Y$oiT;q2+6o2xg}($ zyQ~C_B6q0r1)ZyW=fm)kF2lnHR?Bw~FAJh0KfbB&qXY?SK_X5} z`%fM~c)o%1R0r*~;~$p}brfXtP1&z-rf*g%xYBMUF52t$9CQ(r+<7LUF^AT z<`dbLWCU6(&TX^&9AisDG5`Y4G_SAY*SZ?hDxmpYX)D}@-OuIM3+cn8{!(UDl~$)+ z3)HPtz3}PAPNm&tuFJS^)oI6U5A5n8+d265bs@CbBzMh=wOA^b9xy(PrY;dq+s4lY zy2C~e?WPbJEUaAM`j(RR-_!`CM`w7Wk zU}{#U9bChIWzJDpu6|n-YN@KCQcPXC2-5MfxS&V(<@@#hDs>#wZ*=b_zh1&5vHXo#+yp`UiD}2w%s;H_9)kEp{viE? zrL#_mHGzDZOvjM-!f+vt_iLH*Nbpb3UTEcoY`T!6%+pOPMRGn$&V}@R=5}m-Q?_oq zt$lBX3#kW-XD*qqTJQQ(>+KNAr@J=KAd$YK$33TmUT5^$V zZIt%7D6I;qJYU0=Jk+(NVzvma(PqE5!K4`WFj(XGd)wpQ5b-MNS%3oljk z#R&Apwbn;|sxGfne~)d=yHbaNmDkv>KRKUTjjq`qg!lA!56p`wp%xSuV(a4B_518R+Ho`}R*HIa2K=f3+E=WRZ$ z@%!*9bNHdnRgEgO2Fg9t;x`Ah+WItBgMGR)EkpzVxh_0fomt#Kx;AZ^_1#N9v2T>k zYA&mEXLlJqVr-pjp;*C2>Is1I$iuBeDiIJe3k#PcjcFmJK zbB5~atO&~4NHYz8?Q_8yMcqwj9U!!-uHjBFQ~b?Qx{!!ViKyB&jzs4Nuc-?+=^KH7=-P8WM9Kod8k>|tTUF7 z6mJ^ajwzzH9=y8hKM=M<7ie-lxzG9lk?VS@Z$5i=Y75OJNR4DwXG!y1qc+0K#!^f7 zPkSdf{Qt+NV=wKE14YUbm-QxvgJeIGQ!!wv~^!y=J{R zB2<%^SIu@CWr*d-8h2N}dB8&$YUv&mo+4|XUz+FGiICWtJYda0wd`!tq2Gq`^vR?B z@3+?Uy1l1%SHW^XUZu7%yJl@JbBB~ z);W8tUW)}mT}Z+8Vosm_YMpJW3^dQ;3#W-3A^U7|NjX=$lwp<`SrR_9-{VU9jlB-t zC4k_;nkfOGy(sg>IjtZY3A5yjuvmlST^?eqpUU{*+xJvehxsid8otqAL5>*9M>;m3 zCgA;Gv8rLdAM5~|HZ{wfRDDCo`|hp&Bo%N*Q`4CzIor;ZK`c+)2t1Lf|8(MZxK{9Z zc3`&o%vB|;nQA9Gu4@HrM#q|>=8*Tcu3b~=O_!`jSy^)}-sNCW+sY}QiK5iQ)R?S+ zH~pzx@UP;mYhrz|C6Z{a;2`a-crF)6yWJlnnDI%!)(cMASkoaa5E9(Zn>DaAr#G|7 z&IXRWoMA$fCD7Ft70M_9zx4QPUYmyX&)3;f-%;1I^>*6t)G}gOg*nC9NqJn`BF7k; zzR3*6NSeZRx5hW-iC5!O>5UoU*>|qmMt^~!3<_ERuR*lk*Uj7>zul5_HGabfLUkdM z4KkT#O;X_m&PDG#on@OvSf{bx$<`mrGUP&5lK`fO-ZC z_zce<9G%GMCpbiw8O{zPj<^kiA0n~jHU?h3w)lDjgDcrL?Z1+LOM_|rRAHR7J+<=e z6Tg^xn8hlBS?lZ0?!L~W4l32k z732xK3S0D1BPJxdaQwLIpf|013GIzp6~qJRjPvoCc3DQhN`aZhG+{Fa(F)tmgxVg?Cy3v{=@sa zyY%50>&jhcq>?okMvrD&D_R~3;$N{b0crM9YeA;%j9`uJm5n{xX@(p(4~TwVJ@o4{ z>>S)l>hI*9 zIlqUU0ffvM|JYN-T7B&&ysr~*de0u`&dUgRyylbFP&GusvQ?WUtLhv1!OukorfmRL zkP|d{X$O7gzJ0vqg@q4hUwuyhboL;Bc#+}|&X@f?7 z@OrTxUDszZNwb0(o4v+QUVjEyXrOZHzaHi5GHIwTMwDgh>cnE%qP?2Zw>a)KHu_)o z`Jum_se^6A<&FOMfnA-wd)f5I<8NSBPeGt-teZ|*mrOBqj&rcZ!54dFPx87mf@K%4 ze(%o*HxShw25RO*v1sD0>fV`xPg(mpZrj*1pU1eLv(DjYZwnkaZf7RHIuiv zn5SCJnr(7FA0957KD;0J@O94bll|HgPYf&8-C@~J(El|J1oxxX%F!BM&vJj>LYfWy zvn%?gaOeG$?=6Oqzvf`%zhF-KxV~5qrHG%m{GcuXdq3Uy`&tLMtdYidVDL$?2W&!f zPndfvBdJpQfO^+=nWwW-LppM-;Gpx=jjhBukHkdmH89RiT8UfC+Xk&yP$6EbIj<}> zh5cs(+t>ZZ`YtSnvoaGtD?|=q#eL=<-gTrP!S+pMTBr)g&}j&a48*e+>I4t>HR?N3 zRLKch_cv3)i=3wJ{hArQM`dpZjs`-Ck5UPoJRaeSKoi*ef9i=X>DvG#ak=-+F> zWyLmAZN_uvquq-r{wgh2pS!`bjgMVWKrq44JO0{F6jJ3M(t+McOFVC*S~f7TFa)^XX?`}?q;JOBI*?)~$( zh`p{j5LzepWx~Pl-#VSrj#*}9QzWA(I{Tkclmqf*JuWGvAKYbT)f4Mp`0Xp(7j0-( z#>`afXC9UggahjKyTvIKFt#>aL_M#qvOE!1pg;OsK+XW6pob)t&^&LdMWh(8+pyRL zyzul_BttO#gP`~gy=V8Km7uMF#20VI$;S6Zk7~cACO$5EQxuGemXxg%l@F!E zb-!wR2PE0+s+X0jE&$On==}-(Embt^xZB1jK38zSI3c@Y_WleOUa{kxtG2By0>-!4 zWj0Ml-_l$u6Ts0E<@mSD@V475_*KH_Ak22lq6Bk7*&f~bjN9v}i}xtJluItPD0p1) zzkGnU_cU5q+Bn!%@M>p3rr{I2>~c9d<`j*gwnba&H+wVWzfpeQ`Rj{B)Xb>QVKJGo zFj0O(g3Jzz3zv6qrxNUO3m979qrKas@3zJuU)6mQ_bTIWg4JKL&X5<59A|y8Ua3ER zqgtbX$0O90n1Fir=3Al;v<<;lIP;MOe%RqP7G|m>_3-YqGrq06V5S}p^;&bgbOT^d@0T6DQLY7> z3Zs{*nOxPE|GecLwy<7#SFLLLGTOse>E8#0v+Ug(z7dk|4D|akkulHt{~_4l0KO^@ zp+~1noJ}iuBY5+PpW4^FK`JqOfjW9JJApzA=%^zfERwJi{lDgs^wHkpt^0fLzy-6; z<2_!ebYu-H=pF0W)YoI8Rb{>XHF;BQU!A31u;f`nZZuK_aVJxpy=cIi-cWpG=L%qe7>hY^$`#kS?R=@S1aqP(+_CThR;zD)%LB+MiM(@3laf zfdl}3cCKG2_tYqYEPlvSTFeu>)hD(49T;xOmjeucID3ydpSui=%RN7Ej5q^UzM_5F zOvi65>2WtHF-+wxOFmCT!HI)&FJq`{@Vav~+!UVxo6skO1lTzYV&8RsOF}((_|s1` zpVPi3ZopEkHQCfeC{hS^zso*>NWbF&4^D|zyc%FK^}wTv+!x|^;<0IIxy2V{7d{d0 zY9$k%UkF$I(pbDEqx@dZ1!}1|B!KYdC8nYA-DIC2!aL6k8V6b}=e~htW^e6C1faIl zhaM7ZSj(o+Do>%Hp9yH0g#T zqpA+~(8V~8-X-%Xx$jMSeOu(upwx2zl(G#Ds=tj_^pzr3mb^p#>zd-1L&Imjxj$n| zUt<=2R>s-;qI!RkCgi8FazYL^@KBJeXBK0hH3obz4e(f+R1Rc&}#k%!{uA9e4X9y`>zW+4_n=%Pw$ zi)he_&ZYph>b~VPe7j0k_RV6hWW8a%7n5M;6In!0A&uIuW;F1gVNs<1Cl!}|+9a_=%25iTNCC5vHkpG*@B zpiwJV&&YO>7FQTvjs&}%*zBP-7N)~g_l!+AQ+VZb%b|%_z6YfbRRTwHAlhAu{3TRZ zDs=KgC++Z0&(}bVHE*A2-y`zD_`{??eXw~zh;7&_q}`&>P7+1^#gg@zvVKhDKWD|9 z*YFm%QseE09S4hirwE9t$ZOM3uI4#}dL!N%JI<46#KrcUzw zmc^M-4ZnBqUhum-PhASL#DB+xH_s&Aq>7_EoSAjsHcm#ms_Ptj`;D}NuI9665d5Z^ z;i;A&r8pi!$6A80a?}$X#SSd>Lmg0RPW?K6m42(3Bb|2ovNP~6KBl99Mwg}4TWc#s z>>$b-Ojku{96AeYg_c?P2qSwX37_55Lv(l`#Oq!=gyPBdvg@-T?OZ#1 zEaQ^LtGHz~Xfz-MEqNBX4GBK0+8!l#u9xExfWm_Bp26!Y;^VLP?BP(xHAXn{RyK5- zS`pX>>{Od3_?>~o%>$o48PB0jheH^7duYc_B6;Gq``yB{V4t>GxxtLX7+? z5DqtT3vII4U38_l$H&lrOJE{|-+;`0?MG&G{$%`f4dUwPs+%peT|2j4%J z8EO&D>dFHoM>?+>8XK}rYP4-B6u`b2-1UPon!)DbDupslOOuL%mc1y14xdjnQCGvw zQAhXAF{VsO?~Jgi0N0TX(T1=Bn1mQtso>yd5i$(>KU|9R5;oULCb?p-(h{LD!Xf1?Aq6~ zOygoHyY8Uw=kH>zzw9~&Yz)g{r1>1y6UlbtvsS7_)gqC$t-*6(bccKpeNkeNV~cP!4whs zU}m;mFZSwru$&j0*Ua2v%x#ujqZnosJLq-~?6_pb1(4cN_r*tHyY%Nsuk7%8>!})=Uvx9cS1>=HxYaBtr0s2k1E|TtO|Z3ch^c)LPGPgj@an*gF$s`vqe! zeB-rQ@9+;=b+961`a}27eo@|tMe1%45X6>EgCfsgNv^vb)aV@xj-B4?n8hqv46Xjo zP@&1)GTtjy``pN9OtG@k1}c7|5^h*NUJ0X1= z@3S*M(j_Nry#M=-4am32xs&z5($sRrSnqOi06Zgp^?mbXaDxu*_An8YC)g*|gOl#z zlf(hMUDfcQ0oNYDAePvr=PBm-pe`k5T{zTUaH3zN01dLNEp%wBXWA$bRp~I; zztE_ZfINM@%kS{5CeNDJ7>i!y={Ra(sn4%)yh2e+@WFBH&n8e6HOIQBRy;*Tm)2dc zH?o*eQ$lO-A71e3x>}&nE=SmiLo*u+v#&@0n{Ws7?+&;!uP@#6#7nVf#&|Jb&|~U~ z8C8=Sm=I?a7uv|L*-a#7+CZtN5s8`DQl4agP?^bN8@&0xHvIm&&g;q>YI|Kjg-ti3 zLVjKOue0Es0ce-Z%NzjMzi%A=dsXR04o{3=jL~ukj34+~qe{IO|5=6I;4YrEHhus!A7YUQj5XG%m7BFMjr=id(fH5L&QBLHC8^=) zMK1#4RMw^ocOKs!`E$^oLaGXNG9VKH5<{vJFLK&3*EZHUu%{KX(RknlIIIY^&vEc# zs(n5BlB-G-MaE!^5@Q`K6ftF z&I$8pDI96Q{59K1r{dr_A#mvXxM9%h1d0fT_#NIZJC8=hXBy#2eW2$&Wza zb$7exUEQ%O2l>SAlS3Nj{$^i6OcT80-~C)@w|(;?&iwXo-hWA90y!=Nr^tlrUK@9&(xkpvP3De6=dx*K1^*vkG$b&ezsbszLdE=NPp_4>1fDv5EdQc{A>Upop9a)Q|;owJ%IWd zD=M#=P9ALR%`tsJizR^H*xuyc;~Km#AS6W3A#sv&f!ba zou8ObW*6jlaf2+@*bK6fp0%a^No8q$ZisN+t$JcWXqV0p=U!7xDUH@EGnGegRJXf^Z*SLM!)izn0E2#b`3Ur&bQ_*Nc zROoLXV@bpYxUMT%(xvg#d08Iwy++5Vg{32xBZmsxdF>k4?9&X8AhP(3$+iq^s^rih zQN1B5tG=oQ`*2*dT3k1E2o4`I^5@+27jbG_c~Mgt=Z;`WR=~jsn{|7Kk3_#?7q03A z5O9x_=!Z7`$7*2l9r`%pW0@(5tvb%VeDyO-!?5~yZngdYT|i8w=+&~VTdZklnkx>{W(88{v{rU?(W${y%Xucy8BDrOGppvK=SRk0mG|@8xck@}d#ej7zck^*pb?m{acc}7 zq_FYw>>@Ou1gK(jfXLH`7M(JEt|1d`7lh@WVe$o0)^iR z@QN6I9qPQeS7erSDSL zv)!fUNDUM{bKd>SyGOg^{_8#??~0D94mBShzkK!f;oby1ig4;^fNY&=R; z#maYxt6VMknui;8B+E966TFk%>ZoOf@>Ds>h8#0D^>tBmu8^GMw{29tAcOa46;)Mo zf?TnId7YLuh|kSW@jc2!#Wo`HRVjV-z`Uy2eDO1_+gRl>Ct=W?zR?~Q&U1uyBXP|; zKH!PPG1ITcNz!)x_T4k%=06^P%GERfGM>Pa*diq!S57VKv><=j#A{+bbkP#W(b`|< zdSV${b&?s5wcl($gMLp#F?Hyx_zkN+Wi4dRR#U>u^BZY`r)ti2?7-sYKnyZ6M&|;{ z;TrdO4hA3!k{A=#VUk|c+ep1QFw|n zHR27rZFm!&BKi5GCh+w4vX41 zxQ3779M_b}p?Tp=N=ALYw_NRF)6ul`R_Umn zpfSojwY3t`f9l7&JF}2OoTyS=m*|)8&-A$`qIP#hD`^d8j8|NL;8*kBet1U)G)fD& zsKWY+TetgRu|ptHrQg+8gw{FgQ~fS!DkrmvL|B0Ay6`PcMvgWi0~O?J#ADNT{=}mI zP-aO_noJHyy2%eeWF7+{u#cGk4J_@|Qj6m!yw< zWPn=${2U`Z>-R0jMeOy&Xh%q8X^&rH>+f+^d0w}h%Hukg79X_ln{B-Gy9mOUr{h}8 zesZe$nPB;P#NqlK&R?B(wu`uomYG$7;3)=2#~Y0_YN0F*{HxsieK|0%cxw*Kj8c*E zP3(Vep5gvBvrB<8B{L3Y70jy9;4L$zBey{;WIp@Lc~7Yyrh3O!N1ApyXrMz^K6%gQ za&eLRV`kf7D43YiE3cuiI9eH1{`v)apg~gg8VnZK9SO~O8|Ey} zdmnrUPwaSAFc_n1Q1*SPtV#56wUz4bOS6j8aVV!E_VPLr8Mst+d!WH8XS(_P6Wh?R z%RQ{Rp4nnAt+TCCly}^_Kt1d1_E>s8mX`LzFXaX+(Fyp4{^o*R|NH2NDaiI;vYX_v zc~#SC4f~}+U9%$YSkADW$_3Lnq41Ao)4t5fF8+Y*B>SNPoJp>X!6*#- zLVqj*%^75KJbmHQ8Dzw(I6o-Lvli|X$x>a7b>7)!%_DP&6`$#l9r9l@us#2n@4|XL zAHUb5=5$n(_j_Vy4ZXXrTW6J+HI_040rG1ee%76&C_3uWvCB?K6y;$I zSccQ<`qMDFnG(JT+p~OVE*DqJMQEZ%QdfMY>#y8?d1m71W_=tEr{3)=A7_TZd3If; z*d*!tE~7aNhZtFwHYR|X1io%XDpSZ+KgV?@EOu_@QrD11esx|t7)O2XdXFRGIV#L( zF9%-43OgKPrNVnC5X2GQ18;!pe1tj+A!OFzyQkB3bc_{)Ab!iW3AvN%LZ{T)-Ie=7 zVy8zr_tgD0_`vlO8w-fYJD?Ez@8w4Fh-V$=-R34^NpXbIA=(J4BV!kLx#op}qi2sf z;-Rz1caaVfPtHI#k@3htaqy~>k)^1Fn*9ujWd~nbCbd0)Ry`c^1htavo;xys|Igoxyi1UEB|6UYys(ha|Hzq$M;A&+=Z|5^_>oaNr{=uDC$+gV+7zD0A zN0t|avz1JPk0#yGa|o^mStjlj%~+4b%(&L>dj9<}O0EE;n6)yS(-md|1vkt1Cm zAGiYBX?%QxU)VXzfX~^V4ebAx)@nY?V=DW+4;gZrkHe8$i=-Ip0UjI+ihhd%9&*@Y z^l?9k?1C8f9byMKZ?Z3Hy?=mEj(mjF-Tpzf>o@jEu0sK9u;MoeJ@+lL+>o5-#}CQv zz$Rv}ycRKj)g06x`Z5^D{U5&K(1*8PiDBl+u{fiTJyXm6gNi+NS;28{Rzs7hlbto( z1_kWqS1s#vILz;P+Oec2@M;nN(>)0k`!WxE{xyHbooz987E7admoxcIE5s!&Nbov- z$zmUlPdQ``i4b?fhxlT=I&b)4abc5H$ovi?>leJItFb#Tr-s(4{s6IUu zG3mPPzU{zy?(Jm8v}1dy$&$=k1krdmH(hF$02$vOVEG!}!OeO1^s8U6O2&En@$);N z%mbNsXmJM>^NK2R`ip)=&qupS#U)3XuHzLoKrLOMg7dZ2N*|!k9P8v|YTy2hT}fPd z^2l7%1vUe0uJz{nhptOg^gTSjZry?V^XQCzK#L~Hg{7!qu@P~#rnH(Dt1T5|CT7I? zX8H6TWO0fPulmP)6i9vKKF77#JP(c0sH*SEh9~WCSI{`ue)Dy-MbmD_m%7evqGQV> zVVchG>#qCr<0Jn}$Vo72^A?-+k&)sssm##)?wh`pDuwm(B}Wru@zv|)tpQG%@7Cn7$Y>bhgsxFQ;a_v3p+g$%v6*p| z*qHYj6*|X5&AhnH^gcoNCWNa9*VLLk~X>`_Pmk5~|&dzB% z?iws_+&4Cf%@6jw9dXu?h}5W_^=`Fwtj%`o zHjU!6#1jW+JlU8`UB|mF1Yesg0OTt$VDF63oew}!rU=qzH5*dXR_QY~?<2)MMB84N zJaOfG9sVg>&$2~>Fgs1Mf(%tdZJA=6T={F@7sw)FRMJ0ljA5EW8#GBXm5?07Nai$i zXlMQ=2zRqL;gA7L#r8Pi4f&l7#2`K|XQt6;84k3R>bs)51*9mb@0I;`Qc*^MUx{+d zN3uhi4R2JM=bCW|g|xpqtHiSL`T7iL?a}D%{M(~6-+7=Jme&>c>|5M+Z!;YGze9dS ze`S!c%R?PYc6R$lP1kHvVH_mN*f zHiFZpYDaO~&~45`)<&B<_|LqooU3Df%z^Fm%xu6DuQg z*_IhK6jzJ3gSEr{=2i9wS)LPUJfRy;vHBRND~F^%FAt{%5kC&e;0J?Q^fNw2PtDcu z2bqp#z-oGvBcq+yv3=s9}57BFb}?c4O`Mvd_|ngmDxH!LO#?h z@w6?xtp69g%no0gBYmzuNW%4twg zL;ny|@^T$2l1gF?eif#Gz{4ju+o2_kl(%11bNs@>TI^cAXZP7=UY$Rsi9>vqU!#pV zZN_ZkO4f(N_R)oQ(fD9X?)|;9NUMrTBOS_4riumh-v+v@`r~b`KNbV@w^mIzkls@r z%%I^AEU7zC7q4oL(oYP9gFY4C#F4BPR^lNT8%JrZLJ5ePMCpPsaclUJH$%bu|5a)qLqo?N4W1^6ibFSy-B4tM3dB4(*cOW;>g8 zGxz1MOk{@d*aR>f5;L8nt$qZ~Vb*A0qr+w2R-;WCaa8H(MGMNSX^6w^j_j0J+;q%S zrAO?+shybLUw#|#Y_`9l7v`1~>C?V`kKe#L)2ihIZeZ%*l zR9VElO}caOs}-IZs7i<94#&_w>7mnndMmw>{n@Yar0vY}tgGR1!)p$z{V@XnM-WdD zaxT4^14fTBU=3h+tbW&YWyRyHpRk#?2i{z<=D-*k%6&8HSY%~BD)R+9SKiaJAW`Ka zOJdn?i0#G$K(K4iVW4cyaz|ujT!*UZfz>f7M_q$Huf}JsPb|0mrj@?xD2chpDB+NV zXmZ8kDmr8yBDu3;8hPyO*?@Rr@r!+blRl`DiDMWSV7h6y{Otb69v+&e-s6ZQp|Ubr zyL~HDS?(8xHMZFMAhLgYc<(r3i|-w2n>C%YIg#~5k|mr8c?KSm`4tulU`@%Q+?@~W zEJo;Pj)+B#nNqE)Jp_AvczlN!9Mu4~P*&SXH(qBVxotV(3zyTf<+>l@yEruX&Hc~_ zmAlC_N}E=STgA@2w|i=-s)Oj^K05Mr2E`EyYPu8#yt=NI*>3Oqi7kdS8wNOtPmk?p z6+rxF^4&cB{+)>1c0U^R952=s)F7F+prRZ_>vZ>Yp3HkbqJQ{#2fXh;{)BcbM@i;r zrY_g}Vqm`i77y4eYS)xa=c{eduJ_Un->Ujynt|R$F}^bD;5Zj_tbf9{w6x5O=J6wX zs{>+)>GS42;Kxs)F@Y?Z%{%k;f#yPrsBUAJYf^AELh>^Bt=Vqt_1=R~S63&7ekrNM zusgBn+C#Pcgg550u({hwpD?wGKImtPuo6(K!4rgW{HKP|Dgoy>Rfk{Lhc^NiK-o^( zay`8`P8@+8t5_j+6I|Gd+he7=?d|!^#R>b9);vJ>9oka2y(K|DO2idcOqU6JSY zjiKhVH1N7i=C9kH>KnwyUW=;;s^-cJKH`Hba`Q8!B5q?GDju<;zX@z5+qSd~_}>)i z&wzO zIqp8nG>sa;-0N<6*B-DP#Iba->pL_F2WqsSTOA+s2`*4Z^ok7b`Rp$rR{QawQd*LX z?bgvXi?-s*jIxInj?LN!DDj4GXo_gu$J^=#2S$jnjho|b1k^aL5v$4sf85a;g6#Ig zBm0?Hs=@qk!w&}T)zz`jKIm%f4ND$P6nE$aO6U@X;jpw@N~ze@;G1@L+{}%}V#R>G z(JN>wl2+e9q)N1{YQm?0Y|`CjfiSkd&FSA_p1_{^)@YoD85fXD?hukBL_^Vk6r#Q@ z=Fu#=h6Bn)%t3d~2*RO`*0KT3IHdMRYgRlablKyjN7pld7#uR?9dU;+nt%z>pjzPQ z%_amA+U@PsoP)fR$Hi;f`J&tVoRU6(r7eh?S4fu=r`TbKQV7M%900iQMz`NRFXKE}M|I z&jWbg06!r)V-0Sx#Taw_kb7sYLJ4a|@w>apIOl}qvvn{}+o0_OUN>W>Tc=F`n!XN7 z;6q#Hi;Gxl3GoRz@Vu%2cgP&|yWIN01jp^ctYn*y#F{;1q)eJcUiq75l8p0H&j^er z$?GHe)U!CqvDU1)M;(!R6AsME6RPCM(wq1~0Edv zzs&lN9%o)XzzE|}o1r~d8N+(#Kz_p8a4_QKo2aUztvg{H5q4h1^6)Qq&hY?b12j(R z8c@lVAMj!IX?0X=jkclmaFqq88D%wH1cV2jk2R|tGovG=V#Wj@UhSezN9e4UXWH3y z>^urvqnQ1gO3GNA9rj{9`ot?`ws)VP*QO~jvB{b54rBB=FNd8*HL!9fpEHVfGSN)! z9648Qropy^ZavQ5y8q6%oD5#9GihE1tTURfm%(+)PuYy7K?_J&bKU%WT5 zSrM4oX;D*ojb?fn*x{JqJ0`|Hwxw}t?z}IbWT-at8h9J0oAZ&}g^CQ;878P=yV+g$ z%Sv5}EXA>^nyf8Xi{`|DVeqXvE|5}i2uWLLy5_i~IKT01=E#wiTknuv6T=*%1*)&i z>p8C74(nPoCw&r{FLpG6ADw?EYtjhq`QJv-E^oTp#zF~$X}DH%>s(c0<8sdHXc4<- z&MO?<0K4OJ*1mxfR{ZuWF8Yu4Bpq>eQKQL7IMDXc##6uK0;_NIOHAx07dKm{{2IL6 z(ZR1FR68*Q+O;t{N|)xN_j2V|Km`?WLzN0Qm|bZ>!vrjTmL`Cq-+0>GEZRQh3IrP8 zxjyexX6uol3?7k!KMkXvn@NL8$v|61g;Px{;@j3MD1&2SDWktN#;sP9eNZSGOD&rS za4Vk2kRDvQkuCf=(jp+jfShvMT}bLCaf>$T38wdi9-e6rQ! z-Rk+7X+q9>`^CDt_Ti2_GtURCEI=eFckw1QHX$3l!wlYwV_s@U$>km{<22a)fMf2k zMLd+TFimrPFPqalv*8Yv(m({KRo3bj3nh4h>U@&tpgjd45p<^-&zdy6+~?Sm@{|LQ z$b!mwxh73D4Z280NU3AoTC%Z@tYdw>sv76zrOS+d%t_6gY$aMWfs|@cVzZ?Je;d3RET{jEz4L*)Dl6;# zvk&_P9MNGMP*hZC7zZ6pZ01c&G)ziVG)yc?EKD>kGSbOVF?U5tib+OBMv97xiAF_5 zhK5N+H742IqT&{}xQ0dDsi@FFz2D#StY@En&U+3pI`-#&?tb6jyVhQRo`36E&szJ> zIj@nFxIJj2p&663!_w{(F>`|Yl=)LQAa{w4)0jn_J?LZPb;vu(Pq}VYq=0MR$c#TW z!U*mNAvtnK;PEi#I`E!^-WRPK&GrfRE1yd8EC0bB{X!cXz*v`xR=;Tt`la{F>EQsF&koO{?9G}1qwaA!b1erL7A^JH^@fpn zl=TIjwDoSJ<7BF&b>x1i$nIIdyX!) zeCtv(AxX=0GWovFnwtJ>9BEfzNqJfhtFB zBQ8BDhjhoDy7ttZjAwPY$&9jN=G*O4Ud$%%U_io4Lc|Cr65Kyr(#q}eq&DQf@^!6C zjujx!goM6(pm|1afL&|jPsA2Cu{nL-4G$aVo=ASyiC1ZD_Qsk`ZfVybR!j-&v3w|K zxj*RBfN+(ea2>7x=u-aYUPP0jNvnygwdM=Gm!Vl3eqr6tjo7f?Yxq{V7F0KsNq_mEp ziajQ@To4fy2&OUM`e7)z*P-18f=sfvzd=tk!tQ0ak*vftd|f5jhIy>Pk)>2ay)P;n zqS&%gif#BV7}oHHIj8HooA?xM|9_PX$hWXB-a_oum2cA5S3Udnsi6@RWW7=HGLVcL zQn|>UlkFt2)?Al%NP{8yEhxBd#1F<8CCc7vg09S^oB0lCX~H~qlgiT42b&^0E2Z+9 z#@a2qI&-;8MTsJt%q>hnSXR<}f~5wP42K@FtHih6Ug9tMQ7KL2E`DS+O3|J(YFjxC zf4CM&^;u#5A18AXo{TwesZrOAaTyh85HafX$$i?~AYZ76Lm`gnYVRq#z*sIS{_)o* zi+it&GvQTH8x4IekaHj!)0V`2HN5n(%v~gM*<>coQ-va=MJhR~?CY}^8QEDP6F>#M ztp!np(9^DlBjk|->%C?l>)2F=PkRgP<~);)bsF0t43@H8ON=hxNjPjbtwmuY`KZsJ z8{ ?1%=Gqk|-s72(F=7S!McUl*b^W{5BML?x=+kZPP7x{Y8>Hp7Ld$mXT z_w;#$m&p(SL0a?a84~CEk?^>nguPC8Ho_leZQVbP>FjLfnKCXX$me3Wj^_mmm+qDb z6<26=abK5HMPBUvr6M9LUX<~FRD37gjdHgll}``J?lNlLgfS(x*Ueqn_hLDL0_zPm zq(eSZmn>Edu?%x5^_L4g)mbRzx%lJjPMV(ZCRuB}+rsxG={s2U?FCO_w#!Eqhp-nS zxmb)f3iuu+XBahlUmh25DT%Rkh{;!5@w{Z-8Z`$a_txID8mWb(PhERr-n%jbIhL3%Wi^`?=LofS>%AgKtGLIxL|v-zN!CSJ*) zHevM?ASO}Bf!%6;?s+*dO}wt^8)OWjj~NZh;kUbe0R1gQAHRjn4`LwSI6#z^&$~Tj zo4DXWcjd8$qK-zE5?#B_#W4O(W7tD}Q)09mrbH7>$yl*ck?5>-hr^9z z9JNNw_hr`;qhm*iH~Vb#u_|6Af0Gm-cQ5g|M~Hb4$r#J9$S?2##;8B<5W~lfD#-{_ z?c_;jG`04m3t7q9Zwt_KVrj34t97k!3weq>rz+KYmx-n>9C0p!$Xu-&?o-k}{3Al1 z`-mj)*95~@ZqYO=Rk9F<%-wxRtwP*RU;GeYey5t#8${>p;R`s*8>S+?hF(@f2O4nF<)Bw@Zj*0AY*0Q;;dk@YPxe7ze#oU&@ zxj_sG@&sKTQ0~*$2cp9KNbD=JdzkfEDJ+mJd=qCT-T%_zjqyoOK)pBi@nx0SB5WGu~T|BM%B z24b>~ly80VH_m;2F@u}#@k(1B}h%8 zuo%dkVePNTsrQ%#! zUajodS^M7HU$RHn@H4uTTJU6SWF{k-DW-r(?`Lj*BxOhH_gyDQbB818C0g9)QGmtr zae3%jgeqe|rn8GPA0Tg{_`reewJC$hI0b(_F3fdn%RlV;k-Iha9`4Jo0ufqs&PM_* ze6As_qK&*DECyH4NOoMHwJg@E4dYSV9q4rfq&(4^FCLzm8?AX&pF z6l|{vn{v&Wvi9TJQ;|3VZ7Xxfvqwoh6xk%X=AqIWK~e?1oWwCg0~MoHv`lSGg+-l_ z+QgK-i&hg_Hqln@Vgx<;OWkm{p?ejY{;P3lgWKgblLnzhnSv5YLKQ`HXHyd|heDM# z=Tee#xtY7#=%Fa``ugH~jqBM%-_rh%d0nY!x?ypKLtz3Z8mYu&$D<}=%~l-G=#pAY zAX&S|mtYb!jx4d9XUb7q2_?uIM@KmdLOF}7+GG$qgmSPXxN9srPv-o&=4326 zp_RfQx*@3Ec|*xtm<5_Lyx$iqW$kiFzHkzkQ?Cw)U73t!TdP7f(;(&pJVqhr2mG&mo&vLa*7Td^K7ZxwXnxrrK-!)NbZ8X=c< zz-2Tw{99>ICv1xR4TBq(l;4oG_=g)AQPIGoyAJ@3b6li@Yk_XaPR-|G!R=SxbAD_rh}eAc zhG)FZJ_QjXg9Dj_8) z>>^0iVejSzGM2!I%h}-~eRVH}Jgp`fwo( z6ArC&DMjnfA!~%A(pBV&d_9AXd`okSU zKCjChtmQNJVYK^kLGkwnKG~QgNL^|d!E-^XxK21Gw2fmzNloH3%lGiN5oZKt&84m{ zP2r@1zBjcF+j0#BWe2Q_|7vWsb`R^*&WJt-BO8}pMU^rq(8JZ42-`eR&wht=@ZA@N zK_mB3VpU65-Uw;T<&&3GhEHpGh5~Ik%J{j=iaV2jQ$gWCgaHmE^Gqs7;PD9}VqySY zjYwfc+Ip7?%b~pz<>kFL?dMIqb&W7271iV|9)DyY>a;y(Mh9t82?OheKy80@I3uP9 zS$~$Ivap%fUhJQ7H0DFuC19!41O3>`I_Iv3I(^MPcTglyUIR@UQh1ewfL)A{ul2gu zd=vI_XL7ekDSlA!32Z+72UUqxMLW^;BW@)?oZ<1?WBz&%RnEF?&JuE83iBpg>pw2i6hk&__|OT({ka_8$B=fc9Er$lm6qlN6# zFJ*l-4z*)octp^Ct`LU&`28SK?Y=dVan%@qom>bY8dcTcG)>(=%_@2-w(^Ewb63-O ze|m;LcW}D8mjq3>4AL0~k|9h}H^|{M^h84MRK=ag+W77hr`NXQdV=STPEWF;f&#GM zZyYfK{Bo9b^}Z23_%>}w(>lJ;Q$!oRFJoO9^tr{BvQv*od|?J`?8E8|hWqtp;)+aC zg~{UmSk?r|#RMPZ$Ghc{Oxl$1(Us!5hl2cH}^eK zgrt324A9WGaq8!CG$5eceq9@3&9o82tszA(?BcJ&m+`c^F+#iANiW(lZEBNWwBzFA z=#L{xD=5iop}(Bi4KTnP3-s+=tQMAz@elWNTN8a?+~L=;o;5i-va$l3j>3g>ZZ5}%4FJ4;0b?Cw)G{p=Z{XW<&#!)>2O_)qJmzSfHKAm68 z-tEg?<9Y?XV(;)bm$MsMVy56iid8Ik2&KEYP;W|X@I88t{3LR?U1QMnBv=EOvmaSX zjO*)wonpp>1mW=#L0!d<&*_okpM9SG-5r{p@l(c8+6FK8I3LA6pAu;#A+}Yd5owP! z12%2PZNQ$zmfHBb27S6EPQ*wz8sVTFU$8dl=k7&eA^r6+R%{Ge-0ys5bjNA9PnsrU zk^7N5#u)olu!2*}UiIc{WK6Mx4K18=EZ<#g&&79N7LU?Bb9_T%)5It~{BwUUscD3kOdMkZzK$I^ljSeEE(FK(Mw-~!<(S4LAQ^`pPU6{ zH2Nz<#Cnh2@Wf_tWSuSY#(S>=@e7NEHx=(?)R{)3`V>2nw0$)9%G;{(?T7=m>1bE1 zE0f0Br>(5a!WmL_^~29%WCkqaK|!w_48#&fvA=eyz3jm#ModUgU}jP#W=+g%%+VhM zj}OsTGoeEz96&yyAEo|LT3I#LHFtzAt)g+z@!2X#G`*!K&HZ^X>UQ|I>#xt)m{-9| zw>7m`_hl`%iM68%Z_PLxi(lV2ea|7gPsqEyafT?y7_uF@#it~JWEZ?c#BsK|(g9a; z)p3wAmuA>>?JaL&#C&hA{rT_@y!&MfVca=BEtBZbh8A)1Ck!5cn{J@==Zl}W84b6k zr}^E+_H9r3fyY{kE?3X~kp=J*)Dg3sW?!&}S+<*AwTOiN;6o36? znEeQq!wg!8#Fj;f!^d?3M~>Jfy%?=>|B-76J_Y9ggfhrNRYS+@5{K~Jq#>8`H-!1W zq%NH#DT4m1YL_<%PC8?{Nt=eeOa{X!BTu;k-hh4LZeOy4nSOL7GYv%gT z)ns+To)d+x;-Gv{$_>(tPgk{)yVQPhlx(mXPvQAoqx*7P9*Mf-M_LejlgP;7FlSuP zH7L-?hZqRNoR?r>^rr2T;s4n{!|kw;4%h|%h#d#|!w{tCS3oG;}?#QJ3 zVP)u?kS3E8C3uu?C~;G}uSqUx=)M9U5f95*SI>diA8R?n$WnJPWGkj=$AdWW?i4WEqdB&8r8U4lE5paO}oh?XerrDV9qr^MExp361qaZH`H{_2gS#%+UE(o3IT)Xd~yTna7XYd0o_exVyfjmPS0g|_ld z`7ftwp^#3*`n3Fxyp&Sxis{3>L~O6s+l49dP_h7I(G!Ol!p<1_lWBQBT_sb0KR`~J z`)(i=bRQ|I4SI(Bx;rm^qBA`Yz|J(XzC1#ck)V98 zm5M%ivfEDcRR6s|*KP8K#+BE($i-A07=wlSJVxlMzQ`74b2B2Xeiqh@hNKXG$oL=9 z7~}X*B&TtxNs+C+Ru*M?X%*l-#^Q}1=qp-LCTbV#0Lc`AF@~zwR2Ga zK0iHA@eolWpsb?k7s5lxS1qLWSt5C)lJ9|rjJ1zA){wP)H>V7AoSF=*FQ&-hZm$V_to6i4^yJ?C(Uy_iS}5pa;$9Sv zBF)7lG*xYE1~hVmw&Pxzt{t>qwAA#f9xd^2IS_M3p5D=~Tz9IEeunxVfg{ zy@E#~=iBg=d5x~4^&KO=%ph;m@sId^n3&w^K_s6fY7+$&a&iq<^!HIgSZUe!k5=BU z^`x8lI78(Wv*Z_=F493q-$(u34y~)=kH+xV3?W|lRTj7L=v>p81FDVuOV^AFHeR3# znKfzF7+%lvv^x~Fu%de~&vs;6c`$V7$7m`OH)S}X94UeHRd}?4@$oU0eOnKag?$qE zn9@~(sSlqs#%z8)Y0^&3^k3c;YjodVdA&ar`)cImN8A)u=&HXBcB<~;ME{!0Cjzo- zApJAUP6r+h*UDUHbCpnHP1p~4WG#-)KlZ{#cQyLV1AWSMeB7Z5s+!OK^}udU@h)ve z-$%qP3Ma{-2`6ba0gAvbvUo^l*L{Y1`hR@CPCaz@zCv@kgFAxzL5)uFPEO327_qn~ z8gY*1J{EcFOFJ96r3T8gm`ZI*oOF3LN|XMhTn#@twab7Mx_KfRD4-j&>JKR%Zb8v) zQ}*2&JE3$`_ZVa;5M-oCUys;dC`QrC=S5kWL`D4kC0KVfmj^NmQX+=}2;-rOH07y{ zy}Um8i6!x7UqQk`8gcEG<>UUHV4TR2^c~#plqiRFprwpFT^w}OQ5Y2}R244c_3EmF zlVVS16Zg&_?yER9EwjpX)cq*Y6bb1EQCa3LN>t1tHclRzB8`n3=BV_Mjrhxt&r`e+ zDtgy59(_rC?Bc|e5)F{6Pa~|XkuG!=YB_|bOe%+=eP^^G!y@40sb(B~xytpj#~P@)WIjr@)6l<@)YE9$1(M{;yoU=% z@ui7)e#t5lR&p<_;Tdl1+9^U!qeJv-ZR_j4u3O;jc6BcNgO*!l*>LtPW!b>%jV z=V;-*9)a;PUGIn=meBYhuU0bcH?+DmO?O;9^19~9-6aUm(Rah6E|fgZsk4R~VzRD# ziW`N};{Rog;))|R@^wn%u1`+6eM3viW0YE2uyOz4udM8B#lhV%E#L-k`7z%X@;>vU z+&_IiDk})Sp&2&`uUzlgzjCJcPp`Y7?(5)+zzt#I(l83pJu+@fs?`9=e8!VQ>Hhq9 z7$@=>M&I|h(oj$wmPa6&Y&gQ0QfrDi2gXR(3E`JcFSMCd3F9Ms(cL{==&CQhcf&OyX4wU81i}K_VRC!(3Ol+@ez*sV$P4+sh2?Ar5mEg+z+z) z3tjG+!K`kWl2}B$TUpPa@iX*_rEV{MQr;?z?mrBwZ+A4H`au{Cu>Kzhw&Y4CQbkrB zX(p+r!{uXuqPz?m6N3_8=&HKBpp#}ZA(V+!ju9_4!5gr2Rq zS2%T(tWH{i+{0=e3_KQjzxLTw^bmaq?KDF;nET>E1VHva2OoR4UQmu0;qA&?4r$f9 zd@rOiKIQ#d+=(%ftXiv~C2|^OHP`q?fLGv*xT(HnpEx-f;h6*ak!!f8xR1y?i%lDj za3BpUMsuIj*wav{|IVV;QlGAh4}7|w zd8^py-`eR`fW9mO%`%0wqjBjOE2qaFr#Hvu@d1-t5Y1z%mQR5*iHi(nth}>UJ;|XB zof{cDYvI#sp@u$>H0J0pn*zcK6>+D5e&|CVCROOvFz?DUvDm2lQlsH%e-x7#D9q>s z9X3NR$jHlG5~bykfL&Q0#)*@_XB65BIT0kxd6|#8CIPgNRcou8EgZAZ_0gBuG~sZ$ zXLEw($_gQc^~gvPDdx&pC|<&^##DW|Kg{~4J%QfiL;(6I5=+Yv&;^rlG>*#!(L&!4 zOp`^*$3Yto=(kGq8y zTm)hWL`?HTM_+~zQ=<`1hqQj@wA?F`aQ?pM3}}l2Vrl+JCS<`tA;0@0-gqN+3C3@k}A~=!sNJRt=znSl2eVPzsBrk97>1 z`sY0&EFCq-=a03Zhv{8D_JMvUx#Qnx&e_}|qV5*y@Q@-2-RUVnbU%C^p#7knalfEA z6!MYN4L%7cSu_Y(P+3jxzJA;fB9N4R1HHPPiVqYW@L|n(H-Z0Eca24iygJH~9wyme z!HnM$AF(H&1sQT2hwW*=$YVb#P=8wy?2sGgAf*|hJtRM24avoUmQqxQlnr?~iK(Ju6lX}=xUN|=?#A|%~oi|fPbl;i#d^zd|k zh_kwbp&^8dA~y>>)T&8+j!;U5a(ELIYl!Ob^;|lZ_*AD{iXOsbgeG~I)_7l;Ts7s& z1-Zq2J&i6Tos~#Z%|Q$={vtQke1oKNNt)+0Qc{XYw6L3@5hv1CFM44|Ne{WcoUX6l zp>9bzalHi)-mkuhgH$5Qaw;B3s8^|UN3%mK?q|EgkPGu^dO=H1yKn#~@EaKoE@YuD z$@qRo@-8i&BArWYMsMx${JxTe49dh%C=OB;=`dV}4Uh5Gk9v4 zh+S#T9PPVA2qih3BC|EJZb#WLsQH*^y_W+sEb`3^T@Gal#*ceVU8E2zVB+*qN_UZ!r${e>JMr4wXxchzfra+x8rK7R2kkHs zBFj+z0kLucqi%_1v7kH6Or!` z)aNAp)0w(+DOx;pKnul14?_O7k?ie`B$I1$N_LqqShy(Ey7op|Xd*$h{_ZN+>JITVD&fd}cA%mfnuSzj3 zq!|+2;@``M)7k8-0_BKL0M@oqB!B6_P%XaF88R z49)7;7o%7EzZp|E-Gxb-sh{X6Ac$t@sT_xF}ok_W=X+26XO=*w;L$ z`u4?j*Ry_N%tDspN%^$Aqcf6e0Xn#JF`f_(QAKTv`k}vG(kSEVGN=9;*Q6SEq%vg4 zy^?Hyw0*Y74#aDHUr`zJnD4P;bC2#*m8^ap;d|($DAEIF2%3%N2PW=Vwrd4R=n{8E zpD7+kf81-MBxFR;rp|HK8X$Wr{yTESMIdxUTEap0by;GZiD&&$ZoeaJyjLe79Cbh^ zAKzimmR_lw(gE*A8Cgvd>ThR&g9jBz%;F*EtW(#4QI@>&a_OzKqjwOEVbPSbwY_N9)fiu$q9^MUW28?xDMlB4a#4d3_6=|D*Y!F3_pxXU2kgvKiYr-q zc!rL(cI%MHaV480ykTtl=YY*`9B1`mDW+I{koy?>i*4|AJM_oEpS*{UjT(ii+{cW> zuoPp*!zEGJ!f8Ct=v#gt$9Jmgnv7kqTp#Br=hI8mz<;y|`1ZzY6xQ?~fhT>Zp=-C= zVpYIHe1juTDTh}`Kn~dZMCeqj*vraaTFRfx-pJR`@}8e8)D=tfGxu705vjx32^OA7 zo>9kv@nc{2eN|9w8l>qnJ}=DK!wu5)-KGR?Nf)6JS8-glxyCKuoy@0LkP!Ogjj9+{#AZ^xKE%VbQ9m~7)j62%dQRNnUsy0T&qqLrzQo`d>o?6eiG8@>72 zF(G5%VWrhH#@F?%Aw&f7E_Km%LBi#q>t1Hx4 zi3YsCYhm%KM_Jk31zy3W<<+{6Y|UlWP%J3lJpYjDcn ztFlw_o@%eG=?KxWoAwmgjlFq?Zjz!`SJ~OaHGXR~o(k$fZ;xM=xiT{HRDYV*H8?-N9(7{eP|dWk|JwJO%AUyY zIh3m=zx%?hjkz+3jTu$eb$n0%WrsJ-W4|CPqc2+r?F)QnY8H3^%VCv07#NmzY*H~6 zjo&BceSjOa(rVA>bT#wCcA_2QCmNoktL#~xNB9##k1ZN`j~8?C0RAH!E41HoglFjq z3CZTCcmQ-5B>8x4es`T+Of32O%K}|C6OhwH^KT8lk8$%1%>vn@2M7x4pzA^jCjpqR%@z8|}qZrkY_ks?wgUGQFdvZ-9~-itrVYMNew| z>uN9~)V1S5f3;_--#ebIcKc{X`F~Ox?CmBjiU%FdG6+J?{~w&kjQAh4?fuG(wT!Qu zlXqfdUcX1FDB<6{T+%Xop(-xzUNqc5YR7@DddsuC#YJmcGO7p?vM{KMr_XL$>WE&dk0w09O` zcYU%!@~)>wOHHR@h%kd#cBMeD>Ee$BwHo`ihW6$0shQwkyg~DW=jQBUH3qr*R+`U9 z;a8kKykW}L{!+dyxN;y10px-;c^!Ul*(X+!q1N?Bx#H!`NZDXO27ePxyJ^b(8NTy? zqSJ<%`D{gycyK<<7l|UE(1q(!*V}peeWZ~bT}$3U7{O_@a&j}oU`U7P$6Nn#2OiCe z8=>E0izV~QDm;?jhP-LnPz*iMK+YyR7WLY_ps!OJOYV*Nd*i&dtWndo>5wJGT_YId zqT%TnkvPbkRai%5e#mtSMT(wW~WR}mV&`)K>rlFtz zEvsCVNb%T!YKF#`6x)US=}KEGwvJ-WwjM{)ue0D~4AbkArJc8tF*z=;yK63OJ?QE$ zp30cYCY*(~vJc9kr!Tzv{5q|$6l()xE?sH-08+-{7VUFYCfUmoAtKKrMZB^$%Lb@v zD(^T4W7(>l6``_Pd!JZvxvJ^Emr5PIitf`56ENj>B|#bN9m+8gMR0Lm9|XUImO|lNY>XpzxQvd&;^W(B=T>J^5WY#EY%~FhxbNmuXg9#$k=2?X_sC&NrVUxi*#mE+!34{x$ zq$P6TM4ErheSaG5cUm+9VxBv1?K?GO9u|xLNhQ>SW;rzGI{Y&Q)1Vmdr^t8YRq`Lb z!4{(|i6AHYxX@UX6Mm7UR^Nwl7fVVyYTi{gp{0`LzDVTY3`1f0BkqNtEbAc%++RdVEkGTW~6M-EKT5K_>t4iG!*#8&kr6 zB$|$pDf0cl!*qf|P?O&J32NCt(>@L5G!zx`5J$`BPNZE*toKD|plL#Py}w)gXOk9+ zk)m1{Te}f43}d_J#mLJta&=ci_Vy5kS-k|3ZsRfp(3ffS$H#JkEwaTJ%nhQ|Q5+Rv zWHMh*7EV6Cni~_2f(Rs9BAo#&oUKnfIb0cQcyoj`G`?Dd1zUFv`wZsMRb-8ev)opveOw$*nsp{ z27AjWF1~z3*PYDwg|R!nMTFcC_=r0{u_JtxGx?6#gmoYyPY4Ha*HaYXylBzcYB)!4 zBHxnbTK`0kVt-w^D!Ov*Q8?r-L`;&X$zVyvecZ1li!Hi)leji_i+6S@Zregkbi+%M zAaZdnF28WOA_gK>ctY_akJ*0TMepSBE}yvi5J-MB(DS4TUAf2=Im&9KTO#R{qQTIX zeHXi`)E@hG-aJA+)J5jfzU;yHghE$S?XCxRVzP2kO~&p&-^q7YY{b0``6rY#lN56` z0X1+87q@pBY$l?D+t4ehaVLO>yQg12U*^3u(e7F%c|f{v9Vj7mKYo?(?M@4|GFrZc z7h;BI^!t`;`F4cdyNI;1ur){j=plW z1oSa6j@oMZe|dW@HI#%&vp)yu73P;q)W)gEkmD$Gpkw*eR#)kqXiZkHhL zAI{&G*BuVCqd;q?yJ@8>TWGv>;LA~L)4vzpvCI^!bS&a>^M_dCpZOVOS+~YWOLPcf z1&-n?^%vwTK7wDQuOMc~!QWaw>-&RIT3wC5ppN^C>;tXK`%8#_RsMoU;V-f0AhdD6 zzAs_-2|L;hKf4c;hda2*^BHwrIst&w=dZ|3NO*%ceK^P)2Lzb=E1=nY!0T}$Xna<~+)(?<)*7Axa<7=R|}cksYhw8fbV zm$H8hPw8{h4$XHYDfB zfWYpHVH=(nUfDVt7a!Hp7D9_LM#5EM59r^MB0G)MD6|nLMt`ierWi~dtng^+u-Oe) zw%SNO1C|@)RE#HXsHzxIYmI8-Hsc`=V;40rGJGwRi4f?IO2t;keOVXVF($>ApsDNa zva0lHwj+I4kb+)2#vN({{&Q9G_34eKnDVg+?C8w9M6vGmCG2ZmEIU$jnPQ6aT^|Yk zM_6^hJNi<$Rv4s=AqM>-#_DS1?$hpAWRQ9>iu*#Wx2%=AS8BP(=I&#OFzr1PUDz{^ z~ULj5GQdzPA#|w_qZ37S#}V5)aO+?9#nkF zxs>-h8OM0XSI@Nl!kpKb&p9;UHoo!s|)3^p#k+cHD#XhnFhz!BH(F&Er{ZtPy@^xm_X3niS8~8Bg!%wDgJYvZw_m zCspDibX>MRofzQQmHK=PT17Bq8=xn@;RxYy3f*%hG&)U21naaDUVA6}R1vs%rmV)% ze`_W-wi+6LPo~w^pCS4G!0O(A>)&_txIjq5LPalR@Xvm?I~hDdbHeX;<#2`MvQDt` z=W@PQxNUtt>p5@VP*)!j-a_jxNh5J0h~4qNE`Y@ez=i^^?!E$$T|SMN`` zAtaB!Y7}!S{Kz^!jPeQJNh<7dh%|c2w_p?3K#~z1GjdNV=RU@#gf#~K3@?JWXlmHX zWkk7gFB^Kfs$>zGF*W)=9M3+nhSmuwqb-GahE-_nR*(sB7NnEQKrGEtXd*i?!JlcE zuHLTvJOi<0o-jp-u371{DK90SxZR6g%D&~w^e6BOtvFB`$tM_$=-Y8R^X-hmc8?$ELOMm-olyZ{-s;j0lb8a+MTXPx&o7W#VEraiP_OR@^_*j#*~NRx!8b`#N>D%b{Jf9|LMIP34N#hjbM zTb?q+yJjWF7J0~Fv`OhoFiHk2Fd&3KC-isc$~EX{%^3~!_HX=~sc*}DBY-3J;-@pYp;f86U^}uj8p~}W(em4hKz|6-kKPoXLzm` zSHz>oYd{Ze{)VZ^1D%fV!`kc0Dds`ydg>^Qk&hw9^O@8Q`__BwN=p6=O^`)=+ol_x1$ zg|tPEZ}2M2p%ZTgXlkKL*k7wXhZ|KA(LG#V z25%_n%F^B?q;IZ{yw4$Nx)Mp3kVn=gTZ~LTq>BBOWRuo0hWWfi>3lIgRs z?DH*8_T2;F81FC1_q5fehfCaP&pg)7(0!iP(Nb%pe?OXD^hcyld-RG=T)CBf{^@p1 z+$GcyV+N#QsKU(Bsp<63HxF8Ss6$wS>4lX34X9$;k2T(Bl4}BZ;)|L~?i#^kivA_S zb?hB+8!Ky&*rRmhiEkhAJ*8#}ToeKP&84`0c6FqLcP|1uAqpVXp~WqY@IqN#p+c$r zUTcH<7uMtbIFB{%qrQLP+W{d}_>f9W`ICRIKn%DT`4~GL9|NpWq!uN4SdDTmA<^J0 zUR_~0x_;GOOAO7sV%G33AHVdk{#?^{LZd_YOY4=|8l!}I(o};;-e*M2d$dRYavh@Q z;K^D0xeAlJttCF)gO2MW!}$Mjfx5=IFNc3Kb(!;;UyPW(qb=XINbk{}(UN7{I+}6f zuJui6>?X*Bc#sjD%4Wz)y06U0%Nys02k>_;>&N868FcU)r9S3(pZ7vH5tW*r#Aj~q z-P8^2;%Z6%H})3Mje7&k%o`TU$K#eYtDToC^=QUkQEx>G3oE;(`PXK`N$bL4dJK?c zzbHFs@oW6GPGwCWCvqiaAsxOoiFW1%m|EASeh*A*uI?B+SGPCzBE^C(EArw`zTc5@ zLa44Uh17py*SUL%534TtChRkfK@v>sy>Y>NR(*j$qbNbsKuWT?P^4CTCPqOM!7GPP|} z8|qu?2k4dd*=L~cD*AW%5A+?wYh0V8ld0_A=I!yEYh- zv(+WbGi?}iD_WVqC(|z#UCEfVGga9aihF{_ zDBhx*v@`9r%Q4NgZQE&c)jEx!KhXC|^~v*U+hzN4>3%d1b;ck@~H#isW(%`Uxe{)?6Ka{a|8k?n@hOSxi}pgB7X*?CI*Q9G4)p|T;g zW2APfBTaha&Rd$a@Al7pOQXy6- zDS4$pG@NfaZ+WX6h_|l3oImGXIlQ0Rd7EgjKB6J}>Z-Zh-sPsu+bAu0PxCxei@xfU zdS?GN?X-!q&R8;b>2o>O?qkT6=TlPpT+WZ&Z?4d0puc#jeWuEf!jxav(=G=zl80a%>1LE0b+e2%h|5coe z-nc%Os~gv6TzS$OPN%e=s&mLUuDsYU=_bA5^DHNo4F_UHr*4WZXgkt>F4sqO>Q~wX zzgXXO-KJZNdIKTrN2R0W8&%f!g>IX_0`0NwhG^t|Y*hPUS%%NEkILJ+A^O>7bgDP8 zCYq}0r#+nmrM)KVl}s)IUk@q%qP#`)5 zpz#?`x52Z=|-WQ(o!4buN&fNy-Cy&#SBk z$xD3HMydLWm-wr{w@} zhRggs>+2D1QjVn6O}ji)?robs-)t*i$^3s(YIl!sKMr*DS6*~HZNkRIc42SIVjjf& z@Hs_$pSvYh-sco;H9rNP*Cow4o_$0k^WInIwC(DX@^~3_YL{{j$Xv=9=aKc5`^g z-L@&C%8FkbHvEr*#@$+ZIqPfD@X4@;ZQ+>B><}+1&2PtEw-8#>!pV}+!LS_Ha5P$I;m#S_Y z)aP=@e%WUDJj*j3uFvyKv)#D#YTI3H|0~fOuFvyKZOA@ZJ}w<@KYTu}-xpO*9JkA% zGyW;h0Kd!iRb8k5K))>iV*3|5E*rGqk?V1$V`cC@^zZZ?>Fe1J+5@z@<*MsqRGrGQ zP1bkPR^DurX{U{k73FHHPr-!jnO05zE@$dh(Z(o`L+@zl{!qND(UHgLl|G%k^U-<1 z6#Xf8o15fGxq?pBRI4Sgo|~#)$eeZ2-pjKuX=|S*+J%0lEoB~4OS?9&^HSEPv~{^k z>U7m6(Nz1C&lo+N4#?5aPAKh%Q|CinHyzi1xV)7|Hfp-^1--Vu!H!wqO_g_;eJ0CI zW$e?Gc9DBsug_=EBlu*WCTS0~@&4VqBD>mqooILKGcTDsZAZ4rw!>-eJJZ)iD|IY% zb+2(s8FVC57ueF8Ss-P}^VuWHM#$kj=#w;?ZkwdpEmL0Q!^rYXOJC7#K&F|uPJhpr zHfnbzhz4*UD*3_l!rSXIpQ-w0KGUE#JkCCkkS*uasQPhr*>+TY`hKR_b}&u8nHIZ9 zCo8&_bR?awebvWN^rc_KvMkRu>w~9c@1i$!o^@@x^9b1_lh>DYP`BhKISNYO_B_io z&H7ALo_VEt-c6Oy^QN@V^KPoV>~(k1$X-{`?`qmyj`!8}&vu>`-OJ zO}Vqr7n+XZ@83ZHpHX$<(=S&H8He=6GJl$|d-~(mrWt?w?R)RG7fowCwhhxnwrr<< znQv2-b<6WSQ|6T0yiwnxm*!au_1AePZR<+8>ZTxQjFf3g+w5OtG4Tq1=??=s4EJx_ zmws74T(0wOUFPpjYC|+eoQKZoBjFPRd~H_op$@H%O{4#G+Gsx|^xF;EGwY*m?BTJy z@3F%E?Hi=5rjCX1-(htJb^p9UP|-woE?B%lE51yYMkj z8MR;PiPWZpXF+&GU7?wMs+I7J|j}2>@uGb8rHWTQ%2Al!zcS> zIxNq)@_}|kGER{TJyh0~ORwhtqyH=|pQ&a1$TZ6{&GK<+w#&3`uyZr;-bs^nN~v?d z)L7`8YsePz&2C%ehxw|17lZHC=)Ic!Y)O7bB~!gWa~JiAXs53{2n6qxE9fM>OY98v zogZd;zIjcNLGtQ-CVl>C2Dqj?t9LzH|C2vEtery~C$6_5BcjRt-RX9}I}Ytqs+B8zH zEA`ro$d1{5S~*ucA?c}&?5ouG;NxVx%JQzR-TYYHuafQ;*1z~b;gR!rn3k7Y83U!G zAR1Yod8L`RG4)wKs$JF%r=!|-%QCMtVTHfWmCsc9amY4G6E@hljct^-c2b*yQDs>- zDjkkVIv*%&;u~Y8$WOagM&+%@L;kXJjdr8t_)?d-T_opa(3QK}?u(i?{~7vrbrgS{ zcT?r_Ty;X8cT?r>4w^zssrn74D!V&S|AhJ}-%XXj#}V%j=YB@-5$hddfBrsKh$|bW&hboS+0;~tQ$^SU9QmoYT6CN%^|zA>saCA z=W0{V2U3-H>q_3~k0>AL+Z38=HwvY`T_1+ql=_i0zm#>7Y5x*yD%&TY1&?3#511aTLuj1g$&|ZAAZb4PT(BYcLxRJ}=|- z`n=q@cG*VtnICSS<=r+dy&>A_tM-Yu9c7ozH~so9zvP+p#-*2~-Q^9R0s7*rGNm?H zH>Dl*&Zo4UlF#~~)MZwmM5#~u$@^+`@P49I=uDBLQ`fdtS&P9vyZkBrKI5{^1G#NFN4(`j@#xCFX?$Es)&wHva=i^9v9bMc;=$N*- zoE}|!cIhUs;k4T(^TTbDW~N>K-Lfnn?w{pJf7JPKU6*b*-|d^_-E^2v`dO6wytkPD zIggZf@}@Zfj54dK)4cEYQ(kjuxGc}rUNm$rI=zN_`~~Ts(>NahZB^%Gq-w9c(&?N_ zj%=SayghZ(O1;{sOuBd*((EI7yq#t2FKsCA()+KPS8R2=lID2*cS=ia#T)djK`}C) z!`yWleMYV8Dodm-^1Peo_jY6(rK_^kpu9t~tJ~N%$wU2s+BuYO5o0hs9_=`E#^_3A_XLfYclm6OX`aV?GRwePaDg}e zcY%Z81URdIXqfL)Cy)9rTIKY?5uK?@8R%E0tn!3J=gUG;Ksnzw&wGm|zm;WHC@_oDn>@V?g`a2TBA?V&kw{{sI$_g1hO90KRf=Fw)}2Cx@E_kjxleID3=gW#OmgBAhWJZLvK#lPj7 z4dDIY+rUw?`JB&R2ljzG%^orftOuMwg!+fj=OGvPZhzW6bO}I@haxL?FYKXv!4UxO zhtl_9^nKW3uoA%YVcWnSa10>Jf*LFU%fUK;3=4JvWLo z8U4O&FSuxS!y>RBoHSbmtwrQ-g#V38!D;}#8=?1b_&t0Bpx?t!o843c>TlW(_JP|0 zvM+}A;sgBOms`PMvq!E6hs%cLy<#Pc2mLE5J0`fj#Cpc&J z#6^JeCmseD&AxgS*ahx1TLG;VyTN(0Cn3v|_M3f84dC@PN6elK%_naGr_ENb1bYB9 zzjiHv|JT9i>!|;_6J}4L?Nca!3N)T_!E6n%leA;?I`=?X(bjqH7 z$!zr+K)+|8=QHT{j6-J6oC%QQnUp{CqS@E420H+{u9*dBw}$>}p#QAJ0N&5q1!(&X z(EA4ZJsTR&-UJQ<+O1szHi84-oY`}h0(d-UFF0lPjf+78j+=ecd_dhdoiJNRejWLB z@LPA%?3+3N=1qWh-?9Mg0C$=_cNw6~b1#~$Ukwg`3ue!Q=ksX$t;+%R-?j+sG}|x} zP`3fuo{#*`r|kKs&AxpJ*ba`FysDs ze+l`QoG|;I8ms{gIBB+JG1vg0x#fb{_pSx#`Mt-@UOE#{_tL|Fx|gj6^m`d}UdH)t zD**g&J7xBL^T2v=2wXIKIXqrYzn7E$e%gKi4uJeyXM?q1JAlqBW`T8J51{^)OTjh( z|5wrWRnUADbhga{Tfh-;(d^YL0lZ&*0Ni2r1M>lGf8dnaYt{i$zr{jXL;oK%un`hKpuDz79a=jg-9+-n-@l(x0IHPiz7w z%-%E$V5c`71Q*PHaw9lnwwpe?Pn!MIQn1_X%`?GPK;2KT0MOY(-#zQWF|(hU2eyEt zW^bYGTgboVl-bYT3U-<8t-&U6((LCJgYAI&w~~J=ZQpv%>}}9}+ctpA`zYVnfYWAg zUj~rt?I+CMF(1(W9pvA+0Bi-c-#-uB25A4TRp7AMyB7i4zWb=zd#Ha8_3t5nU^al> z0rKyi4`~11z2Hu>pC|wG2f#(M_bma?f8QNu2bTfz2alM&AHMI0*82|v`g~w1pzZ@F z%zj}OSOfNf^Ja%u0@@v--7nJa7dL}Lfb(Bk3uyOCXU%?jF`(|3kDDEy2gn~jY4$7d z`jrjfFt}*;tIGg=er*mw)?eEW;CqBVM^=Mv;1082Ujo*FBjCK*2ciGLO#nSV2;JY9 z4c3GG09lT%0Xx7kvkw`7&xfG(p@ZPG*@qVZ`hWN+fZlH|1seeLfAfObG0u-Q;Dp&n z=>HM=e+1b+a=Y1Y%>?TK`HwCFyTD1a<09^eHK^?b^z)=hAbaj4xsfh`hD!Y z*&ib7AJX>^51D;@HsJi@8vuPiei)qLzaByVBxNU&_2enDKcd|qtpfD>qy69*IBoU` z%0ICZ(DoDC05m^=Zht%?90$nsKNf-YU@tgr_9sig zIzZn);rvhM1N!~xCa?<}0jI!4vr`KII-lAG;B$(yKU)gm{bvWj8M8m1133Tl6J~!g z3oHZcK?C*!2hjF!>3a?t&aDQ}Jhu-}{wa8U3VAUPyGzZY`pLT%bX8&9R+WqrRaEIByECIU!Z7(bW(7iza3x~la zvwvL*wt)lSqS?Q3{%>2s5wm}X*1tpR-#3B%;Jn#I_+4BB4)MM%`A@G0^!@Y&-p5@H z$lo;!tO7d$<(HswiTtG#JVT(*XE%Xk;5^S2mVwOxexF00&#wf?^Z8R&*&MJOYy&5( zs(1ynS_(FS!&ddUob9av2LS)UeA-&D51g~Aro1L!U$kms6(B#I_R}|mBUa5=0H8DD zkUJ~ILR?nC{3;mI{+bzgX1 zOWSL=gFCF6Jr7Vf8#=RTcinP8pX-iV#nYeaek;KaaMG&l7l4g`w%5~k4*llPcFqX^ z-MO^oIs$U#8;Ll=QfU_XF2*Mrr=c7l^uEr9QW z&0rU}!>Wb!Ux;oCPh0h6^FaeBzhNdojvKavW8j=si=ew`BY@T-+HkE`-AMh7M*#H? zht|XC^KfWCocfz)gZ1D5IB(VB)!-1gWYr^<0s21TgjJ8M0dcn zty;1eKyS%$s~)u(!0XFr0_wkqgtG*I?U%Ah!$F2nDtXhUF%MMxfxFz6#RbRCgQ2zME02v;C)+(;) zs^zp>ejC_p)e}xw#kE}Z#4}cX^*XR0z;^{SSL^}D05qPo08sxV`aFrYU$X{K_hfiI zc{iZX%2j~=D=%5~wVMF6zits|z)^6~s;4Xk)IH@OpwB93u7b`}=KnHMt@?V}d_84rkYUXc ztDXgqXWa&rN5*eh4z>aKKf4Ai0O!xX!z!-psHV1Q1>kd0ezpl22l50RB?Y;y0-?0-wcT)|Jd(&0`olTdldhs%_2b{F(JE{N9^L=9ea0%T{i+{W3ATcL;3T+Y)oYdk+PwySUIXpdT(qiL4Ay}L zV8iB|RX;cntN}X#I{eUV!1)ht1xEog{qRzNOh0@8AjftC%K>e+pRnpjIRBAVU^}?e zsvlhdp!cJ+|IxEny>=OZ=WFS^gLXR(S@mO!!A5WpoVMz9$niSpy$;!5zX6=IYUg}# z8=&7C(D4nFzu}lwKYlBK{*T{o)f;Dn^-*V6@t~aZnJ#5up(!Iy6`nk0L+HZyKTjBpU`n+wARr_WFblC^* zx6cM!0DRv;zjx5~9Ve}NCvDyd-FL$Ko#(9Dk9_;-`!3qQi}c+qz)`E-vl77bz%sBC zoVV(|^m{Kfets3W-KzIN_kBmKIyeWw>mY63zXs6e1Ee1y{e>-79hwEu=@)7Li^%g! z@c5;j;7+T4c{QN!m(N;tnEc^GR{aX}euaL&O21#-1P)vEYYPBnzjn&1Bgk}wKEJ*Q zYy;@=L1g+MviwF3)`DYJ9i0cZ0_s1s1ndF_0p}lv$A_Ww;mrV^AHHDKZ>|P=0Wuzg z-?0tgPOCmbn~xyhZ_)m@sQ)N*KYA-bo{!S^qtqQ=4Az4^;0~*Pdp4l`Z#Mv0euwkl zSq`>>%Q82W{@y4h~!OKW2jE zU>ktNYi1r4D5&rW~~R{i+` zuockeFKF`@>%eVb7dQ$oT6KE2RsVAiIBwNng1?#tpnqmI*aS{m^}mq+ua|%`R{hO6 ztIna9m|Ec{}{T(#_4&Hx16Cmr~ zU$W}_8ms<+@_(TIA2)+NR{fu);C8F-TyNDsLF=FB^Ut%uL96~{uT>Yozn-${->Coh z$pFd|k+hVrJcz2dp=J5up9_3)Y*l5uCB!%$0!l_gV(_Tko2A zU@y4SdiP!f=r?N?fbOgl*1OLfumK#i-hCHH zp*Ih@^PoHL1c3Jg;r+k{>;=$y5HucyY!6xob^*#BybSEN-hArjZvyA6_YmqIa>jZO zT?LL??_uK{S< zBWeH01K@)7xEAQ$Oxv3;T5rj%U<)_|kmXVIeH45jb=rDgz5?vC-lJ=PypP^*Jua7f zOQE$C+Dq@S-eXpSy@0-7u>?^56_nqy3~U4NzjZ#?2`Haj3bq3BU%3d-<|~g{@3HWG z?0x{9Woy6@>pc#7kE8x^==@cS!Cvb}(2v^`y)~P_ zY3n@;TF*LWy>D0nZnqxS5WQy~vL4qDy|w$S_Z)2VoCaL5-ZyRr=dJfm8^Ag1t)qM$ zI(+jMfWF@X-*4Fu&RFlc^S~+qzvm+7dIQVBHgMc}&zlLTe;)0hcc=Bfbt$0kTMq%w zzilyq-?tqB@ZPWzz;DAb>ph>o&tDDp0_whf8Q29*S?>i40R3J-zl}9m4-Q)Ih4gtL z^1bk+^lCLHGux#LER?$Z=(OEqt<&d{a*|pt|@viK5M=2ycO&O=dAZ# zlz-O&aM603$#32V?zG-_uLJab$tr_$z8hSy-uJHo$E>%Nep|PJBi4I` z0pxoHZC*i}S3>`l(0L_wucZI0mV%Ao5a4{<60jK@x8AE4gB{?E^?qP2IBLDu%mdJV z4SbqefVK^^evr052;CpN!+Jlo2+-z-ZnxeK)BcAWaLRhyDc?@{cJe>63?S2woU`7K zt^?41?QF0GKx4;pu+MrwX5cn(+Ip{}>~;IW32?!BuZPC#;s1L2zW$Q+b}j*1!C`R5 zdT*fq4fK7(L2%xBKfVH>&ySOTBl$NrfWEtGuo7^->y-6=Vm??0_F3;u+Qx~?B9Do1+Sli&zq6?&G2~h9oGA4%6^)*d!V;x12}HIpP2*D>1UAnE%U&3aK?H+ z3!R_c3E;PvetRk3OaA9pg5BV(_1?M&K>Mx8__mn;Uk3FXit&2rgOg=hp&g{yh2jA>aFsTkqg{0I!4lz)9=9e-@zs`#FFA2>|~O z!2biZ`2gp?K>aU}KQtTA{uhseJFWLi%fN2y{c;VqTkkOShYthler1dGewDIcMUG#a z2{wUK);qEe>;&Y0eI7uTU#HCnY4bs3{h;#5`WveO`QJEiy`xJ3vK^)TLzI7L2SASx z!}r6``|y72{U-f?vjHcpcg(;VK>uT>t@n}nfPNp@1t|LnWxurwK;xsc!3qG)k0R4? zcpd-0q}>ZtRb~Gt@Za9gb>EJtsHCWjCRAi{AcuP_=QYW>a&#jeYR=bc0$gRfp4;qr7oy=|MwGF+t zqu2Hns35Zj=QTL~7z!DH`a1{^yQ2tDV@C^_KScp**1C`a*xQM?osm!osQ)u!el8*N zmtaT*oYw_F64aCVYX}rT2bsIDwyToN-5jvKI}K2CcLSOAn5jM-k^wRGsEucKb590T zkhvH8dlLZhd$G4K3UZ-?%m%zh4f#+*CZ5yH-=YE6ztxfXJBK*P0bK9L{(fBV&x2Yr z@eFS^CPEpRe`tt+xqv=@w2*lq9I$@?`3K6$JV=0;gK2=dnvmaw{iZ515BUS)52XV7 zAF3nsa3I7&0d$c0XErpF*&GL`cLX^{lAwajqv(G$8A{0fD+uzSnaq|j$buR&k74~7 z<~vqR=5d@K$NKR`GV$*N=7~aRB@_QnV78*hNk2gBNz8F73ee+JJDGn+18V<`+HIkb z0;Pc5(}+8r3#fSpduKACmdvxkkPS^_w#NYKpK}4Z=c>s(kNxu*fc5jJ`%eg@LLtm)$D6#^N=Y}B<=i8;u3E+1Qoxp9yUwZuI1 z@Nn&AK@BmVKcqkfu};|QgnFG&&kuF{5a);U&Owk4$nO#ch0si_E6%&-LOU^k%*&~#$M2vUg+$8k7fhc^-n3xjMxzY#8A zh7qVe5-}qYGZHbQur{iOSa=ka5gQ#2s6Pg|V-Pzw08oEy1F;D7j=FBIBT#*wyHDbs|&{yCxJc^EJr3HVM!#N<#u*|2mvshuG`NiCvG_ z>vM@s^n)~LAQp|B=q6$}Am)ZTVw2EgQVp>i!vL`{h>gi6b`yt8VmIS>^W|eJv0IV> z$Jh+$Aa*N`w^kFo&4pAz9XzkI+j9W5uKx{HW5@3e=!vQngkNiaRO2pa} ztW81Oly+iMW1*7Rv`{D{mgE9*lgfxq4+iv}j<^|#fcu+?+?iQ``$$G^ayhYC$emS4 zY&MRwaXlvjaGVs35iovn?thw%8xA_fRy{5=%q9G}M1MgV++}EfIU3(vXyPb^01eOdGkt%y~+V~ z@%+nHA#PO))De3v2$1s{a$c(^mLCZ5kO!#$I{Lp}MC=V0FvlAe#NPCWOlTlh5De&1 zP)=+$=3N~JIZ#IIE%bj2xo@N9+o)HFUWJG)M2$75v1Try=bAQR?_lr$StN3b0dwM6 znXQcl)Lfedg@8V5QNM^F1Tb4sI$*D;n%Fwr(>koJ!))ssh`s9v34r`}%b||gdgQK0 zpY>S3tT+JLiEY3U&(v%KayOJgGqLwD!+Xhq`tPCM`)SZftRxzeAO|p03GzRv0p#GB znthlGCB!~LpN~q3l?Fost)qq((3k1Y{RzU1? z7m}cu*cTdb{sn4P;8=n9FQXtAFvnN%P(ti$0@SNSd}SuI5yP`M`=*fCx7hm@_xIgg zVpX`mDy(h6aSQHoOCz!GQEO{3;Cd@&sYYHkYW|Q#Y#Y|Mr9wTi?O5NA^_mdKhZbT# zCO{3b9TAWN4a9y50Q9K!hh(THwiEZYvzge>iGa9Y(g68&agYh9QHPm-Eg`lm5=sHr zyHR&HW~|2?^)Y~Zs4s#JVta7C2j_cmzBd+dzRwSkzb_psi8TZQavG|L{T2qO|9c4J z6T|Z{+g|{+#2SMk6)K>e*dNKzLF@pI2M}|R1CC9&ZfYiWC=yWrFz(}UAz;Qo0|0aU zSx&4u7*O{Jjz^Glq!^HQ6upmTLkqFL!XX2yh_$$o1ZBjIVXkASd#s+=@hB)Fb^`k+ zQlN%dEBdq|wiPv7+lZY+{gcQ$r2%=TFw5U@fVypgfY>(FXlo{RIusCd8Z(|j%`?b7 zQvujJ>krX@{j-IDUS~UqwTD1Hv2%Wq2`$9VBkw%!?;phflM4;RIwGN%*aZ!!aRK`m zgCG@9>mqtwLXS%cP)Gbt-u)77po9L!5^~E|dal@HXNi z0HPona-a;bClM>tpq#kExk7Cn0$IeZXh6KxMBGk<3@8Njwz1~;17e(Ps3Gnm&rKnY zXJhVV5%7|0KNS3h<7F^fkxt8;s7(^`ImQXA?}a){c-FT2*~M%{BHSB2I$uv zb-M>c44_ZC(Kj860r5eRfY_jF;{A}@4|V&M6Yq~c{V_xT z3gQE>J^;N3G!PGtfFfuoeq}0PZD1ntLFf@Om-tnHXJtMFbwZ0MD4_6$Ohym z)&gdqf*Mm$e@Y@`LJ?F$EAgq=n;H$NkPqlF73Q%tr3)QfMGPhXZ2gAb(C4ltUBoxqc80sZap5fEx2c05#^J*F4Pn z0P^wqGk;(%6a#9`cOe!s0e$A<^-MubN*bWfgMJVLsPSMG@dW{p08fYfI7_%-8f=EaJ%(FO` zcp4F3g7u{tkPoQ46m^%PZaV6wheAA{W_kgXLlg03*jt94%QB&k_#;@$K+VSy|3ooV zK`Zf07b2jN_>-vfWCii35c5zRQun9Ouh1>kH`dLMGG_&xwW-;x8ih#dxS7{!$Pi|K&8| zxsgx=O~hZpd@D300cKc<+?D8;Hy2uozuG~3RV?w>f{EuR5`P`*uU8R&BLH#%v2TU~ z>J$_cUyc5FUgmF=5q}#wZzllyzTHT?FdWjMhWHxHvnGr9JLvmPJMp!7#EURTQ9W@y z%kp*A#NWl7@8$z$SdYHzQL~r>Y82NI-w*@ny8*S|3joBv?+2NH{gQCNen~U&50L)> z`hFM%MZ`Y}0_>F{zBCV-h<_XcX;4LcBlb6@0&+IRLIv@%P{7_N{*VBu`zfwJZ6&@L zbvL7bIS0&Lo(1j1Kg%TkIcj}TOS}SWUlPPXF7dDY;PMgohtGF;C9W$AiGLFYnD?6k zs3ra_YJQsnb;Q3zk1F)8sv^Dxaa&r5e_u>|EAqEi60asmf>Po?;QWUSs3yJ*GjGGa zZ9|RiSgXOk)ZqL_obSNij&kBZ#X&Ri+H~SO1EGxg&#}-z{1>d%X~-x3YXG3vu0&`f zz8m*dkNEl$;(H>Yg81HeXd=EZ4G`0SnBO>DK6ViQy^#3+2&g08m<(9^BZv5bKqw%7 zFdV9gH^l>D4k6}H6Y;}19&RB1XBzQl4td0n_(Ku#qrrgVU#RgHW@!lp9FJlB7}k$t z{W#)J;B`3>1DN4N3-MOW(V7EI#7{;-I+PK|?|0y*k^tv_bBKllXe8bi4%vX$>vRyH z-f7f0jq5WZkOswo*t2-O&f@xP9r1R2&Ds&yUPJsG;?89Oa`5>kKaZI6^~C?dJpW`s zE%6S-bYuc@FZe+sloG#)^^0?%7@CP+3J2t0svtqZkPZzb41dUmCK6^KBtkyal3>x0 z2{j~m800`R34wKib%9!-52)*FBGCzZoiYHqeu0n=&lspB(F^On zib({<0{ZmMAkhc8eF{nRjR4dO!d?(^`{k0r^P1?NMFP)iVn9BL;4mm5ab-B5?m!#| zmXa8R`h$=Yg1JK)NL-ahVlZ+CW0oO7kOP=I6g7v2KpBZ)QGgo5(RX+)iLhj7Au%GI z#7GXv8KnXJ!%-_7{YU!)<{uLdm4NuMSR0!PRU{(ND+1@^2r@{F_XFgQZzM4x3{Z0d z&La^M*+k;%G-xGpO(wLFxE8V3V$P^|D1;6Y*Wupq*`>HX3a~a2H76o|BJ!g1NZb$s z1tcb6#z}Jl_k`z0F$wiZb$y@k&plxP)Q;V^Tnk@In2kTt1>_JYM5?9Pdto4ifjIkhnJhq9GM3NF<Hw~@fJtVkq?fON=%D!|?p#7#+qa%d+pH4?BtwTZ;EK)|fiG61tqYaoH= zQ;~$6B+QzGxTG5BATb@arz3891qnQdiWxZ0ME{w%k7UFq*OHhO4OxI*vl>av#y!kV zfI1R$5}}O*o+HIv)SZj?d6;<~?rR?E%tQPG!H^A2B<2SJW}BZ0m~B4#q{Kol;65Hq zhI$eUI7C7QRFhbUo(s`)VIkCzNDTzkNUb2T2sIaBhKDeJ8fra^yoV9D1Tjl6(~=ev zOA(un8p|->BZz+l^E{eHA|s2$V>o{t`%hqo%p?*|hLL#cGSqw;@mV1xo@pfUYz$z= z=SoOqr;~U-k;L*)C?N4dC5aqd=b&Fs4T+ahNW7d6h|kR-@k%&UlUNY|xW^UsBvzu{ zO62CDMjno@MgwwI1w$$z_qAAPAd!!}`~=7a%=EfHpvUVqB;L?~+&6F!cpejP5=22d zltC+rf(S^1B4{SD8a-B{-fGlaje2i|K{koEIiv#W6e6cE1L{ev!TuWLuR-iPfshC# zB-UbmZ90h}^en=D5%$-i_PQJr@4Ao&n14Oi)}#LV4id#!+Yk=L&`RPxoWGX|<$(S7 zBLUa%S3nDi67(oZgnVcq@j(#8Ll%?*Vm=In1VGIX+em!m4^e=gAEC}i9VALaAQ=jw zp2Ww9`8Wv*pozrB0LXw!XeO}>0u3a#CP6I;JRgecdJ;bbK@*8>=(i2~ zcrFy%+ep;lScCN+? zWh8dtxC{HcBcYl^eFz|Lj|-S(PdSOb98h;JV)mln-a|0OX56o&nH4LG?Dlx8nOU=I>I0os-T_3 z1=P8a56HXdLIRYMxa0>>fSQ*YNKybKLM}9uG=d=+ilBw083CD4OOp9RI+T;-E~Em^ zg&)L19<-8_VSqhZMN$O<@>L^A9S=1mttcoZX(P_gC+VQ4gMMxZ6QnrB)ca;9myWifS7<#$R&9N zVy-|;Pd`Y9Hj=&406Bqk0mt6R?Tz(58G!4)n7uD%4MI*3VuR{Q_KSf+lKq1qm*jvD zz;!VC1Xqx}68l%yk{pPd1Di<>!aarrLkY>N`~f+GQEzZI$sq)nkL@Hw5jPb3LyJ3HDp_pkHa)zPDFx=O$B*2Wr@}UgSZ&(Y-;TnP<5)vQ{&~G?;53hzM=pY#u z0O1e^DS#Qmil7qEFAV)gpx+4e8xaG^kO>8Vek0It1p19czmdTZ1&NRj=rzj9R0%4FC6{C%b^ZhNse{_{YInTX!IM6 zexviC6l$QENHrqSjc{8XF0S8=C@IPyl6sdSjcQ zgJgt1ghDhVLK@^i5mZ1Ow2&OfArR1eTs)vRe(!-Chu-6=pb^?hjz^6Nu_Pmd0l8Oe z!1>h)B(HIyiR86dk3yZOT&N^@T^Y&iv!I;h#6ptMkx)bOh8V~vISDl;C6l}nJ!7g! z-qbE0|zUn7Xf-NL+-L1l8+$fkvx)*qVA*lBr~F* zj^tyQ?J>;p7-~O`8jm-Sd?FEQNoL}hiI^v2p@JlydF4}OB%h9eDw0`P&qDk&$$&ZW z{41X=CHY(cpjWmZTt2pwd_EI!T%H9TBwt7aa+0s1_G`@~^Rr359soro z-w1>@g_f8&^-2YbDu$dGP!we@laUlD~&T5ww%s9|DNmUq`Yr5OM(Z{>T9AA3%=- zSUb>0@?avAlWg(_^lNG$c_<#Rc9;O?hq3l&0@RXhjso;Ok_5P)qv4QE@-IKgg?f@L z$Z4q{c?@gE(C1hy$>Y&b0_`MEpw9`!wIZ&yhUCdeC?|Q!AIeDn9RoPF#R2Z=v8xR0LxfW4kr>s3K2&<{|rH|FSFOsY=^ zRFUe7zCneg`bClIkDUJKJs<%vdvFT0lDZQ01_lA{Z4hDxRgwxxg$`0zVGqx8YB1&- z+(v3h93VF|m((V+%;#s-ck7ZNY%++c8gEIH@}VN!=L= zb)@b}A{CG8_-0afx0AZ3gw(wWq!KQ}^?hm3NNO@>xF0?7{Gg^JlA4P3X{bA`fmBi! zsp-k2W&{D|oQauc){sh`3pmayBsDt}5HmXyE?-wc3#mDnaZUuF-W;sY!TOv=Qgi(v z7Sf>rP-h;8C_w*tIZzF4q#g(W)OY~(AIO9vz}|es&&LcYL4X=~u22t#Ko(%m2T^kY z_7OIs>DlH1I zpN6$GtUVkI(U1eRq?Y(WEEGaBsinwYnhEH;w1ZT73{;U?hPY+PPy&d1Bpgxz*N@=( z(NIW&e5fat5d!g$4W-aR>aid|eS8L|9;+kuxC;@0evj9XdIEDjf&3>Bn;8owfLc#- zNQ7c&CG}J!q?i^_)MT-gD)ovIC%u z)bpr==Nk1q>Muv{<(T;e?7ff#=$k`;oE-GY=^*uD6l6mish6T511dA9P$A*R^faV;$HKIbii7E z5Trmgsn>%c3sCcoWN0GwCT4iEoK!(HAZ9hz-wK0zQg5e`DnzfsN>ccoPrZX$@6?i7 zn*fcZiZDY_JE?V5q~1l3^&C*6crK|8m|+8A-^(KPekh<`Nf{|T&!`Wh0M{QCk}6FE z#FS#Mw29Qmkx)fyBl0(*&&CqyAhjtL%1M=Bo-(YL6#>>i2?Nymq>a?45l~EOGXd&u zM$G0GQsp6#0qvylyrVut&CgNi^K@t?^#x+TK&=YQRe|%0EI>>}1F0`HVEs$Peu;Wt zBL1sTh=(*Nh9**92SY3%_v>;%TxB360OqS~B=rsM>6;ix1+0BjL+V?Ca7ckNXe0Gq z2qZ&3)RL;wfS4-GP*nx(q_&{nmN>|Oa#G)iK_#iJ$lZ!s_)Je#qgQnSsUJ8*Lk`rF z+J@Y1h}nktZRoc>9uT*^gH%lJ)KUR?1;RlI;xp%aX`Y8f30rhIpyEYYS z05x`^#!l4OiR+&OAstEpdB5QLmqb9FU(mZQ7Eq_I0MN6piPWzF5Dghn42atm4(PF~ ziqvlG?aqe=QuRTQ1{Hv~J(y(=;`ShJFLL&lliKGGNr1J6KtOy$E~(%AAO~7W{T>gf zv0p<3Bm(yKmjUK(#7vD*fb~Z7Zfqj;2WJ1H1Ug6^hy&cmfd*0sk$(_94%U!ra$zpy z0QL@rLIz;(a4;kSW;u-OKLa5J3IQ`UhXZ;wqt_9fA3@%cT2e=mcQh67di{l*zmlPf zR7)7-KqIMRaZp0)I6*9A0pd>}_XKiJAifpnt?5uh>Llu%OaSygh1cLzB2b*_Wd`6Q?%^-m78lIp;92XZe2 z0oE=c<|5WE){we{d%TnlO{6IW8c7?8&_>$KB+dMwlr)cmdeR~gascNt915XR`{G{umXZ!a z-=JJ*CfzRv5Z52G_eXwz^up(fdO!x?JUARM!<8JO0eJ&mzzhRXYY_4Vr9vI)ka)n_ zRY8yi^`r+Qe{d!g0b+)r_7KDmsUjVU*+S7j6tSVTr189}hvq{I>0wwORsrp#hhy&H z<)p(R0d+QxcV>u_~=7oWN-_+q1gTRxk)};{rj9zB8~sgIj2Zk^`G<0zmMbR z|C~!2OlSUct|`a}`p>zA^QixvJ9NE~^q+GV=kNUIybBF8n*MWMP2KU=R{Xo~4-{tN zcNt%vZ4aZKW&%y3d6Z7GD48CjWe`L+;Cd!jQgAho7Sdv@jiNC8_1br0bq+m@o#|MO z{@2g*u(p8i!FkHR&eD*x0B7To^?zG?*uSb@&KQZaFdF-Roq2hxp#NpAd(eIHe`a6s zui5`yKkWZd|G(bzO?3IkjQ{B_gZ?-7`9Ho2|GWLUl!hOvcs+*W$I^fO7)G=Imsfq( ze|gP^;cKvv9z@Rne}(_Iufx4~{bpdoh4?zA;WZmUmtViT@D;v%bsN@~{Ogq*ho3Kh zwZ`M!F%~~x{<{79D>#C}@fG~<`FGJGyl3X&YqA)X@n>Iffp_UB+~H^%gFB9(ak%#h_#VERuAyrwims#U zX(HY?H{dn6kz(*Jx|wdFSp3!Mx6$nsM|a@;dKbmh-FP?MO9^xzO{V+t>%kP7O4BHb zrW^f@0YMyN5=7-kGN!i*8dNMn={Zj3g@7-NkHW1KPGm|#R2 zR~y$D*BVjAb;k8nLTf3Dp21%=yo#FXS$c_Hpw+a2ij0Z0oc7Yww31HI-}IspP1*Dv z{Z1$8EqaemQyYHGd51orA80Fn6`O%~VJ?1c*p9DUHEpAxsD^%|9drcmk6);kcG5@q z6`_@0pdGb=i}X*g7;7%-U*BF9dP-3@?pG(mf(BfDBkan;Mbc+ z=`qTna#}-A(BpVNJV`BdoIW>hFeVu{8ZpLA#?AQO2wyaAF=CBdjoavwLB{PyoNvGI_RW;|>xF_s$X#xmm(<544n4$wj4G2?OL2_w^Z(s;^v z+Q>4VF`hM^GqR26jpfD*`1I>zBgc5rc*%I#$TeOuRv0UdJmXdRhdQW<4jHSA*NlAQ zb>j`=O{2hAZMan@)z&Kc*8e~b>}f^pHfWRhu^rpZih z3R9ZO)TU+HrenIMXZp-erk~l_>|%B`{mpJ>ce95XU|wPNG<%tWW^c2P+1Cs*`{WvL^ImF!JK5?XvUZ~nKzran6c)q=56NfW}JD4d8c`o8E@Wg-ecZtCYbk` zlg<0hM01Kc)tqJ~nbXY~=1eo$oMp~7=a_TNdFBJ=d^5#-&|F|HG*it*=3?_9GtGS1 zTw*RY)6He(Bj%%KhWVKJxcP*cX+CK_Wj<|Yna`Ndn$MZp=JV!q^93`x!-Iw|1b}j z2hAq)ka^hr(`+`6m`BaO%og*QdE7iHL;IOz_#~KF%w`UAna6yr6Z2!8Sr^uo`Lk}UJL|y$ z*cGfN>%{_DZ`OzPWkIYT>(2(TV0I-N$Of?xb`=}UhOkgJlnrCUSr{9^MzT>XoQ-B< z*jN_9#r%knEn!PpI$OpbVUMy5_85DdJ;5^Blk6$>G|OVouxHtGESo*gma`XF4ttTk z#9n5(>=m|xtz>!ZRkn(~#`4+g><#uND`2bHTkLIC$kwoT*jiS^*0FcldRELfu=m*e ztb~2QK4c%UQuZ<1$TqPu_6hrxZD!@{Gxjp3D*;njqR>{6$-?Hym72CqTXIoh{ z`+;p^+gT0!k?mkV(VMK6?PNc*UsxUcmF;4?Sv}js_OgAff&IpQXZu+r`-2@|2U!z4 z#16ARSu;DrjV+vlFb9on)uj->i+DW@p%0*3Qnc^Xwni!7i|i>=Gw#aFa96 zx!{s3uDQi+?r@iT+{Zg{Ki-*l;a#~u@5a0H9z1|w!F%#vJdpS1eRy9U#QX97d;kyT zSMq^;5D(#3@xgou59LGoFg~1z@ezC^AH~D@Xg-FI=wAI~T7NPacHhF{C0_;vhx zK9NWB8~7xCBah)X@tgTAJeJ?eZ{xS~IDQAeli$VT`Q7{;elJhp_wmX6exAsu@Tq(n zPvX=03_g=5^I3d0{`kyXJ`aBgW3kV~gg?qN z_+$KW{shnDPx7bu(>#km!=L5P@ofG)U(R3PIs8Tb5`UTJ@>lo@zLMwhSNSUb8qepi z^EddLynwIfZ}GQzAz#Da;cIyjU&r6&>+y#kHt_fO`@DpIz(3?4@lyUV-^e%dGX4qw zlyAl#I{1u#&cEOl{7e27|C(3wZ}5i(zT;JV3;&*P<<9`A+^b z|Ap7_U->S+o7eL_d@tX}8}M87f9LyoBmaXR;0JjVKg197Kk*ywkMN`XFW$nB@#Fji zZ{;WXDg2iBHh!9);b(a}KgZAWe|QJKz%TMkf`lPV!2}mVNTGxlmav5*T;U0y=p_6^ zXVFD;75<`|=q`GQ0C9!rDSC-O(OdKpeMOMyC;E#4B3N8028uxCw~ za1ka(h>>EH2p6Np7%^5vh;d@Pm>?p>)#4g)t%wrWiR;Bg5iM>Ilf;c8M%*NB7Pp94 zajUpZ+%Dq89pX-Lmxvd4i+jYqB0=0ICX4$;qL?D4ifJNAOcyi6Opz>RiP>U~m@DRq z2gH1lA|4bA#6poO7Kz2;A(18?7E8oZkuH{rN5rEdLp&xP7f*;x@uYZ4JT0=sGvZnC zoX8f>i{;`4kt1FdFNv2$u6RYP5GzHVcvY+tuZeu|x_CppDGJ1D@s@a76pA(C9kEsv ziFM*#v0fC54dOlVz9zPoh@r6hDh!M4k9m>=L_0z1So6ihZI%{3d=E z`$ePpLmUtXMUyxr4vRlUvp6D-ioZmQI3|vZ6QWg|6sN@BqD`C@XT(|2F3ySb;vdl= zE{Kcbk|b$JQ!>e=kWwnCr6q0YNLPB&Cp$?$*;#gxU8TS5CcDcXGC*D-d&*uiQ1+I6 zWM3I1`^o-tfDD#b%7Jo_43SsK!E%TUl|$t)Ib4Rx5ptv)CBx-tIYy3^5ptXyFDJ-I zd9}PoUMr*Ib@F;SQAW!fJsR^BRalefz_d564H-X-JZ-SQrJuS}5l z$;tA5nJA~osdAc3lGEi3Ia4OfS#q|VBj?I_@&P$trpO270=ZD8%0+Uqd`PCrhvgEv zRHn;i@)7x{%#e@C$K?|;Q$8u5l26Ml`HXy4J}0x~^K!X-LFUL8TD~RUmW6VSd`GU8MRJ{dSFV@Ea)W$NzAsDU2l7Mtkt~%T z%Z+lAER&zePvvG=E%P(Yw{8D};zm}Eq8~LsLPFBe+@_V^eR?8pcHo0Ba$RFhn z`ID@bJLS*v7g;BNmAm9_Sugjg#ykiW^_<$l>H|BwgdLD?h^$;0wb*({I9qw+7= zB9F=A@`P-aC*>*mw``NA|Gq(anHYOorj zLe)?;Obu6IYJ?i8MyYT$T8&X-RfHO+#;XY`QeCaCQP-*{b)C9iO;pk91~p0DsAAMj z>SlF|idDC&+tlqUPTisIRClR(b+@`l-K!GReQL70UnQz3YO0#1lGJoHL(NplYL=R< z=BT-9o_avdS1Ia2wLmRYscMm0tR7Nn>S47+Emi4inR-M$sxs7L>T&gi%2ZFPr_|Fb zOFg5WRnMtx^}JfHUQjveMfH+;S>>u%)C#py<*8TID)pMmSFfu#)SIe6tyXWTw^gB9 zqux<#Rgqe!-c{>WvD%>CQ}3%1^?~|OeWXg&$7-Y6q{`GM>Ql8@m8;Lx=jsbpp}tgK zsjpR~`bK@LzEf3di~3$|Rn_VTwM}hTHR?yTL;a*`)lT)Z`bE{LU)3(PTh*&QYOmU- z8q{yZtllwWwq2xH_R))k$?q{jJ*6X>~@ORqg7W zIO?P;Ixr2TYf-9>lR{<@p)u6yVJeTD9+ zd+9*kTldj@b&&3-`|ANZSYN3J>One0U!@1@Av#nK)x-2~9i~U-9t(t#8ni^o=@3-=uHWx9C`XtG-R&uH*C_`c8e9j@NhV zd-T0JLEon*>-%-0o}#DfX*x+y*E94?ovdf+*?NwitLNzl^n9J7AJhxBagX zou(hwOY~Bmu9xXY^rJdMKc*koPv}hjq<%_2t+Vtq`dR&)&eqTC<@yDkqhHi7>6dk` zenqd)D|McJRj<;o>3sdVenY>h3-oIJmVR3o>NWZuy;c|Lb^2YsUKi^P`aS)=F3}(8 z5A{d7RDY~D>P@;#f1*Ftn{~PVOnrMKws^;TW2f6&|X zc3q=?)I0P~x>oPhKkHv~o&Htt(z|uN-lO;GeY!#arhnJ_b))`6AJ7MNlRl&m>pyj~ zKBAB6zjTW}rjP3rx>cXlr}W>tO`q0h^jY1m&*}5}AKjrZ=!^Q2MV4Wi7PGh|ENLlA zTb5;8j^$dO<+D0jepY9zi`CWgx4K!~tsYi@b%oW_>SYC5y{$f0Un|J!XZ5!RSi#nn z)Eyoz`7eymhyAk9Dt=VBKd;w(hqQ zttr-2Ynqj0O}A!PGp%H6mNna&W6ibZSr1tAtrY7)Yk{@UO0^bQi>-&OH0xn&iM7;9 zx0YFtSdUs6)??P=))Q8y^`!Nb^|X~`J!3sWu#adyl zwDPQ1tyR`*R=)MR^@jDPRbZ{Q-m>1d3avHPJJwpO$XaK;Ypu76tqs?!#ZFcw3@6# z)?w>UtJykY9ku?lTC8K%aqEQDYMr!BS$|t?)@kdEb=GRP&ROTJf2! zrj5Vz%oet^m91^dwr$6DZO``Eooqk5v)#q+YWv&W?Cy3CJHWoe?rHb31MS{+AG@y| zWcRcC+XL)i`$~JDJ;)BRud)Z*L+ns{s6EUcZim?;?2+~;JKP>^kFm$v5%xHHygk8= zw6C_Wv9GnG?Cb37?TL1@eS__ZJ?F{=d`*HgTJJWvBe#(B@&a$7epS7Q}v+d{Y<@O79j{Tzj zlKrxsYrkTzuvgl7_N(?P`!ze?e%*e zhke1mXkT*3F&xuj4tInj9pz}pa%{(OT*q^KPAA9D>FjiIx;p+&H>bPP!wGP%aC$nu zoIt0y)5q!S1Udbj{>}g=*tyaf=nQf~oU5F{&JZWm8R`skhC5--2xp`-$_aNyJ7b)& zPJ}bg8ShMRBAu(9Yn*GHDCauodS{{&?cCr@a&B~DoSU4Rom-q(=T_%7=XNK~xx=~B zxyy-n?so2R?sXEJ`<%(n{Z67Y#hL0%bCR6t&J1U!lkCiLW;=77xz0T20cXCG;ymaq za27hL&LU^A^N^F~JnSrSmOAOqGUpNJQ76NB%z4~-!pU@=be?jacCwsjoM)ZqoNVWL zXSwr&ljFSTyyU#>1p7W}+%6ZMncV2hiaNcwZoYl@-&f89*v&MPHS?d%z z>zsF;^-i&~fi}`6=RN0rr-VMG%~a)lKxOm^ZE-%Nr|4UH&iTkGbv~x|osG^W`ravX zK5;&EHaq3cXU^x&7xWc zkIoL~C#Tlg>HO^c;?z06I=h_RPQA0o+3W0c8l2yp-<|zVqw|Mzz&YqNIftCX&Yw=R zbHq97{N=Pb$DHHN38&RL>6~)@cG{fNbk;fJoORlrbIy6^AE(2);9PVrx#SwI=`xqQ z!j-OawQISy>$tA#xjwg(>*scMySQClf47_4-R+uQBq_H~2Yer|ut zaR<1;?v?I9caR(6UgZvUhq$5cP0a$# z<6i4Vx!1YZyA$1L_Xc;8d!rlU-sIlw-r~l(x4O5vx4Uuf9qyg(U2eR4w|kF!ubbfB z=T3I-cN5(y?o@Z0o8(S+XSg%nWOtT3+nwXib?3Pcxbxi<_d$1oyU;^KI=Z`X1mY3%iR~;9QQ@{CHG}F z*L}rZ;jVP^+*jRI?rUzo`?~vv`=(pqu6EyY-*yY#HSRm^TFR$lw}@V+6Ye@%hyTUo zyY6~gPcOU0lt-_+8{GHY_uUfr1NTGsBe&H3*xl%Ea?9LL+)v%jZn^uJ`?>ptTj74` ze&v4cR=VG~-@4zqRqht|dv~i_?f&3ybGN%S?vL&c_b0d3-Rb`9{^HiTzq-5J-EO_R z$KC7ha~s^>+~3{(Zln8$d%!*DHo1q~!|tDMvwOrn>i*@nxX0Y%?g_WmJ?Wlu|90El z)9xAftlRFMbI-f~xE<~V_o92rBhT-Kd-ab#p~+% zd)>V5UJoz8yTa?~_3{F}-d-QCuNUO?^ZI)OykPH2Z=g5G3-PY<275!iP;aO=%p2~7 zc_X}$-Y75J8|{tp#(ELnIB&c+!He{+_O9`+^`gA%yz9M*UbJ_EH_5xvi}7yqZuV~R zV!d0v+q~PoIPVVcPVX)+-n-ko$Gg`{@b2>_d-r>Z-V|@DH_c1(rh7BInO?Ft%bV@Z z@#cE-ya&AbUW)gix4>KIrFx6J#oj|+n)k4`#9Qj6d&|5>yhptZ?=kOj?+Gu{d(wN# zd)mwLp7Eabp7XN3=e_0L3to=*qW6;bvX|?<;;ryjdU@Wf-YV}kFW-CJd&7IvEAUo( zZ+UNfh29$P9dE5y%tcd%t*f z-ml&+Z?{+P?eX?{`@9D4H}7|Ezt`yf;T`Y}dQILT@38l$*X$kfj(UH2E#5KjxOc*9 z^-g-HyuZCR@3eQuJL|Q3=e+aunfH&^;a%`9dY63UGkm6x`M6K`q)+*@&+^$m$LIPy zpU>CH=jZF}>*DL`^Y?Z0b@%n~1^BM;_4M`f1^RmX`uO_#f_(ja{e1&`!M-bf1AT*h zA-=18gMCAMp}wKMVZPzMFy9E@NZ%-5xNo#?jBl(j!Z*%0-Z#M)>ATu@jqh4tlF}|C8H~Vh!#r`+8&H_AcBzgOHo5W$UG>89VzT2~S=2$Z$EpL{x zbdYnLapH|*dkx8EkC~a7nVFfHnVFgSE2(~-QTF-v*>vmG$g0MAtEzi?jI)fhjXlOW z#<|9M#`(qt#$Mw><09i?;}YXi^ zHWrK{#-g!gEE|^_E5@p^W~>`Wjbp|Y#&P3H<6g$Sjr$n)HSTBJ-*|xWK;uEigN=t6 z4>cZUJluGM@krxQ#-okL7>_j`XFT3`g7HM-Nyd|nrx;H)o@PAVc!u#z<5|YDjprE8 zHJ)cY-*|!XLgPioi;b5UFEw6fyxe$&@k--W#;c9j7_T*6XT08cgYib=O~#vzw-|3V z-e$brc!%*$<6XwPjrSPuHQr~u-}r#>LE}TlhmDUIA2mK^eBAhi@k!%T#;1+X7@svh zXMEoHg7HP;OU9RtuNYr7zGi&g_=fRK<6FkJjqe!WHNIzj-}r&?L*qxrkBy%gKQ(@4 z{M`73@k`@Z#;=Xv7{4`sXZ+sygYie>PsX2(zZict{$~8$_=oXN<6p+VjsF<`HU4K_ z&AhsKlDWy;Y;G~9%&q1&bGy02+-dGIcbkT3nwDvsj_I17>6?MsF|T1>)4Y~>ZSy+j zb4&6}7vHE(9#+`NT(OY>Idt z?3z9EcINHPJD7Jg?_}QDyo*_weRE(A&C;yQQ_NG%)6CP&Gt4v1v&^&2J?1&)x#oH1 z`Q`=YUh_ipBJ*PN67y2?uIAm$yPNkg_nG%JXUzTPta-p3nRDhr^N=}jUS=LP7tAB( zqPb))o0pp_=Bl}7uA4{AW9Aj+aq~*^Ugo{c`KHhwS`9$+c=9A5*m`^pIWLeug%|>zcqhn{@(n9`A73l=AX^Kn140@X8zs$hxt$QU*^Bf|Cs+Z|7Tszy1I3e zC8r!)TdXN-tF_JAZtbvkTDz>>mSLHeW!aWvxt3@7R$z6kYgpH`u4P@@x{h^S>;J6l zS=YC2VBOHVk#%G1Ce}@@n^`xvZeiWhx|MZn>o(TO)@`k6E3_gjwh}9~GAp;bR?oVf zb$ja$)*Y=oS$DSXVii{38dyWCv?}Wq>s0GB>vZc3>rCq`>uhU}b&hqeb)I#;b%C|l zy3o4Fy4bqJy41R>bvNto);+9!);+BmYri#X9k52$oORGTWX)TbS%<9!>xi{zEm_Of z<<^R|YOPu8)=}%2b%k}@y3)Frb#LoF)_tw}$xqte-+F-cKsi*bt>;+JwVr1^-+F=d zLhD7=i>;SfFSTA~z1(_*^-Aki)~l`8Sg*BSXT9EfgY`!1P1c*Ow^(nr-e$esdWZE+ z>s{8nt@l{(wccmF-}->{LF+@-hpmrTAGJPaecbwl^-1ef)~Bt{Sf8~%XMNuKg7rn~ zOV*dIuUKETzGi*h`iAvQ>s!{ht?yXhwZ3P4-}-^|L+eM@kFB3rKec{l{oMM6^-Jql z)~~JKSiiM?XZ_y#gY`%2Pu8EUzgT~@{$~B%`iJ#T>tEKtt^Zj6wf<*c&Az&QlD)~^ zY;Uor?5*}Td%L~E-f8c$ciV<-+LmqGj_ul>?c0Ifv9DoY)4rB{ZTmX*b?yJNuV-K1 zzJYy1`$qPS?VH#)wQpwM+`ff`C)>BRr|r;=?AT81)XwbO?%F;3cJ}S< zJJ@%$?_}TEzKdPheS2UJ?b5F7Q|wdi)9lmjGwd_%v+T3&J@z^Fx%PSX`Su0&Ui(7( zBKu9*>m{YLvu_M7du*l)GpX20Ejhy70bUG}@} z_t@{X-)Fzy{(${K`$P7J?T^?WwLfNm-2R09N&8dwr|r+!pS3?{f8PFr{YCpr_LuFi z*k853W`EuOhW$FjcLJBDLAmSa1P<2s(>JAu=2uHjtMxt4Qn=Q_@Ho&R&L=Um^pfpbIW zM$V0$n>aUhZsy$FxrK8}=T^?Go!dAkJGXVFozRJ#*h!q!$(-EjIz8uh&h4E$ICpgJ zN6wF(pEy5te&+n#`GxaK=U2|Jo!>aWb$;jk z-uZ*`N9Rw@pPj!re|7%m{N4G7^H1kr&cB`iIRAD2=U&adx_gql$=&R3ai`p^?lyP3 zyTje-?s9j#hHJW(YrBr?x}NL1f!lGf;a=0dmV0gYI_`Dd|8uYBUf;cedqej|?v34> zxHolg=HA@Bg?mf)R_?9c+qfsYw{@r8(2d;KP2AMY+}!QDJ@-NGu^Y?v)w)JIqtdcdG7h{1@2z=LiZx~V)qjFQunUz z-Q2so_i*>Q_jG66{qC%Lz#X}B?m_pEJMUiR9(EVpBkrQRYKHq(T`$G3c?u*@*xG!~I=Dys0 zh5JhPRqm_Z*SN2BU+2EweS`Z(_f77b-M6@Jb>HT`-F=7qPWN5zyWRJ=?{(kjzTf?T z`$6|Z?uXrvxF2;t=6>A$g!@VNQ|_nT&$yp;Kj(hl{et^N_e<`V-LJS`b-(6*-Tj99 zP4`>wx83i!-*vy|e&79p`$P9f?vLG{xIcA&=KkFMh5JkQSMIOf-?+bZf9L+*{e$~Q z_fPJh-M_ehb^qr6-TjCAPxoK$zuo`1|8@W8UCq0?capcs+w5)ero64*HgCJP!`tcY z@^*WMXL^=rdyeONp67dk*YU35UDLakcWv)F-gUkI^RDMz-@Ac#L+?i3jlG+AH}!7j z-Q2r{cT4Y9-mSgccqeeWz0dxrN+?^)inz2|t(^`7TF-+O`gLhnW1i@le4FZEvLz1(|+_e$?o z-mAUWc(3(d=e^#0gZD=7P2QWmw|H;$-sZjCdx!Tb-}`{~LGMG} zhrN$@AN4-wecbzm_et+l-lx6Kc%St?=Y8J$g7-!5OWv2guXtbezUF=1`-b;T?_1ut zz3+J6^}gqQ-}{00L+?l4kG-FGKlOg*{oMP7_e<|r-mksic)#_2=l$OMgZD@8Pu`!s zzj%N3{^tGN`-k^W?_b`(z5jUs_5SBy&A+;TlE2B{>~Ha>{H^{rf4jfK-|6r2cl(BK z`j&6|j_>-O@B4w@@vq@u)4!H~ZT~v{b^ZVIujgOizkz>4|3?0e{hRnV^>60i+`ol? zOaE5>t^M2hC;PYcr~S~6{Mb+Y)X)6f@A^IecK+@CJNS3>@8sXvzl&e^eShE&{nD@e zQ~Xo?)BMx@GyF6Cv;4FDJ^nfVx&C?n`Thm|UjIV>BL8Cl68}>FuKwNpyZiU>_xbnq zXZ-#Ctbf2C`E&k3|ByfLU*;e77yKjsqQB%X`u{*(Qu z_)qnp=0DwkhW||eS^l&A=lIX{pXWc{e}Vr(|3&_b{g?PJ^s){})^>xO#9>uqoIaYzd}=P1a}PX6x=zuOHc&;U=R$0GN^)6f>VRj zg42UDf-{4&g0q7?!8yUX!Fj>?!3DwI;KJad;Nswt;L_l(!QFzp2loi}1@{bQg8jj4 za3B~3bHTyjP%s}{790*1f+N9VuoNr@mj^4sYOofp2S*Y!Rv!J1aA!96udcjOYqj2s_)hTM z;CsRMgC7Jx41N^+IQU8M)8J>p&x2nCzYKmA{5tqe@Y~>b!S91V1b+b|w+s_nZolXTKf*2z2FPOo#j&h0yQ=-jb$r_P-_cj*+JerM1b zcFIoGIi+)I=d{l0oijRTcFyXY-PzMQr*m%Syw3TZ3p#r{7j`b{T->>&b7|+Uox64J z-nmC-U+12kna=*sZ0A5{)S2rX>>TRMcP{H3?kseUbQU{Ho#oEuTh|xor{zELA$dq1 zk;mi-c}kv<=j2`T9(h6DCm)cPLQ>V0->bH-&aE9fzIm8%<<<^p7j5MDr^^Kz@+j+{Q zAUh9Eu6LX=e!-4|w?w`cCEF* z)CKyQwIh-VMK;FPskT9(3N$QKfrf=D(6CSi8WyTR!$K8k zSf~OG3ss^`#l$nGP%kL*6O`^fGi zyN~QXvir#HBfGE4JM1fYgaajyaDe;)@(0KtAb)`T0rCgPA0U5#`~mU@$R8kofcydS z2gn~He~A1c@`uPDB7cbdA@YaFA0mH<{2}s($R8qqi2Nb)hsZCHUn0Lmeu?}N`DHqF ziq86jO{OEIM0$zz66qz1eQX)R4O zt)+>kwKUPRwnj9qtr1OYYedu98qu`2Ml`Lh5lw4rL>P1t23>?f7h%vv7<3T^U4%gw zh54@YTk3h&Y71!1Fzq5ty9m=R!nBJp?IKLODAIn3B3dG%B_diPq9r0)BBCWCS|Xw) zB3eS2y{7Ugq9r0)La1Hu(-ILa5hFiFevJGW`7!ci+4@)P7I$WM@;AU{EVg8T&e3Gx%K6!|IgQ{<<}Pm!M?KSO?o{0#XS@-yUT$j^|UAwNTYhWrfq8S*paXUNZx zpCdme2oM?O)LTSOgIkL4-vRVG%@F1Q8ZNghdcx5ky!75f(v& zMG#>TLn62&*8%Du}QOBCLW4t02NE zh_DJGtbz!uAi^q$unHoqf(R=h!U~A60wSz{2rD4M3W%@*BCLQ2DrgE9P&-{H>V374x@Z{8T!A;^}C6oocnpKbFnA1u$1r#d zgU2v<41>oocuYtpCL|LRl8NE%7~YQI?HJyU;q4gSj^XVX-j1Vamv}k*M+-~GCY6G` zW5_#(ykp2ahP-3QJBGYt$UBC-W5_#>wDDueJBGYt$UBC-W5_#(ykp2ahP-3QJBGYt z$UBC-W5_#(ykp2ahP-3QJBGYt$UBC-W5_#(ykp2ahP-3QJBGYt$UBC-W5_#(ykp2a zhP-3QJBGYt$UBC-W5_#(ykp2ahP-3QJBGAlNIQn4V@NuNq+>`rhNNRiI)`rhNNRiI)`phJ<5CHqOf}YfFnutGf@(k5)#j^Q#To zQ7kMUnrSY#&nzyjjTT1pGrP*=)p_y0o7>yUH9kL0B4Ev}U3-qq*C90pds`3h*mGob zP#?1A8$mW&R#$1;(3Y9G$lCcocT@X9a`FQ{`|osGn+1$S>H-&Hl1^5e$znyowGWx zVv63b`h6QEGI?+V@0b}k#I8}RM%$zy+B|iAnk#QzKi~M%=H`~>?>Fz4$G04;E4Ssq zXkl$;EAQHTrF^id{&20STK%#uhnuP`G*#0=_6H{|uAg+p{MIF{-=>vAOH-?L<-#pZ zwrNf3i2O~ zRf8jj_~K!*S!9P(&EIW&rX&^P`o_4vF|Kcn>l@?x#<;#QBpE}JF(es7k})J1Ly|Eh z8AFmWBpE}JF(es7k})J1Ly|Eh8AFmWBpE}JF(es7k})J1Ly|Eh8AFmWBpE}JF(es7 zk})J1Ly`&ZY=S$R;Lawvvk8=#K#2*Im_UgM?refPo8ZnSkYNHDCXitQ877cn0vRTd zVFDQ@kYNHDCXitQ877cn0vRTdVFDQ@kYNHDCXitQ877cn0vRTdVS*Ez;KU~IU;+;& z@L&QDCh%Ya4<_(n0uLteU;+;&@L&QDCh%Ya4<_(n0uLteU;+;&@L&QDCh%Ya4<_(n z0uLteU;+;&@L&QDCh%Ya4<_(n0uLteU;+;&@L&QDCh%Ya4<_(n0uLteU;+;&@L&QD zCh%Ya4<_(n0uLteU;+;&@L&QDCOEMPe3-z82~KQ+6Pv(~3H+GAj|u#kz>f+1n81$- z{FuOx3H+GAj|u#kz>f+1n81$-{FuOx3H+GAj|om}f)ktI#3neg3H+JBp9xNEf)ktI z#3neg3H+Mi#3neg2~KQ+6Pw_~COEMPPHch`o8ZJIII#&%Y=RS;;JhX{uL;g;g7cc- zye2rW3C?SR^P1qiCOEGN&TE46n&7-9IIjuLYl8Ed;JhX{uL;g;g7cc-ye2rW3C?SR z^P1qiCOEGN&TE46n&7-9IIjuLYl8Ed;JhX{uL;g;g7cc-ye2rW3C?SR^P1qiCOEGN z&TE46n&7-9IIjuLYl8Ed;JhX{uL;g;g7cc-ye2rW3C?SR^P1qiCOEGN&TE46n&7-9 zIIjsI?Sznaf-{@o%qBRq3C?VSGn?SdCOESRPHch`o8ZJIaCw3go8ZJIII#&%YyzJr z@Oc8CC-8X!pC|Bn0-q=Fc>a}@Kg#a}@Kg#a}@Kg#a}@Kg#dmlvGpybWt2e{y z&9HhitlkW(H$$6bXp;!mGPFd7mdMZ&8CoJk zOJrz?3@wqNB{H-`#w^d6xbZ1- zA!80_*`WDET8~+uF^e;1amMV;n7tXZH)Hl@%-)RIn=yMcW^cyq&6vFzvo~Y*X8CZc zUXo+-W=!6U$(wByn8}+lc{3(&#^lYIycv@>+Zeh`;*3e0VN_-ql^I55hEbVeRAv~J z8AfG>QJG;>W*C(jMrDRknPF6B7?l}DWrk6iVN_-ql^I55hEbVeRAv~J8AfG>QJG;> zW*C(jMrDRknPF6B7?l}DWrk6iVN_-ql^I55hEbVeRAv~J8AfG>QJG;>W*C(jMrDRk znPF6B7?l}DWrk6iVN_-ql^I55hEbVeRAv~J8AfG>QJG;>W*C(jMrDRknPF6B7?l}D zWrk6iVN_-ql^I55hEbWZLXx5EGn9RXvd>WV8OlCG*=H!x3?-UjjAa;O8OB(KF_sZr z$q24w7-t#ASw?UrBe;^W0+F!-k+A}iu>z4ZUvlP4&V0$4FFEriXTIdjmz?>MGhcG% zOU``BnJ+o>C1<|m%$J<`k~3d&=1b0e$(b)X^Cf4#MGhcG%OU``BnJ+o>C1<|m%$J<`k~3d& z=1b1_%^ANr<2Psg=8WH*@tZS#bH;DZ_{|x=Ipa5H{N{|`obj78esjie&iKt4zd7SK zXZ+@j-<=qWj+V3juVvQ1m!qEIZjZ{yvvz)IrA=O-sQ}@oOzcs?{el{&b-T+cRBN}hjHA) zIPNo_`rUZ@+L49P+S+JE*XsJrq&_pL&rIqwllsi0J~O7zjOjCD`plF*Go{Z==`&OM z%!ocSqR&j|GXwg}fIcI=&q(hxqWg^KJ|nu%$n7(7`;6Q^Be##H@1yDaX!<^yzK^Ew zqv`u-`aYVzk0$S<$@|QNJ~N@uOz1P>`;7QLBfif_?=#Z-jPyPuz0b(*GgAAEoIWF` zkD1%Y%)n`QY8Bu*kRG$&mXGHZGQGG^KpApq(MD-a_eMVHD5!Giz zmAKg@Zgz>AUE*e!xY;Fcc8Qx^;%1k)*(GjviJM*GW|z3xC2n?!n_UtXFA0m6gvCq3 z;w546lCXG5SiB@GUJ@2B35%D6#Y@8CC1LTBuy{#Wyd*4M5*9CU5K0_`5(lBgK`3z$ zN*sg|2cg74C~*)<9E1`Fp~OKbaS%!zgc1j##6c)=5K0_`5(lBgK`3z$N*sg|2cg74 zC~*)<9E6f^LW!eL;wY3j3MGz0iK9^BD3mw~C5}Rgqfp`~lsF0{;e?WKLP6-yCzOP}OTykI;f0d$LaE_}a9Zmpd9xfQd9yc4@@8+8 zGTo`&6$9-gsZ5 zhXpr#H6(BLYDnJf)sVc|E+BccS0kKOeJ45cRo@9lzUn){$X9(Q82PI21S4N9TfxXz z%T_S*RUZmQzUsqpTJ@piw5M7If@x2+48m#Ecal?HWpcrkSD9Qe0~WnOrdCRVEiqd6mh-X=QTBDX%iQV9KjZE|~sTeJq&%SA8s){!)D`nEq0IESUaM zeH>1!K9-#Nt3DP?{Z$_erv9pr1yg_3$AYQ9>SMvwUoGp9-MEsg9CqUhRypj(6|8dD zjVoB|$1YsKT0eH-3fB6u3sCdt{VZ7fH&Xp9So=3p{VbUJt9}+t{Z&5;rv9p* z1yg_3&tatcS#s*H`dKjbSN$xQ`m25xO#M|q3#R_6p9NEY4F?OR{u&MzO#RVs5&A7c zzeVV`2>lkJ-y-x|gkFnOUx$(EYssmv>gzC4{VX~4Q~fNM`l)^vO#M_p3#MIF9}A{F z8txTLeRSC|j5N$EIsK<$UcvOATC#%aKMnW@MvjJg1=D{TA`(n}G|VfQ{?hZ_3=!StVcz9D;OC8z%C`3k1~ z>iG(${%WTSroQUw3Z}m5>4xl$m7Myiy)Kygsl6_k`l)9tnEI(_E13GJ9WR*rsXZ^4 z`l($nnEJt&5qufJm+Xy|FR@WS_>#S`av%BdC3|D#KJ|q!*&8eOkq=)+@FaU-L-xW- zjy(90y{~eg`oV|neU*N{E0lG9)CAA4QpKJBS~fneUR{()fHPyGYIlwUnz z`4(TZr&n_N4c=srtK6p^@Fsg)Nq%Lu+?FRc6>{RLmL7dB)stmKRr z_>#S_a-Z=CUq01Nlk9<&`?M=O$sSm_Prc#E z2%e1K$!LQoH3B8iqX#qs6~?-pD7m(`?1`&EjBbMj2pJRBG zy|D6}jwANM3Rd~-feqRFDmn7tP4>RZeclgGve#Aa>o{Vst6*(c_PU1bah05U!H+Tg z7{iZjZz>{oWmHYG~JjwP| zxleuINw%-bed+^GvVB$VQy+LTh9_fqGKMGF-WsyKRdVFRlQBFQ!;@@(mFMV3c#@Tq zkd+h3wcS`b5v+QTl@q}#hm{k-+HRS~uLNtmv2r3<>&eQAU>z^4oP?~LNUrmRl@r0* z&a9jW)_!B+Ss{`8)DvE0g+%Tn2VP`_MD9~h zc##znxv%g>2$bIS$ud+fCvO*#`?GL}QLL&ER zfA}@SFU{~vGk7+GXES&#54}btTfV@p!H_r*#ABBS`WR} z!~XA~*Lvu+9(t^Y9_yjUdg!qp_WlriV2C|1#2y%84-7T#84j@rh8p)2tmAWtJuuX` zr`*@^In=nPVAVrIje82#`7zYEXE@Zjr{p?5hxpY)?1Lfp!4SWCh+jR#uO4DA46zr6 z_|-$~g`vhh<^4K8h8p)2to<_7xMw)TZWv-W46z%A*bPJc>LGT+5Wjke-7v&%7~)qC zu^Wc;&k#Ns;x`TPi%Qy`xN}I{S#s6G#GM7}xFGHto={iS+Mp$ap#b@v*g<#mK^!SHHbUQedH6@ zAnq*pkxyKs#BM9G+e+dZC3YKe>5#az+$FP7-V61`Y5?@IJyiC!#;i<%PnPJ(5 zCrjcYCH7v4y;oxImCWyw`CVe~mDqbFagma^NSRkt7ad%gk%NGaX?9U_{J_+)Cfk0| z#(u&z>+vgi5*xHCn>Q5OI_a#OI_cTobgB8q{I#^ ziJO$zfhBR15<9RYZc<_gmc&g;?7)(^NQwPdV*iz_Bb3;GCH7y*Izoy4S7QH_tRs}z zeT2O6!OfQeyv=*ncH)l@j}}#QrOF zhe22pUn#NwO6|4Qt?68o>j{wuNnO6(|Q zE3yAd?7tHGuf+Z|4Qt?68o>j{wuNnO6_WH&K1^Cg*8;c#ue631shke zafLNh!NwJATwx7WuyF+&S6D+8Y+S*{6;YH5Hm+dfidBY+C`ttzSFmwK6s3ZVE7-Uq zic-PG6>MC=#uaQ_!NwJAToFa7SY@bS;|eyeh@w=maRnP!ux~~5q=J1b*ta5jQo+6z zY+K=lRCpm3Y+J#$6<$aM+g7k`1M6;rWI^j!KM{# zTEV6jY+Avl6>M6;rWI^j!KM{#TEV6jY+Avl6>M6;rWI^j!KM{#TEV6jY+Avl6>M6; zrWLCSmF}ktE21bBs|poSl!{e_3ihmE&kFXeV9yHntYFUy_N-vf3ihmE&kFXeV9yHn ztYFUy_N-vf3ihmE&kFXeV9yHntYFWIRfmdIhl*8)idBaScCBF73U;kv*9vy6VAl$E ztzg#*cCBF73U;kv*9vy6VAl$Etzg#*cCBF73U;kv*9vy6VATp%tzgv(R;^&w3RbOP z)e2UvVATp%tzgv(R;^&w3RbOP)e1JPVABdVtzgp%HmzXO3O21^(+W1NVABdVtzgp% zHmzXO3ihmE&kFXeV9yHntYFUy)~sO73f8P(%?j46V9g5FtYFOw)~sO73f8P(%?j46 zV9g5FtYFOw)~sO73f8Pxm8e*isNl&8eyrff3Vy6M_>t9!iq(jU)rgAKh)P!@WD&oK z#z@{+osu_Rr{s;-A$jBVNZxq8k~dz5=Z*CU$;kROIS=H?HsuZ#}J`Cqk3ARi$z%yzFY9vH32v03u*{)OF_ugmcS_0gRx ztD^%v%j=@pkV8D>Obt0jax^1aG;O)!nDuBBk=r(`EPG3aC^JHd3alAU1WDT&FsX_QyVLNMi1vJlMkN*01C zpOS@O%BN%@nDVLXC7ALldC1NX%BSQZnDQxk2u8k=hhXF@c?d?nl80dAD|rY;zLJOR zJel4-yClb39FZ}zHnVbEd#{K#FU+sZ01#PZQ_G`Od5YT%dsWx+regB}IizxPxxTW* z6Ub6UEl*HaRn)TEg}SPu7EE1LQ42<}Ds0&WqkR!FVM8Wt$b=1~<{s3!bWlYRE(lnW!NXHDscOOw^Ex8mjdv2mVoRCTz%r4VkbZ6ErgQ7SL;wP^-=3kunu@xWYPMnbtw1gM70hD(}`*w%2p`) zL9Ii!H83%PB3*=<4!PbuEw2U+FXr0!Bkg`JK0&sFjV78FvFmX zw@GL~!flIdO}j~N?3!N`&KG(fD-+ppwsUm(`utIu_lvXIz-+3JJ#yieLrd#4J6kH` zt`2LqR0!7gVM~QzZJ!w3$d(GZujOV-g^E`&w zW9E4bvBwZ|%;b!jlrfVsW>UsX%9u$RGbv*xWz3|EnUpb;GGv6ctBl$bB8;9Hk)``6w!m(vbU<7e&QU8gd``>V-xesUbP-rCz9DYWOv{_33y zrv7Db+xZgG-1yB5*@GL_H<~-mjOUOG`9R;uAs2%6jT~|zSl`GY7lO4%<&X<`p?G^6 z4kxEv$OGD>a>_;hfGBVb+*Bj0vJF`4l!kHrfOwAM2eeUBEYUQ~>jz}6jvvrgO)*K+ zuqi{g^?){OiUv(}DLP7-&Z!1p1yh8mDMD}Z0_Js!@=Q^lsYYMr4=Dk5Z5lNt$XYL; z1SrlF^ETD+tL%B!fyJ30f}0ZLlNaEea_EOVpd*VzKLk?(jlT+RN+4&MY%~%kFsFXV z13I)g^&{fc56Ni*R1~Lv$bEVN6~(C^a-V^K3CyVL~@1)_B%&~$bDuh_B%&~$bCi!_B%&~$bDuh_B%&~$bC8o`@K0T zWO@I>((GZ?3h+8dg~%5Cc&k{utk}j7{A2R9I?ZuKhXEVX0JNy(??_ z`NEo<5`SQ{rAfCQIIMZ?W2SIa3P+`IREk58!ci$4mEsVja8!!zkz#wK*dD3;oXp(( z!h%Ggmafp+V`ZdR87Wpqij|RKWu!%K>QwnbiX?8bw2pMu?^zLJmKRacL2s)5WsHT9 z-iCcrje$n#pln`%%ggyH^1TKI0p!E^DsrDe0Qqpfirmk)&o3U`zb<7!J~WY*>5ir4 z(PH}}jT_ceqbXBH*dZhAkP&vs;DwB^Lk2HogdH+?A;YxJ;Drp+IwR~LN2ef1X(1y{ zm=Pz;V1*1;$aK9;zRaPO%`mDnNFl?h&UF1vp3^ax!3h~gb%s%$VN}b3En1GS+Om3B zno1Fbz@aVj)e+@+4s8*vjYDM-7+Yc=GUz;f|ZLh-5Mj9!KYhe1WV^Hi<;5SCs>nZ(dOBO_5IvT zwj3JGtgLN4Fh3(+L+UzKVA^GFsOgF=IJdhCihYglsrhCdvreaK4OS zh5#XzoI2;!DW^_3b;{Fnswt@c8Rrc|oHro(#(nKl&Kr>X+N7K}AXsabV>#x!t|9le zOF4%?zHFrWf^!B0^L|~&5S(nUJR~OyYMR#@4U0rln7v0rGcXiQSU36C$-PJ{Rb8ySnJEF1o9W?&_kuy6CPhx~q%s>Y}^4=&mlhtBX0?#hmS; zy}FpQU9?x1P(T;$)y10aqP@CUvt6`T7wy$03eZJ+b#*U+e4$L+zl-+jV$60iX1i#w zE=1Nvdv(!XU81*Lv{x7H)y0HzC( zfOR$?x;nr*8(^Ich^`K>&e%CDU*J+hfStpFbuP1WSg_7zb`A^Hxy;UC!8*U#IV@P` z7dwXqYx}ZuSg^VZ>>QRajv=4%&CX%Duk6ImVZlld>>L)X^uW$x!KzExIV@OJBRhu$ z>-b{lu>2T<&Tn=O3szmj&SAmGXM7JCk3+`eknuQVJPsL;L&oEf@i=5W4jGR_#^aFj zIAlBy8IME8&RSWTtntqkM84r>-<5BWvJV@S*M~U_}<3Y|N-N>79DY*H2 z$(wm0c{45~Z{~&M&A61jnHQ2b<5KcwUP#`IOUavgA$d~{$(wRW-jqY~rW_KqLB1O3 zf|0M$A;HL316?rkH9901`5GM(jC_p_2}Zs~hXf;EqeF83D)KeFE*SY59TJRu<#@r! zSB@8qeC2q-$k)9Kf|0L#7X%|;_by0~3i)~xfnemT4Imi#y5~3 zzF_1l?+Zr0@_v!4UXVQ8DW0Kh@Si?e_Bn7JwyvZ4y0#JInV8R$*5_&K^QMgQTr)-_ z@A7=F^-RINe(N2B*7dOUY*S`=PcvrZ%Lmi?w_&S%VN*Wt$CJNRy()jxj97 zK``>wZV-%owHpK@U+o6Lw1v)N`2q&=RZj~>zUoo=Vg{e99u>UtIptG5D)(t0)uV!G zAJwCRX&=?2f@vSsqk?H4)uZx75ZXuesNiONOOAZiqk?H4)uV!GAJwCRk*j)B@KF0Y zYmLi{ahbKoW!4&(S;pVwlkt%;HnV1I@_8{ChgmZ|b=>RzIr;JmZK?a`1XCA{stBeo z8dVWYT{Nm9n7-DiieUO$qbh>wYmKT1rmt03%9mr1uewq&@>N#~M!xDw!N^x#DH!>x zD+ME8b){hBtF9D`eASimB^>QjwpR$&K4p7_U>#FzuMn(bitQDGbxg6nLa_F&9B0$C zGutcVzLtaS6@s-K5^~q))RvMj10i311;NN?&a(|e?rS@Q%z4?4F?C>NX=x$UEZR{= zo0?_3aB>-KU0aeR^y8s5cs_Zj!kuN;`2CT`FqC)}Bn zrTfKQJToWKRySTeJTMYZdVU3g(T0HGWlP7o7dIkeP|}f*-h%ut5^oz9-#qdD()Q)i znmn_1C>&o!ySkPamR4o+%9iD&rRA_mqb7|lsoctO*)%p!`Hb<6rMdyPH(|=ADHj{ZR`0IP z9~iBTMr((5)qg5m&E{l{`oJ!U2ON^lIwB7GflZ@>2e-+;S^3T2!&{Hf9G3q>@`yYp zPsmg9j65grZdx17OwBIM&5cG=2iNDt-PX~i>uT~qpvp zTaPXsuXiHI&kW71u5Ft=G?J|eqt$Kmv!mIS(ae!8XVgFFyXA0`9z0o=tGAtc^4!Al z`Ui*iube!)zGeTFbvoBv&o$Re&Gk}qeYCkg+FT!Nu8-B%n`i1|f1S+M$$>f<)yZ6) z9ITT=buwQkm(|JPI$5ZbBXzP^Crfp*Tql>;N%Q_Xks(s!wK`d^lcRNVtWK_|ljC*L zl&Mal%|(s-buy@vVV#tcG(EuSE^=s_>JK^HW%FtE6Q|e78Fg}Iot#xCXV=M|Iyt9K z&aIR4>g4=7xu8z=*2#r+a#5XJTql>*$)%EPDNdH{30r2GwBMxrn{?2mvrRf|(gRIe zHtDEIt0tXm(o>rBV3VHOq=%aHv?iTz($kytvL-#FNe?&anN7OTq-QnhktRL6Nf(=R zPm?Y+={Zfh+@$9=>E%s&UX!jg>G@5%+N2jW=~|QSZPN87y|77-Ht9u8daOw=Zqh57 z^pYk$-lUf{>6LZ5V{K)9G&)l6NZqwxW@Gbvv?tFkZW~`Ty9edYP8sJTnIVVe+Pr+d z-m@mV3TIYoY|F2S&(yn@nr*AAa%bzpXtmCF$giEtOj@aLEzd8H>by2W#j_??GUVq5 z<-U?3N3jT2GUO;0!Ab%g$s$tK%RT`RX_bM!q@@f|0L|gJ9&V z;~*IM>Np5SzB&$qRlazVP5W~+i=2q4B+Nb{!AipHBND8Wn0-Wo)d*l8kzh3f*heH- z4NLYB30A{W_7QD4D62nnjdXEW$T5kgBQ@csTP^@4k?q-hmQBpN>Bbb~es^LPPWQOi zn1aaAmcg|acLWo3x@^6#np}sCE2V#nsWOeJG9AX72E$bTNj?~EUzLs8i^463wvXyr zP+x5oMyc~1YsW?lM@RML?wR!i^GmZctFp&-ZM6HS5ak$c9$q+1>m=ShyR>{; zu#O^rUr4aZdWs7 z$$gzgY$g({vxv<^f_1F0nMknCA~p}n_n&pVvUy0b&RTv~NU+XYepg5^@^B&eT_L$o zeQ_c9T_L%@A&>gvLh!pn^1W;1>!vWl$k*js!N}L;TEWQIL6diag!PEf{&alUp$Ibn}y7Z!Xk<$L7xt8RJ{OuuSa zOECSaVJ*RoD-CN2W?X4lOEB^^tR)!v8rG8U539T$_3Tm49`)=|&mQ&cQO_Rr?CB;i zd5^YhkNWngZ;$%+sBe$@_NZ@<`u3=AkNWngZ;$%+sBe$@_NZ@<`u3=AkNWngZ;$%+ zHtMTkyt1cZys`%y_i#;nxTZbWxQA=ngN=K*rajoWhilq{jeEGJJ=nO1Yuba2d$^`O z*tmyl+JlXIuyGGI?!m@A*tiE9_h925Y}|v5d$4g2Htxa3J=nMh8~0%29&Fr$jeD?h z4>s<>#y!}$2OIZb;~s3>gN=KzaSt}`!Nxtd<9{?f-qk}n6DtrR}kha2=f($`3k~(1!2B|Fkhj|C33z3<4>1M1gpL+ zbh$*Z>ia^MOXM5|)xU)++>w)%S%iUkXOPE?){pzAj%1 zM!qh)$oUV**X2yX$k*je!N}L;Ou@+4Ed?2rOGq`(d-u)7NEkOI4_ zzz!*}y9#)}(9Pg-9)z$JIR}QFL^WWByZ-uF!Gi61S4O0PcZV8 z_XHzfc~3C%mG>%sFHmyoue>Li`YZ1VrvA!%f~mjqo?z;)yeF9YEAI)W{>poDLV>nF zzc(mY<+BxAu*zpEwqTXdR&2p4pRL$}RX)ErC|KpQ6I-y#=l2HXWCY|Z?+He}@}6Mi zEAI(LzVe=6Z1X%T^oD9L==Z$|ZpEv$_?PJUJ zc)3Qdo8=nrH-5U-PxYjHPJ8LL50OiIE6>X3w4ZJR5sX~rUwNK(Q2rH6J1GAOrXBKu zmLVDY|MD5{R!)|8(-*qCOzKEqE5``tbLEICMQ5aHQ_JZX^qu;Gf~kx8f`WOU`htQP zJL(GxrY&?iNigM8Ur@@+*ioB7Fy&F3q25)kZL2neVC1XKAQ<^-Ge~`qube6Jc)$9Z zf_cAkPL(R>NWL*P7?a9{(th-Xa-lqjeB~r*FZv*F^?~w~Jj>tqo26hmVWe3K*7_*7 z$UWpKw+QBM)Yg&u(bsD02xiPH_sH{%4YhsbbHI_!9Q9h^aYPU(hP)@Z2=+yzScPDZ#+BRQXrp?w-m@b8T)E4N}a)KAIRs7MO{*^ z+iN4PC)eX8Wx1w3)J_mgdkmWRq2Q)W^wD^$gWPY*wRLu8ZU1OAXUli%56Srra&*J; zXk}JbiFQfc?uZ=aaAZlAly-@loR+g!PoA4!oKa9jCm$IdmLP4`e$;w( zG2Qw^z~lvk>cmebLI-6_Xg_QHjeu5t()MF%`>}SldsnIUL{8CuK~}b2op)Pr6EOLk zLA!DSCdKKs%ht==pY+G}!ihV2)e@anAfN!2cnfXNH0_V5=l=_~=Q$J!0jZC6{s@*BOg@ouJ&_|?tOn*))S>Fv6VzhfZn~`93<4YT#iyM96m zCwwvi!?yAhO*koQ(H?RFCUOL{9t&Ha2-QwrEnxCD0w#YWy)prLTlM7a-WM==fq>TE zv`1Oqp7;VD%kh&imEs zGFRpJYB;_cjIa9Rt73fB8(($DSNZrV8(*cX%Z5mkb9R$`N9Ej{BQwAZXs^p}f2I2* z9SrNVpYy=o@|7QE=)^@l`y&68o3GkU7XzHolS}z`gGHsyDtW##jCE)nI%jvzfmw$5++H zRV3wWd{+4hX?-dhmopldGa8pO8kaK~mopldGm>&LXyv^dm-51mOL^n^rqvZ1J(kyQ zd?N4NxRe)fT*{l*n<dPTaVZp4Ga>{bHZ0=%#0KT~U*> zLe(S8bwy3EdeFJ9s0mh2FxM3|!RiU-x}qjnz1Un=)C8;7o9l|2VD)-)B8oW?#hi#@ zPDC*$qL>p=%!w%GL=%J4e~bVwn48AiZfFHb~l4 zkfAs!ThcD54Bgfz?Sdxlg31(VJ=QL0(k^JyE@;v&XwvSIq}_-~y9!CW3TeCH({_E* zc75upJ#P54U7xgFpR`?{v|XRHU7xgFpR`?{v|XRHU7xI7f~;MFtX+bvU4pD#f~;MF ztX+bvU4pD#g6xD6v|BW5w`kUG(Y)QFdAmjPc8lii`sD5USS0aWt~)Ya!Q??S|_K~$?0`+MxC5l zCuh~k*>$p~PR^;5bL-^1Iyt{iE~t~eb#h^yTvR6)*U2Sya;YS{3;AZaoXWO3zgnX` zC!oD;v~w^kVXuXSnfkeU-#QycSLcjotJ)aKMrV2X{yLehlLK`!s*|}oIanu$>SVr7 zE~}Hnb+S+=N9ts;PL}FqxlS&xla)HD%P3o%C0VbNqjhquPOhkv<8^YSB)er_U8_<{ zCm`9#H~DPm?4(kyO|+|XTVxCD>fH9C`IUwGYG!;@j;}`JtJB6;^W&>MSjE zw@%Khlk@B3f;!nN$&S5~2QRE|UQ{O+*U2Sya;YTpMTeF7r2}%cZFcF%kr}zzJ+r(d zJC2u@4~^=l>RUTzCU4qb-<++J`mbcvNHSL^2kYceoy^zCWpyIkmk-ORk>p67EY``A zBs-QSFI=u~US20Fl5DH@^sm;aX|Z*=+Oa-)_-Osfu{yb;PL9{fm6B{2zQHe8mqGXjzZ`Ckd<+-9!7umKVB#D6g4JN+8~lRRVB#D6g4JN+8~lRRVB#D6 zg4JN+8~k#Zx`y!i2ESl6*!Tv&VC1tD$~XAsKK0ivK!T}1OQC#&U+yD68g7%*7v`2E zPQQJ2X?}8)kDTL95m*i7OZ;-5E?^asFY(KLnt)YEzQiy0DFQ2we2HJ~Qv_D@_!7U| zrwdro>$0NPWks*cie8r$y)G+yT~>3ttmbrC8SAn#)@5a^%gR`nm9Q==VO>_jx~znC zSqba164qrUtjkK69Pgt;m6fk9t4m#0m%6Mbby-d7vU=3jT|ja!KJ{m%sLM)GmzAO} zt2$j)b-JwLbafYyoTra`R%pAdXm(lA?6OkVWu>mm%2QW&0mMkHTzn}hR<+IDmXP1@FF00#JR=2yXZg*MD?y{QQ)!oeUKBgcm&|OxbySj@= zekXt_sJn;+BVTtB31+J4ZXv-;HQlu=n0o52Wx-6fZdE&E^1A}l`wlK~8BQ*v$z?pb zOeUA<m^jIhY}bR+I8plk!%R@>Y}b zR+I8plk!%R@>Y}bR&{wd&F!1pBLDWyH|fIGM(OWc+qAlGt(gRU9J)Swv5!O7M=$on zoal2qbeXpU!2%|MQvr40v|ehQ&NZ67aa}*OaXksHcH8k`0h3n=m^>z{?~_oifXQP5 zT938k-FZ6_E}->Td$A&KFJlOpJXV|#n{O|d$S1AG+TrS=y}l=4@>sY1HUX0=2xvVP zw`$sLFO~{uJ=PZ5Z3`99daS)p(9PRI+l!>#cEG&bj<|QV6Lk=D+d=l;37|bZigxn~ znAB9jq-;f7sDRdE?I?Y}-5>%cj|rH(P4-?)Mu>pcW9>BzS)Ok_)*i>Q(V_J>?F9|l z)-d@S+1GFaX#GvQsrv0T&Y><2Xd@2W^(oo|R>0(K0w$G{%@8f2?XDlRdtuP7k8BWV z{Y|?|hVA+!?fwx^3vE;bhoQ*tbSSTLD1`jphU#U0)~+hyO@5Y6epf?H9)6Bau<{*0 zM<-bA4Ss%3uVA75PChZut+c9c4oq*QgwAYuT zcGE@e;Ul2+H*Gx>wL3yU>#_F0irO#_DSVBGFg0jR6y&o zwu+0}y)B^iSi865c5e%4J=WG;aeEvHXg$^*2T8j{1xy|jFlo1>-PQtHkF^)5lXfo% zXg${Mg{0jJ0$Pu?dm(A}f`Haz?OsUQy&$0VSi2XJb}tBMJ=X4pq}>amZ6+E@_BfsZ zS})KRJ#qaty2|=1O5-XI#V4-6qD-#xPRe=1$ zoM2Ue{KA}IRe%-2a(;16?yJMaFUiRd3h^Gc(eg`ja$kLCeo0QS`i}gPoZyZ3sAA=p z1sDK?-v|Yl`#e&CGb2XqUDkLoOtA+gn^^00{ zUvj>voUG#SfQi2zmtSgQSq3dc6_x)2006@P06;VW03hI-NS&_BD$+3m06-7^di4Io ztuDI8&|2RP004&gmnr}N#P8A{F*8$r$6pP7@z(?KzaW@extsiIn*czNumBL;m(=Q6 zl4i#GMgTwrm%ko{Usy4=jF8QKMF1c|{NFagFT^;3bVFv=PHw-N5C8zAHvoWk?Mfj6 zfR(M`uaD|?E}R&@TBC;kuAjBOn;ig<@$PRw^k4ANVgT-J^sSA5wb$RZGX1UxpD4|~ z%g)x(2>{5H8UVm@6#(G!&cXk#(AC($IJ4SRAo|##w-1x4rkzF^9^YRlj;m<$MoZC^RQlSEXGLMQy`b`5lo84% z!)UwlmGyMwgrSa47n@nYz_|da!k>;7n0?a=5ePARvWNgYLsDf4L)r<+HQS)PSC zS{XiZ4CoXRh}nsSLMcU3s)ZtC@w1MMvMWV0bfZXJ)KpG_n2+U^eJRdurVsczk125d zr?GGY3y4{{WX@pSDo=jAi%ica9?~t1!aHUXrs;ESybIReMO^E79qUD&cYma~aaMMR z#3#GZUwsjKAawby0RY_Aqb4Px`uP!p_IgO*D6<9XT_}+HM4iqkf?P<9kO(FL9UkgP z$?Wb>q~)2xtlSXQ-%oANPtEoCoOaR;?|J8oW4L4~X~xv=c9eNFZwyDuwHp2f&o82f zwlOqU3MQ1;#W!djQnHyJ(Z+BmS+9NpV7ZcP|M%Ri6nCekA(WAu8j^lPQm%rXXdmV~)5_@6$F0y$CZ17x-Dt_)?j0HRF;g6wyooyHvXkO3 z1C6z+G1GKo;gj4!a??9I%tX*;pf{mPP&lf>dNtA|OzHGD9mWyXMWHp?7M@cAJ{k+V zIB9$_`kT>j{b229VfP6Dk@O*8g7srz(&PXP^|_@2&gjul!H+2+7aM?|pnR>hZ&&h) zzBQB(3uITdeR1LtN|C>ujl^@akxDCoouzYmk828IKRKRkznmpUYVvJc8*Evy|8AmO zzroq3D1?Vx2FnpLZAPR{6`;6;sLVox^;tId>ziQRD=3PTsJveQFBP zSW^jCwo%qBsq|1Sq?%^weZo@BwnW;huxrC7dSfZs&L9gF1FOy9@;oOYn zk)lkEgdzM$r8Z^c47)U~4-j`j;OI3XNvOnE7%)Ofn8dG7xAxsv{$Vg%(!EV(nf$?K zK6WIvO#37W)6%Pt9(%=i$R6_`MGhF{AWf3mh9Wdgv(jT^2+P!07%C(V%QUHv8`}^# z{F5LpB@s9(PP!zu4M|9rYNgLe5r%DApERZ$ILbh}k=ltR6wSCcZRCK!(QgEvKp}8Q zpO7V0%;Q^hW++Ysg{wx-vOGL@S!Z zXNYb1s=0)LWvOjw?i8^z(${ z$y0H|3?^5kCn|?wPcNs32w>0gy)?zucoFU_FOs=d`9J;!3T=<}UTAh5v0hw0P!v8s z*O%e>NMEEa-kt4U`}Ui(xm$ncUa4g{h1b&-%#S?k+meJl3mfh`arKDK5+vuG7HCdo z#o4g$w^7x=Fv@CXe=dy5V6pNkYd_-3xV-&&qR(jGT))QGJ!#l;q6X zzl(1v^A+SQ@Ho*i0M10IM@ZBOD1}EEB&<@G524m6TOn@@!PO~V#;+)`EopDZwH)#tfwG7_ zCFkrD8XqX&ko62r-N$0$%O0q>W5<;BwQ6P$;83c33+g21j9o}X)Y$dJyXn5fj|kD= z#-|8{v=UbT^RSoJLSq}0wwHWCb~P$!4OO&nZ>7T&D)^@)U!G+l+mlMqnNbH|keLcm zHAKw-&pCgMnHypDCyIU!=PWt^$u*J-Y}C%( zdyvZwt!D^)eLjyf^Ngp6^^Z zvvOOG=TQFX-#^uweW1)>#l@IK%U9g#A^61^CA3eFlrouCAk_mfV~P~0zNc0=D&-)k zk*M*iASlJW`})oR<@@qVG|xeuI@wFrp7@g^^(ED1y*BOu$wi`iK(=t?@*eI$&BX^d zrLLe3B^VpknX#I~9VN{rk*5BxR#}QSSf6qYLs;BI=l%N47}Hzg>|RATm8ZUi_LxpO zywRDv%=6IDyRhrB_VVO&`=veb%&T1!(~C{R*KA&`#~x(D;RubmJ#N_u$p95A?ys9t z?UK^1;!^KGSWKrdmyFV;MO+$|^X2v`A1&9}EGM+D#_Q^wmAiN0EiAfIkj`8W)|m9l zp++@k+gI9C5)7V5lTeWz4ae5i*xg*NDr0mWHyvhI;8;aT%D1j`<>Uk zYvLRIChk(Oam7~YZ|Inc6#JO_T^V=PZ*3k@*-eW1L~txf?LaXIvhdS)|-AQ@=&O8mW@2H z^WA2?joA)S;w}<`MwCZt+GFVP<9sE#Y&2VF4-8>yoS&UXSGb zClZB_J(j=Vr++bsbb4TD-4`j!ek7H2mL7xrQ=EM%FBa*_GAnfeQqJ#YM}=_HMv1^5 zMg_PX0AjGuBNId2iMx0dWzN2J(Wfc${!1W%K}rE*0YCvjK+{2gvr<6J{~v*;0Q`Ue zAfSMt!2rO)fk1#jju2>nW&wYG0Dz|c%isazWM$<5_yGWazQFvx{eII_KOk~F#9zbD z@1TAlzX||80HWLa)ykVH@(bq3-HAJp09P0~C0rx{G(IhYTtyYvl7;qpcLYRftGuw? zj=UBEsCWl}pSAc2$|0<0dG$+hbG0msWX;7f|TV2ZRuAukN#7Gh_X& zt>pGiNBh=J*QzVdQI>J%G|TdeQ;qWKBGg4rXG>?-Cw}M7ciEd+-h#8w~RURr93u!cIRcYBN{3!(KLX$F5 z;e=w2N{)PvJdT>S(zf!p68BQ~tE0W6Gv$?unTm)N`kJ=wj4nwp(s!vP*12JGQ%kg0 zxz8O7c5X=DBybzTT))3qfqXF{)9Kq_iNE?x;xs_8>E2B%JON&T`;rGyYvX7d_ zol{?O03ZvHMJNQIPhdc{W9o*reZ#kT#`Sm$bz2V0HnX=a1wD5|;fjqKf^K=ACYIU8<@z=r_bS z*1XuAtj6lZMB+>sla8rf`&y(Qq;l{;{nm9ML2U=2=2C64$qr;JY;(>q=qN#Couhkg!-I*uGB+|S&*ztww5 zca!WS+)Th9jodq~QJzc~G_@%VDKgMICgDv|{3C4WfI7;$7okwN{8##il9fbuOu6!( zx_f1&ybJ|d67skaiOgAvlL{vVPLhiRbW!-c+MQ94eq3kn_{N!2w`(#7&a}b_mTCAy zlA;qTyJMEg3G@lm3DL>aKV2%?L>>xF1=bOU1%?5JEruzEp}12qyFo5e4pPp2Y-H>M z977yK?7C?A=(uQf(MFVayLq&vu@n?#1ra z?$K-`UA-LJ9Mc@j9P1q89P=ET9FrUa*+#Nevel6_!%Oe0uFI>-oPTh2Le!|b;llaa z)Cdnl+zhIX|6T?s_CfD*Q)#Oa(83*u)D1e>#V*O35j9avP@ZW&+iRuuEiUbKA zH?CK0Hlo*x*9fh$tZ}Rbn%`O3G9(3r{p)&bddYk(zez8wE~F&Wibmr<@^2!l=`eNH z*=k9kMipBX#RFdlaN-NwV&0S=a{#ccTo%_8c8rmvBEMqvo*0aF|#nS zuz+S@hKdmk5!47)5+G26tAa_wdSfm_md~r0O*E3MqphE;o34|sV-u*S5;UT%Ls|#3 z{<_9C+lX|^+@xUG`oTgG8Sp? zXXU5n=Q#Khb_P^S0M_Pms+!ab2)k8~<`y7eeHYT1A6Vy>ViDA~6rB6jj}GF}TMpVM z7nldV7vdWMz<(AXAeVqSV0acJfB-}a0ZM=NPr88PD~txe2XQHUdL1RIn z^%02&4Ag)m^)U*29mIlBYLVvgaa07rDnnRmQM&`3YjIh7UuqFq1xT$zXlhaF^{}i$ zacYrW`fOeSpL=yy!9Vr@u!98c(0zi4?EXae$=YGd^op~Cmh8cN!kF%1e*&HC0cizE z+F|$vQ`w!uAY!zXId-=G-FS3c!7W#_U0I2b-b?% z>ji6#2ByTqgX#tTMd*VQzJ<~eWJv7AA`fo4g~OHuJCXyu>4QX4`inA}i;qv32c~=$%$KLhRaA&zdomYxwVcW`3?)O|eC^fvM(@@UE0>G%#7(nzeSb7L7 z10t(PX?k?Q*`Pf15a~J$){&W7(B{FJJ7}xmsyf)_A(vHLE&@X!cxIqDS^w3>7><~nDY$AIQ5q;+2T`}z70tVEPT{Y~` z1ACz1y%u&vGJS5DVGyZ73U-u|J*P~6CVSNBVGee*lRYmjKk-%sG<`f zBT8ESR1B~S_9!O17FvOpcU)Sb7xutDF*a8DtVDmfCPwTqrqC@(l$zg7V~6-aa>D; z@a59kN}SNK7~X)7^7m}fB5|u{Q^n}Sn`J#g90dmr2a_g zFD9nTJHAJ1$Vt9ucIT=rrmxFsT8Lhi0S7OnEXHxpsV=6q&#o*cwadGn3+%|ro(p%C z!9NxGEargC@?#1GnnS=A>HiTJpokZd`y;Ff6ICeBoNiza6IEo-oJ}f+?JbFHjx@Aj zB%x=zOu?K~Jm-`yz+{d(Rm{Phay;jy!7ttziz?4ZQ%usBm@E%PQ=+6HKt&NXZ;oO- zYoQ@%dB&w7dSMRiEsJH2Y&>tW{#TPCqIu3`U4Y9R?W!2h4F0OfyD2m(a)=NLHbuQ~LDmj8pRT9Gz1(?W}OSP|BHV`(M>FOzjdZrv#fh>vlocGu$tc zwMVY4624QwFLC%Y#G_f=$JFduMGujgGtjiLzbfNJ+#cd@O8l&p#BrBOLN%u>D2k9> zc?uqqH=_c^N-`*q*_p)hB+7APoTe9-Jsa);;5u#E_$^s}Puc&gap2w7FT19yiN%v~ zO-!!s8x+G8#!(JN#fcS%_;2%-$YC&}_;dN0F@Xc1X<89LXj*pzpn3lG_;vB~(V!`< zMA@Zmyz!YF+uOP(PypFkbY0ca|JaS~0OgN>>&OBOD_t5p|&^^?CO$v4& zB~JV#$2!7TialN+-O3*ITs*sOi0U@``ps;&_zS;kzS_P?bX)&W_#!v^pS_NsUal5T zcu^8%%-nWNJa=?4^sgG65z=XX)G@>NtYHvG)_7G)fqip@c*O4I81Q|Qd~S4PF$H&+ zuvV^BU8NLk)d@6T=vXhGvsPKHJgdLfZj{!aN%AJbe%d;I71M{->~VaefBVbwY>k{X zR;jeP!q0fACuyOE!`%-6$KZ7g@Fh3!eZIIJUwJ9ZLu#wj6-KE3dsubV9Y;3GiyNWR+=2;nj)ovBlI%|5+$!;014l~=q7d4#L4AK$OlPI-S^rd&-s=$1I_?wWGg8N)VzPw++h zlR*IQ5`l$+`|Jls_y*vjvhx}5hiYvHo;*ZerLY0|ZuwX>4ET&&9Mo*Y5SXS@j=`os zO89Er-MsO&#rj{-CQ;xKe59C&J1LNdZmK$ zLZ9&pK-v8{a2WV82Y&VS-@tCZXx<`9eQ*jO`(x7&g(dGp%-LEiSGRd^4;J#W0oae2 z`7}L83a<5{-_hNgy;3#x@vONzUlrwN4P&f2(J~<&#$3!Yu*KbPJ%D$Vyce^;Plm;{ zA9t@d0q=z;;)TcC7ZuNheV0cL4Nr!;jbRpbEoJVrusY5@F4=n_bTj3NeS@;xb@?6; z!KLJ|OXUT3Biq(O#!=(sJ8rSd{i;5(Y912G2&Pik_yc2$Ff)9a+^D@BNYZOrTd$FJ zs1I;wj9KEMpGE4icFQuL>FnQPm3JTr4lpe!&pm!|IRf^feC#6ZE~it2+%11Zu=CB- z8$k=tpRd20m&Gqt?SzrwzclV?h6A1G-y!aRnNkL(njFbZA@11XD;&FA3; z#*{sCwB&2ElQqG_Ju-67KQU_8^z;=xqJt~sG8K14ftk7 z0#i`uDLJe@4yZ@?!6jL5=@e#;SGKgrCjJ6!on$Ti$She#!ql}rkga{aFDobJ=r~Cg za^xS=NJGOv`Pj2lYIl4@oIC7u^&dYPo}9bwdyEoAH&H4V<0az{Fq{j}>X-P6mfr4m zR&O-}7wbm4-RWFNZ9 zw?vM)G?6#uCR^i>@vu>imDAw|$l*X+((ZKOI-bDjzbCw4-a|xD^!0=46>P7)4^$Pp zCd@Xj1EbjmkD@%&b_XIVD(0!Lv?vK6vQDRsfa#1)46f^8hZ=n=i&;%EP1*SOq~WD~ zO*neq2^>s2eH_6{OSSF5lG+4~)on4=orfp-)U~YEh_Fjw1 zsi$BW$#(3YFt>iQjQ6fDlT`9+cqPNnxsF2P5lNmFj%uEQA8sY@q&Y7RBQ_f|w(K3R zpdW8B`GJ{Ju7e``a{2I9)X!=Ptro=ERxjK$BMUgXd>aH@V$h$EBQi zOctp}8P)C;N9mfbeb}X=o_W=vMO%o$RQ5Bv#h?+;`dEvBdvb`@C-Lqa3xPA$Zsf+; zz)T;ktP@@RuaLNfO5p>8QQ(Nd)R6 zK0{s(+I;w~U$v@;En9w2-&|T=%*+lisWlWur%CUrPugv9dT_Wl;4zf=PutVkvO#_f z0tOq~DLeHZ!D^?IymgPh=Q801oQ-*tE{Vd9Xz;;R>>In~LYcSqdbqNTW8_%W^rDcw?$Ed^ ztEf%NT#8(cSZ~6ThBRFb*LWQsU)cbxRB<`R4X_>KDAnV0dQEc4Fl%p95$#SAW4 zAQD@v%9E-&o>fLAWT_Hyon&9a3~w6wqMl#suDXVyGJU|?hnx#4Nn(5*oeS{uz!pjz zlu$FKdPN?R0crbpMm827niFTNI-^CcB)>zS<^q46B6l@wQZadi2uvrtm+r9r1C}Pc zH5~R$E}-T&VMO%BOeGbCEBwu<6U`A0Kez`igErv`Dh8^e0_%hqbtavt#cyd z1^WW|HNoJ9_l;)S@QRM=Zm^Q*QD6Gy}hc(#DE^VLshuXf_5%R9~s^$RWP#$so&q2y99NnSB zIx2^X{E(7ilpvCDuIOgRO=JpKf%Rz@kM;QDC3P3qtCcEbQ{E1113Wv5_Zj$IX2pn? z=FLFaSI3+%3ffCaHCoobJEWJ5d?yw3;ClXPQipw8U**@ztzl7K0ttP=${lmV3u5zM z)vSZ)LW4RUQL64)af!&V06nDbD?!po|GEkI!xX&R&(@bxTQ-aQEgP8UBVwg>M7e0Pdf4Bhlo)Q^X{VS&0JYg^Kc*Or0#g*siMxe)-y7% zpkP>cn<$DnhoEPLz-c$~pBx1Ik!dTtg^sF6SSwUzz6i^d_T<>fqnncdR2NGKSifTi z?}+BD2#ows#2HeprJPq^OH*30~G z;WlO<=~4A6s-Y0%zPurkywR*br-{@+y#-vOhJgxFTYFSR`b~X;n0lC^^#pLI*zH*U zxGF5~VSZb`Dt2H#X{WiW7U^KP7Og+6xeH7oVSJ7SFpL#w@Sg{#2}Rd&OgC3cI4tVP z;g00qHD6^>mApvuIiS5oHzIPokgCLW`hW4*TIR$ObwLnxAvu4vS>PSOn)c`0U0Pm% zj@Wk9ZPap3mI6@SEB6kPHSp}Jx+>sApd+HU zb#%jBd`=$6dmYm$i5{gx{!R>aWFWH@(2)1^FJG5XWgli>2+Qkw(C;XEnbu-yk{CbJ zh)%8fjQuEiwUoAFgQK0RebuKXOTZ@3I+PZO%`q1`*=UCM_x$VbRdFYJBFoL1mCf}f zP~^!pT=c>Gq3RzP%|p_IFuQnGLpXZGA06gF2*Uw@gHo4a8!Y4+%`Grif2!rm6db`O zon{SH~XO@V0&cJnv{BhcGG;mc5B z+vT`xXXLExa@C4xl?}29(dvV34KItXa}P-`sj#jF(sG{lmuLM92Scw~QLXNE(w&UH z%)l5pMUsO`TUj0*N8)r`#m@BY+77Fsk7EnUG5u#N{_pjzQLUy>`9BDizm#I)2N2ct2FUF#9#y@s zpNlz#mLhnXt78O&iyq~duN+;EW*bWB^sfjm!gI-6?ZsO9%7m+5{t>ws zeZ6O=K2Pz?J)aeCwqFfk*vRA2yceejtNK_cY)1x{C=Or;T?8t1qUap&|EXIgcYTzgt3t|K5;gIf> zYaqDDpROxv>Zl0N4m4lPAaiunw0aoGs}Wnxw*qig3KMFyvaDA?+cck!(QnV73OHEl zhzKOMlEv+k)IFp1wxhPax{Hz(ciChUTS)Yg)t}Y0SUzv#Nhjs4)8Yk|Z&ll9<%E7+ zEWvG^4~OnZu(2+jZtm!oU~Swzbm0iG(J~amqZ7qagF|-NT|xtn{fWUQ2Ae(aVmj+u ziQeV{X{EpxJl}M$xVztos~XQJ@RK+^TeThO!qEXdRN24YAmB8Aa5;>ww*)hO(t5FB z)~GfYr?IdS-BIn`!G`)i{@?+L&N7V{niG--9%FbQ)lJYF#XajhijnQhB?HIQ1$eu6 zwha<#s2MRmz79Q|rZiMsn^=ChbKwbf9p|a)?AZ1xNHwZxVQr_>g()bg|99mzqzln; zIm{tm*m|MptfF)vhvHh!p;^lI+$6FfS;XLhTtA0)CxsvrF0Yc}L0SsvA8ocNc?hdh z|KPquKT-#ivyRJnL39-KI+u}rH+;}5J&~_aF<;iaJGWY~t+@VD&rY@aE-^BW%KN9| z+7gd|`$~+`6EKRDO9C!+eNA-g&+S1ru0+K#!F@vQcx2XyyD9F@dWw`eg!A@_qM7mX z;bXDR#uO_IYs}fKdBVuIM21P>o%IDRgiNO-7gq&4tgBnM{Z>yCoo{024bs8#iBGet zm8Zj+F09njaR5uVK!2w!?o;$4=qZCq6pNz`MZgZU&Q(sIZf6#nP{t_LKp3)@;i-8c ziH={&9x6KfuKjzVtcrXP=d?X|P{5!>yF+n3#ZeY3YAU(jvQpQI?G|`)2qW&pv+5n1 z`)h@oxM(&rt1XFa<&q{O4Mr8nM8C!d3E#4Pb{X=<9U?m0@HA#U?WT#;<$4WjP9HZ2 z8IJNDNj&%#Zhg(Co8H)_iZoQ7y$gH(*TkvPo>pJqqv0p0C zWE7^W9Nfxr^YTmisyfGd1v4$ZYcsQ}cx(CQnz7!hAwDaq5)O^Jn&4lNJBpQr`oWyX zjc`aZ81gPL4*QT^v_Q;cC@md)sFgfpKtCchGLWwtCcKsf$#w6{L@^$B_Be}jgceyZiQ>aH#qQ+X@ z)eiimrg1Ggo+Y(#pc}nf=`03WH?wL!u2aH}26MrSVr_!iK! zUlX)f+%C&7qAc1oaJ2t@w!cUKgyP~ry@ALfjq0{}mtvON&5U-293yll$7#PA7}bmq zi@WrO3X3b#ih-(TBm3W5S*!c!MKaY?xS&3%wG-!hkW&X5yJGbXQ95%c1CE9T(S*O0 zIE!y~JMjse^q?BZ4}5aP6n6NOP|zGD=zh-7AcS)_T`zG_ecme~TI6lYwPKAT&ALgQ zgDrqm^6lCVUCqip-yN$paVzTqO=WNv@^+8DtJ|p8IVv_FhHznej~_-oK97hchD%^G zx_3OqWk$ny+vB?0u38U=*XkeDco!>%NlFG&z)<4@Ao}aj4}|0o{E3s|h3A6l#DUVQ zHhXdE(1#sNZ}_`m4sNQMPk))hz`Uz()pXz8sCoTa;3Q)oXuv8CCeW;h-BzUzp$6%O zDi!E?t>?A7`B|5R>6@4(e6Z@HA%O?nR^8<2z-+D_vPeRubbO%B_#Sbu+I592fYDihEQj|uf9bjxGfZsI)+{ZV}|b;s*&xF9DDrWWb}@m-1Vw(#M!e?JQa7(sfTifqj6 zwOp2<87{rN78vIIt-2Q-?9-Ep0kk>s7uXoZBz6tFW!Y1QRba%MPRxbdo}1K5C;4%I zW1=iMWK~a%f>U>JBx^R((VCGmdO)xUA@p&eD$XZZWcYU7*eFKb5jMQ-Epe5YoEVO| z30M;vU5-_Ah_wyB=8Sqf4Ap9#<@JOekIgrht!(t0aLdzDvdJ)*W$LoaAi0AnI8;f? zVaS8Dn;C?Su>9O-2#*h}YiOS8I1~B(y{k>mOMlcHE=(JF;|$TZ zhDv$`J1ii)BIY)1mvWOcUy$@^w%Eo#Qb&8NMno|wPGEy*ebe5GBll#iluO6h?8P=t z7R^#Gacy3~3`mm;ut903@{&;GaxXd zZ&2^c8CLyY0myA6q~$46KPpQHTGY|zF4pKC3q zN3nZh`N8bFihHbcf|{wlbXp=Wb#Sz#MF!2YZszA)E4xpfuyelm4|oIEytYLjSk|Q@ z&Y8}ogD)%{{dqYGO+- zJ%OqW$l7qEc<#6|Nu`zEoPDg>i-84(Lx~!V;y23chcbdJgqxWqV=K;PHy>JJ zn-w>jH^;hG9jWt4m%@RVSS2QKm^|DcrxZ8plYg>U21Rgu4y;uOr$k7bHh{>)AGGp~ zj`&Epf1X|^WKT#(L>Z+Ur6G)y&DOq@RI~ zeB&OIfQD|Lm{Eg%Y;irc0$H7bxk!(SRF07XMRM12y~^3)&Mj?i8L8CYQJ}(RmKd#E z6gd)4w{>4`eUB&*ayqv!DfA`RYwjO#>jvm+GySnCq||=iof!WWpCqY@WHyv~u)@!%d9yOOB{}DXu!(aa*Uv$+ZN=j(6tgX!9f}us~u> z)=1)iZI0O)U=!5>k&Ul;*=!4&cBt|FwdhX^D$tI$tr|=Hr=Do6x(s0=M~W?4ODhex zF>jnO(c*Zx(^r0qG$CdNNrZ9OG0XtS_)^avS{3@i5zQVzK+;h+EU23jGRht%OOGQ&x=Hzw}Ts!Su& zjw@xz{}hew{l$-!KBzB`t&TZ9vV#d4U4`M%nQ59Alwx?*w zQsE|K>z{X7oLFyuBEo^qlol_!gRM&Eb}xFD!>Deh7adjD%y8kq*`n8r{9@eQeHwhm zqGNGJ+nTPL+1`@-cp{g0SrvDt>tR7e3mh%yl8V~~G;v`LVkhG?7!*sC_?}Ajk$+g( zYub&^MoNr%SQZqNF?&i=lc{8@asIh4^I+V_)d7&d1%+a3X_IY9CK&B;@pq=R4pHky zBwopd?Z^}2L{F#9KPiI+&odR_GyB0DbF2B~P1}iv!43wVjSeE-fU|wu>3p9uVx`Wh z&sUhD(b$G#cqvfK_Ao7{`Ik*fX8L(H4N->uT~e?Cc$?QK{7N*Zq+8VIV}CZqL`aTMi~_q4vXa;>B>_KZ|#ALdm6{1p>Z9w2O9&?_@jJ|;^{2l`}_Lr(D2D62nd%Pz7W-&fds+T8MC{5 zdEcqJQ;O3nu&2Zc&w4EF5=}- zcZU3adVY@RR_}6t6l4x{zvI8}PvCa*+jM_Fl^&Q3eZChx!1cgMib+!1l(c|JZ{2-3 zSs@Zn0&Q^VrbDlD843uvxX4V&IQZ&0xB_6zL1x;@{c*DDrfF zS~dGXab7ThD<1v6lDwfOiY&KjQ3Yc*-yXIS&D*OMVN-9+)xzm$Uj^bp_EH~sSNrwM zNL+xzyg|0^bCVa4^AX#rZ?_*R5tGxg(h^Y>B|3RJ(om!Kod z_w#eh#l56U0iCjC`-#~M)ylQ$MbQJ7#@pra>;%s@=6BwGzGvsGV9=X^fZ+Ev`hplT zLH$^i^+R@yGauOHXvy_7f%R$+c3_$NF4CQnJJXIY#>}kMxEGm$Sn{ja#b&w(pauo3vxNI~iGA zgKb>YOM1yhdGnBGw5O8Ub&yNmUv{!%=ZI*(J9htB6@P~;$%xkOp}wJRN2 zaX@58V$)_oxq2y3Ys%7*Gs}{kr2rzimiXgGmJ!^)`q$t1*q$&7#10i)3yXihf z?#{rwacv@DS+Fp5)}YQuD%QBxhZ%jpoqtlMF*hBvoeB0|b>1jwzT?;m3XVhQZMdZ# z^#YkyW51Kkp`yN5;gBP3-|~xg68=4)tjWxZsim}LO)R5vvCg;AK+@VUE39fUq|LYc z8{K&FnS~^lOao7+GayQgT7)T%_@a{bi`=JiSqERN5GPgC76 zZa5dq@MqfR;TutP$VvNtj@-K0c%T;J!Miz+vg6J2lfqP&;_?KTEOWM(+5RgRXJSmV zM|2fszAeHZq$NJ)CQ{drGu5TD#{$fazL2+IvWm%Y%IdXjn1z9~PH(hl7ic3SMB@md zVg?(Dix)|JH?dOow(c5Bn8$KNZP^$qB!ctSk<_Q$5W}It?fF_ZXHLN)E?-T}?&>)r zZZXGy9$X#QSy{`t9<$GntyjmL?0lpJm*v#2?I9$&5?S$0uSS zc&X)yI0N)LT+6ck1J&;djXsHpSok$>Ip^}s{(v2MFaHlYK*ql`P)?OZbW8+?f;JU5 z4rK)!Q3=c&)8$lVNN55PHbgIX=aDRMUJPzN63U=Xe0RxSA0i>U;0W+kQsMKG-i z{Lk5A#v?HtOr*C^KI2)g)yg4L;>0D+zcp0)^tM_D4iGjr$##HC3;+$1ifC)CnZyj2 zG2J(i4d^TA>OxczxnQ0JV6TzSXtP{xrQ|jT(`GD});V~<7C;gSx;Xqj=WtC;epsq( zh{&j}uO2)Kai+vAO?HPtl_(0`+bs9Y)*MJO-GOWS3h`~li$4h){>&*#XXIlD z<~k?vTi{D=NDSH>?T=(T7_WD7#oIX_s0b)?W<_7bmyWC$$-DvYA*G~1iAUbrZ0^wq z;9)@igmcLX09VfhCoDq>b;LuAn!U~E)fy^pCD6(+?;2hty+Z^v^m&X@-Q}unG1^NV z)cWEg;v93G%CLqIUA`yge`%Gm3!wugTayt-EUA8hR&ty3`NlT>lKxznCDV85&z5^Z z&I|juNW!0i?IP);D#wLVE2A)+DeuLAoNIXgF1TO7N&+_~8?+;lg-6a?VS(x1XwZc1 zS)N4)xt{r6}~YN2MJ_T zY33_N3x%U|4fOC!o+a_NPMDi70SQ36BxXIp7C>y0v)ttf%J)SegL`fo&^?KMFxLJ^ z7#km&;4_=d-FxWGiBOc3T9Q1w zxY(9ogQLu==6i|7`rBY@l`|L-S13MgLnsE%6X7BjISiTeVvNR3^$YBo=x~0_!i#Wy z$oUae(L?>HX_JstCnu-fd8^KxZ&ffVLnf`n)*8diD6v>U7rjuPGS$m4gt4*`Rr;dc zr;kl7!ZUK;TsoN&k|DtsOhL+e9`cEJF-+w|$SNh#M3O27@ud|Se!2@%$MERR@5~zU zDH}o#yzXlFQhN0-!ZBm>4W}NGsKF1_u%VqCdU*%VU38OPd0W>Lb+0q|e>q>)a9<$4 zgH*R{>V{@pa4V9p4CU2}!=sDs2>R?1ck^QHt4Pq2g6$YC#fKWDM~%#Cs&+P+uLz4~ z42j$G5Axy=XAYM-<@^b>oL#>6N8=-uJW@8!vKBaUxu~QI9Ua%b<=bU-L!|=(>$n+} zEt8K0U#qHnH8aX;9g3KqpQAk=-x;!YE;|wp7oHdq4oKn zd2LgmBeozC?iY&1kPQ5u@;*<*7irj!Nt-*tY9^yJXCmwwP}5wMe*(^GwtC2SSn+~$ zXs>6!V8wjpvSbAhZ@4#$-JxHB11@a1i~ZUQ9@mDqld>X(!7Xv3%RmvM5i$)pZBclj z2C=ufKF2ouB$?-c=>n?HkZqseag2pP$!Dp&kvSU%(<9Bg96j=I_FOuGI7FKisc5pT zb^fi~I7!qYCh<=)mT#&xAY#aI){))-I_sq_)>)8jQfE?i_PY!Vy%53XJ>-6rz7^{OT>=8wkE@ZMF|6 z3yC+WWT$~AAejtc;=g*y%td5nDfa7d4;9X#jP^i*%VcE4#C|ly`J){zXt9N#5Ty13 z`jWgh?`2f~3Htz&)Rb{tTJm|pQ^u^|h$I^PR@zd7~Lmq8FP}sH9y>~XuB>o7t^;`S?P8w*^)|Mec>~rp5Aw|>z?7nz5^a_t7N&EMZ+V9n|T_4j;+*@{U`v;T~r12u70sLN3 z#ZlmZAQdBIK&D)+0s8e2^&$BN7aYwf_z~fL97EQ}HwIT@?qeHO@)4y(k11}8lkZ<2 zFzk}-twZOgRLCl7xAirgfPVur$L6!(&o74Sr`QZXB~0rV#E9eR$^5ibyu_>JT&nqY z_OgF=vVGbNAD=%6Stti{gRi~JBFQCO6jCD-S@cS4ev#-Ap1Xzp;@k~Bkr!OqiSy&?CUDjqt| z`|Ej4E$^=qn=xIvj@7xes`O0JY^cXAHAsnY}d?o^0U zKWfv0j?4XxA*|WQ^$zFj$xY@$c)6{oWWY<#jKyj*0~ zQnVygz4k|=3lsY-ygBEq_(Tabfw?k^PN*oX3;QHZeWDQYva;)Ce!dWIB5`W5HbKn~ zdUTfT#`goq0_T(UYfhcN6N{Oh>h4cNws#maMC-o^l7~4ErZ_rnnDIt<>IY;AL(2f( z#}#$^fIgm+_;-qF5UHny6W5EGNG_ftKUR1$f#^$kK!KSTPGYC~=B)T`o@kWl{ zbEfd=%6EYfXF`-X2zBG4@&E0FheOuALV}riz03^8y>n#_fr}UUFkqf(`JTkl^t;dQ zPn>XhM?19BXw`l!9s@c<>|+5LLvn0HsaAcCke$kjD2ds1duQVM;|SIhv6}1WK5%^w|s1HI!Cm>!}t&`L6aJc~MQzDpDeg7Mi}NEV(}eHYFbVk{Y-zhl=ku7P#v zk@4O&Z*OHoAEY!0>UD>pZ=TJG(Nvg&)+>wU`|^2FqByz&J9&_rH08ANR3uJ&$1ZrsnDy6RvHCldhjY5ZZ4xKyXkdY5d!rR}#OkLy;{IH7@d3u)9RoMmEa!xkR5Mdt@LB zL@^okxdG1G(bNHP`C8Pjey5Bf!TgV;fMkNdqExBQ{Z19YgUOqT+vnl!a%ZJji~(|p z1#=BIp7hvxI6?lG<@^_fL20w-JOS2#64T}+?j2q#94p}FKk`@=AwLF-hqp9AA;}!! z{2VE_>zRHfJulL)2U`a;qTlH6L`ERe;g6BSW(sLgYz=G4{{7=L;p>?Sd=yS|_jbCN zc4mD@um|ysGKw_@$f+wH5DTMNgq2g^ixO8wS-`T4_*-#bh@acUf<;%sT7i-}!sQYZ zMcyd2TiG@FUfJ)H)kj((c~_&0+{f zsVOX-&mgV_68BKRaO{TUANzgF({sby3`TFTpF6bTYW7a#0x`?bVe0Qko54)hsXm%#a8oxIcNj4dHkl!s#GA3+e2TiAs&E8hLb{*5m zu9?^_2$4Aeo?F_J`&NG53@Ym&*l$_icXYBGFG9t;V$T+Qk90oWUJ!U|Fwj-mXVn+o z*)TSpG3lr$oafs34c5kQ;66t+vgXr0OC>cFZqUDPlRkTq0um#+E(7}g2GCo}X9sCl znk53S(q>ttHIuFk2X6_IN)31E9-z7ceui%TT{w=>zP=MN0Jei>&t1;#(tZYwomone zU{ZpfsRO^bH&U_=M7g!iZF?`vQkQlnDvh?XUy0=T4YGCu+97l$ijsR5DW2W@WDQ6s zya)EW(frJ34s_I4O_>bZ4)%GtvW{!lA)EK9tSI$Kw$u%cDUJcqp2N!1n&C;s$Yu-% zmlGEfGW6!dOTDPaIdfYJ+1>}adx(>k@xa|x*$Da=S~=xwE}TxLjxN;ruZ=R^%e{4fporMEkJ{BeCvViAj~2A26^Y-Wtjh zyE|o%=Th3XGUWm?MF6F}&#H|$pTroIH8o@2msQ=*#*=Ngsv;_KQ0F;Swz0L0SJm_5 z4Q>dZFP6EqZm`a45P1w$H_$G<@&3`fkBCSvig=^fp|kd6cUx)={k+}Y zyI@(e=pxeI2b2QE(EHQ2q4&%~T@0t1(|gFSzg}jC^j`96UTm!OBNIu1-fwA#Yji_q z#$ECzM-yr^y3fve8+lJQA#_JSPvELNH?ka`NG^c>7w9we8Z6fJ6Mh?g*2#Xchu1p3 zFkoL#fzGLDQL3LV#214~XbQqw;pH>x7nfCtr4*lLbgx==jX`CX$_c;DV))a&u0F@L ztgP&jWLcHN2b5CR)1B-r%zLDp)2lXV_pZ6Rr=N>jXSAa%jS*>Z0kIU0XT}8W6l`r=|e?1DUd7>Tn8P} zcB7qcLWrL$v63C2GRS;d6p}+AW#vQ6vW@0Gd=T3g2E7P=#mH^*S@-US=G|3!_mP;^ zFBE#fnq%(OUIne8EiKKKSL*1~*p zkQ{=E;3s@~%WQrq81wDtqS-=9r?+&@FnETiz?vx7 zVlyZ9Yq5l-OFe9(e;2YfZ1haLQ*0SZ?FfIrpn&(Eo5dCeYjPwmta5G_Ks!8@sQd50 zclb3H2gQN}$xKaF^aW~ffX@}_Q^FJ6WchF+jE?q=Edp9;TByup#JuvgH^!OlARZ&$ zKJEKJR&rq%-;N_k97Q;e6?o1c)MBG_a_t=aB zkw?=V$BK>mJNq3)V{j{rRxT;52Q@GUv#yLv0o2>PeUYqeTr}3q?05J*1ZjW>>#{4Q z-^DjV{}lX#P}S^@Q6qtJPw50ije2R zKI(&LJCmt0$$a2iRu9M6#u7);=qa|)(Tmb!y@^HN{3p_WG zxrMqaGPExe)6{yVQrpRA#@aJB8vaAhYUcWrCU17I2hZ_1el#@>{K;#X2CD-XY;Ns0 zV&0ho5YJg`;-HbD3k%?O(Ry;@rZZHJ`EJHL5NB^$XBW%-;918#)A*?8y{+BeVUMh9 ze>4@Sn|}LvdF2+}Th}+`hYrF^Ps_@29qwOmonimRZ?$!|yH%OmYDnF>OHKaRa4i56HFuuRZoQ**Y*t`+;#-%Aqv8HBz)B3B9#qEt~UBHN+>f z@btV7nk$|iGOrpd>xb1?LvC^lALfxcRzjDD!2Ytc%fL7_`Nggr>YceWm~%q%erYuZ zlbiI}@QCC1uxJ(4CIZyRd2r$Q#n8OQY^!)vPP1^s3CER=U&`s|xY><1!B!2B;-OqMK!i-gX&X5g$4J}Q;3w2OgZW;(?*j)4wC)dP zmQSwSgTUPeqk##H1RI^2w2s-M0Bv)16MQAy4$F<<(WzpqjZz=B)@e74$yy34QPhxxQ$ z;jyQ~P{JZdpPC$1)n7P>Vs#j1LPSzMR)ZXG-3Qh}D7ai$rwL`q2|TF3vk!12p2fSL z*Q=QED8=T|gEKKHFGA-`kSoO<3T47ya>c{(Hl0R!iYsiOU=SHo4C)|E+;U)iWDCRh zk!`3EO9Lrah|3GD?gVhhRx^*9|HHUy;S;s__#cI-OBk^@8+(8katOlemwc}0u%jCh z3&*eG8KAQU@6#Cx6GW}Rr*aTLTQr;lS(v7X!9mvz^{b1r1+Zp_V;W5TAffz+Cu9lC zBW;*Tm9vO3x6BMffl2azN=6&#oHDwiKRV7E^LkDfmR}MGkX$3hT}W|{1*d8_E3_UH z@#Xg|Z~OM#bIsh2guY^H4~Da=t|osLZk3Lt71hd0*rwg5U(0cxoZe$wa{53|52$2+ zFm(VwdJU?#GvvSM?2eAJ-Xl`ftpDO$`S*q_zK4?1n0=wA@h9@Lw7pt8<^nYIw+F6-9QR6@NyA0(>e^t)Q|r zu|66axMdOm#yvv(d8zCB(EYPDoeTf&WU<#w#X%L95i@-AoQ>bo4o!LiTyn+T^Vx9B zUtF#9pW-a}g^LihWY1+p=gZ4rVPeu2fqw$Y4zuNKP0UWjlGy5G?-|R?zCvVn90FRq z=n`pb=oy23uM^5n=u<<<-U``kxa=*IOT)kgeU#s zldvw@e0lKD;SJVWs|)XnfN{bvmd}UZi*Ig^K_>$cfO%Q+zY5cvc&4!UL}Us?3J5Ng zn1gC(!@Ffj%+BPQU*u8G{6#RE9GAlPP5v3v6cAJ4bRG=sgIx~M!8eA$PSt!5p7#=X zijKk`GYf-{sn%8U4omF_TT_?&Te1|9&?Cjn@WJ~M|BbL*oYfO=8H><{xhA3M^o{^B ztaJwjKCwFAEY>nOH|?Hg?fd+*eMjl?FIt^saE+@BwtmZh75+8M2_v4w*zqS*FsuN8 zAjDmqi<&XY<{bl=0G~~0QiGznqu12pkXhmfUoGV`l*Ojpkbcupg) zoUqx5j*3;tiT#d=Ni&y=qY|%dmXWZFt`Ejz&8`dzY*xf70bDBqw+MG9GrvA^3T9td zsl z4)%Ff`bG@3s$q2lTrA!4diX<$jK#=HO(MrE&0qdygc#sNh*FV!^9n z?HkBvVPB}JfV0xBfiNggkYA`0&Tr{ss_V}wgKuvx)qGYdlGyQyXg(|-Pp+K1{hh3{ zk``h!cYfOMuDwxw4zqfU)&CKh%%Ac*B%Wb(OY1+`{eJo5Q!vE_bmKgKiC!*Zk;#?ksa&xDOn>+YAltm+yxPnxpr${=z2N*C!wlnY3wwAQX z->>dcURdKD46C2;nydb7IQ@5vuNu!n&1IK6)mBZe;+taHzhz9z#qw>nTgyX0=Wo<^ z+{V+v>bX#EIM8Yh%rnLMgj}B`)b)Irzw?<0xg0k|}x&jP7O8N$v1?m98Xv;iZHPWiJ$Y07GbbHyl=wy zD9>HcsQaWE`FT>-wKMal*mxUm{g}1L7jG?t3GlRdK1N?9yNO}$)j1*9q@`hP@h$ZY zsc(kA5$=wC-*3TYfYq&;N6$CRw?N1D^|cqH|5Ef{2wzw4$4K|}!mQk)mB~x`TVsm8 z5zqDC4)*8R(*dRqkFJsZw~8y|t+=0g@Ad7xxb-{xDh3E~@NdNcag>kgXxtn4Pl*A_ z^zN1X4t@h{?T;k4_$_vyFIv)F9Vq&p zmtgR{PUf7ars|l8oB^vCd6}g$;91UZ`EQA3A|({_?w~gh**acwcD5Yff#>=TAhn># zyjH)e^x)==wv67zJJ?bq6(-wx#_z*9Dhb;5j(RI_~%Ck!Q3a5dThW|_TfzX^A?<0SI> z29|J9eM8q^rd=VH%F{rcBc=!=N>2n)IZ_Wxchk7LL~-TCE`w3)YgYo)7s;-}hS>%x!$6gV=^m z#Ln>coH z7QY_HmiViWV!L~4tU!ahQ5;(ZyfN_&TS}GX`tX{rF=)y}d(Qg0h9I+}Ip2G_2Dd+` zu7P*xAk{%9vRv-^mf3FwQ?K@Ix<*0@5MO6g-~Tu18UwmgZrRq|dT`dAuEBMC!WtTk z;@&&Ft817SxW?H=3vGRG2#t))Tzrc~B}JiC_ZVG$+ZhoGwd_@-R@J_B#MbgS8SJvwQ}X`U3wg?_dWllW zNVw>^#Jto@Ec%GD016+L_smk2xv0E@^*Pza2e-c2WElB-?`u^X%hmJb^6!@EGno31 z?@{V;M8np7Op1U9g=xsq|AW;O0~014R0>?5*u6) zCFR!6*v1#D;@e(ey>s8i{vHSTI)ySi*;vgtq)kThbvh9>1(MW@L0PU4fp2zSQZG9)+h~O3n;qWZ zn?=FHd;YHM)jujiKyfuQ*H_VKAL6bqg!U#nT_n~$h_$x_=FO<94YQ7oBRB8}!FtmJ zE{2M&XEaF88apwMlv`9%grcn-fw@JLcWZxT8&>NIlbxsK$N|NP8;VHZdq4z7WR3wW zFuG8kVm|MG2gs+Yt?9%F1j)p{J5`>G*A1jZNshoF6W&E*aORX~%|r0j@(Z~bO_HjJ zEm~{H8sTEA9m<(8{Rl3^^)tWHkHn3w_(fU4K7+px|4J)VXaoTL($|^OOcdg|2D(p6 zP-@gWqfuQ=J=eDKX3me>PN4GfvnW*)m1F%K`gu=MWzvm#k_sIlpQSXAai*_SzLMR& zJOfU;UZk=E^*5OQ>Un%afBFhB<+!E-GTy}EcEUEdKSp|F&r(Q_x{Lr9BMmDm*GUpc z2EVpCr!nNZZaeDx2G#4EAM8XD2k@z79sUri{Xu-wX*%r0S8>4HmRO<^W~`aWrYkjMTHW7)7r1 z+P_NsbFclBZD2z(GdO8r!1lMh@%^SB{{HnjFelv!(;!a0K5z6UB+3SPJV!=&q9S!D z_u~8TW4OFN-$?NN>-kxJ*BuWdVv_vk!Kw_3Ltu>LHsbf_TmM7&w}s=KEhD_Em=8e& z>K8j)s!n!}RHy(0Ra|%AU1%7;mq_+DcRI!2{jgPQgN^p8}tR5fn`9b&1+F}pZ!>0|tD`mj0Rm7n%0z@7PN zd*2j&O>{~pn@=(en^*CYXn73&bwR{8@kR@jHJjgg*&%nt^lcTYlL89czAd9(7I2^T zp2U`r-yKX%g<|7u^Zv*1fBt$a=XjFuz$m}P>Jbv3vNqpj1Pw}xH};g>&O)CY0RWi@z#lQCds~;N>6ndo$nnvYQzjKo{q)ms{WnsJUhVuh>EQ7 zfYb9&C-}}amKjU)6UEmrT;C3AUNe4}e|O?f452RIs3)0VHzpxOJ0xPJ$e`K7GU?}X>$ zukeE6+Wpl$?n>@?QzUbya-ej#lFK=|Q#avvzd%CfQ}Jb@hV^y3Q$K=M0bVBXG@S;l z-%R!K%E61E;~wF-VTDWym~)=*Uy+jp3QADvl@)_5$jyt4jtk$J8`{qB{in>3*qFH< zIOItFz&w~Ot_fZ(g*MHs6Lces>?c-)(~EMu2B|>~+>SpK2Jf~l4NOxcbzKD8KN(&Q z*|SJBs0r$ckp|$mLLI*1M|g7^2@$7|B*5ce1xpz#+++`1IT-w;m-`iTQcKp7O2BfG z;)XwRuJRkO6Q`kzn$W!X9&%#w`LJi;syOfAH(`e7`9!UB;1i1}^Xkx?i{dG0Kcufd zM&r$WN{{IOg8jj!v_k2JA(0tTC?U6+_BtE`z}vvoAzv0?8cpv6(4- zkI98RqBm5>CVM}~v2#|a4$v8^(B=BPtf4wF6vPU_p7oFHtzv&Yy+z_rTMcp-7^w9u zzu~)j5bj~I*vtPJ>;e8!@}_(mp?11yW#%lt_C4(o>+J>2BbqeNUc9YIYR%z005#5U zWc?z-)a6+n+cwVZIAHT=Kn?~B`yg^e*ZYjs;LsR2U%gEuK*(vJI@Wo0Pymc2ITP$= zLK`JzECR0!!;@izWu+-q?*jvfPx8iFC=H^UG?pa5^r zN%1Z1Sz-jmYz=be(JCr$MS~Zo_-m=~07qsBzLEnI$aus!Rc1oe{uwFitMEh+l07MO0>mTS1I_;g1fFC5wQjVUa8OoAP3l;Z*-USHnO* zZDcrC>(1heK7^mKx*?yycp;09YR-_gcP2DEvlD~H z$P8smQyW+QcMvW82^n(iY0;-PWLQ)>lYB(6V-K%eR-fcILOB10N1H1PfZ!{oBs6ya#sR__h|;kW2p4GmR(hE2C_zE7UQFhh}*GV0Q+4$dAtUvmG|Cw(U!5_ZxDOR;b0@=SFTKduo|0r#eb0Vf+m^$b+x{(i(YiU=Z)%G%lq!D@&3b;Ru$kr! zcYI7rTU|*E9q<4@MP3}5_1)=fYWre=;e3ol0!<#;Z z<}I}Sb>6~n>Ce1^cOkL~CT9)v>$+(;{33Xw4sgR^#QiSFT&&lEa6SQYT_(*QJDB`MEmE`?K^2+1*r2`{w>w$@ zS(nTHG`ZCz>uAZ%DjFZ~OMVKC-tafH7sP&M?TB%Nq#sJoX@o2SbZ?{2<^e%px)*_&v*k6(YL zxKcY}!czDq2?T6MYGN$IgZAd#_JSLp#!j9B^G696hS8s|M$;DMr+3>5j_cTQQhvmBzM725$QrTk5`^4^$2CaZmDj&ZdZ5jt(YW5#`7*}f z2{f6fy{Qv;@`0Q|9N_r;QT7>8lJ4d^VGEZN*6cwF=R{r?F5#3NKbl#yC@inU2^FH2 z>V}9l09;s@yYZ{XWp=!w7y?ADF9Zih$#o#SQ}Kk(oYrt5$uHLLjP-|BsrtrKQZEi0 zl8~W`L2$s)F<$Xt*r_q|d?8GAMA+~mb&wpdHPnhUJ90Ps!FzGb1{2El0MC=DOkpZqrveIKGU*tXoW{EG)x9*Bux-fPwTmz%-qhD*@_mu29(D@IoKff z1dpTf;b`76uLGgjrlL6dov&B}MEUS%PDeqX|5=&mlW2Kkl~V-GC4=AlUOm1PNi$BQ z`BL&~#vrvoY$Bv+uXxh$HP_^KhPmW~+>(nnFp8tG;W6WS!dHWy(7M8?X|dpQiM)TKeEb)D-6_ zUNCDGw_~NeKjz*NQgo`?l>5Ay#B-x>C$U6w>`^dR2QYQ<;j8LCoCYFQ4B6>Ynek(K zN*eBC$&qs`!e!(mnk+eSUewBQ;OF`scEr~B7GIcGX|V-Vk^<#TEtP1W;aOUVu@V_?3bpzK!zGvQD<#*mgweG|?BVmXKd z+2*-26sUadNi!D^T1vhS%67s5q11xQJ7gy#DbIxK8(|Gn(mgV?S02BclpZy4jPJOX zFJJL!Xobt>9Re50a6ADJZmo1FB1wO68_F&Vg|zNX|07U zO9@kfZQ#0EvW_!-hcsRC5fx8NGHD;|)e^ILfk1&M&b4moTq>8jNP|JO=FByp#We$y zarmCMU=Lroegn-%ayU1Q1lhLBjd&?aiK~n8Q4nGB0!Mr&nLbwzEqVgY{5~PN8jIW* z4H`su#B2gCNyRlNs8B~X6(o_u$j>*Pb~q8?r5!;54_)1d>VDeNE3!!D9Y#OkY|1!O zb;|Qsik;n6jiA@>o();+;%ldTFu8aahEFBRlz=mb=gsBR#9jvO0X`+rXzI~1F_f(TWcAYLdU2^v(d{45+j)emLTxJb(bni`# z6s@2t8Pm~lwIEx9WAwIF?OZjx;IMaJdZV&h?++M(Fr!Kub~Ovc#V{AoT}hZY%~=sl z9g;wzvo8#cZmibUc=tuk#fjYfJMx{sv$dXU$_)RKtMNqzbDw5|Cr6zM;u}OVd-wbK z-rPC8aVxxr2l#X{Ihfn){t1J6_!tX{NY!WuJ`hP%LN2|!+U0G{^0dMzJ2i(KRQ;sh zUp`JaTv?r!#vSaq50bUYRmCEmb_O^l2AXk7%tF+vzmA`Hkhy%tEW22hl@<#PATp7- z*GE@p+Hz5#-;}6LSEdeI$ktDS6JdYR^H~FCdIIl(L_lG1NmyuZ$PnMrEMg%WOPNb4 z1X9|P_-h!OJ(%q9nCp6?%mGWR@CfR};cjJj4u1P=AEt#uS(%|$YXBiDf@ah`+D!~EBP;3AWB8ysFfd?=oIDaB7C08#s8j1 zMjBVX6QYH-!Sh~!aPq*&0w|RzYYWkqN9*%q>xJQdJ@dRz;`ZcVMQC}_kIHm|uP}3C z(BK2-KHjs<<7fYic*TL|NjSEZ|61*;coy9mUlC?XFGEZLHgW0Px1Uc^3HoLJTC9oubw)%&sm(JYMT#28T`-z-O8 z5hOz%Kv>SZ7Qq5+M{(AT8Sol9yz|WQ$(x;d%)%s( z_QnvDGi6}gcA)j6b>>`|;@QJ@3AyD^n}R$+rlF&F8#%7=kdKjT5(}>LM^j|?nX-kR z;k++m3q`Hnn}S4xm6xzwuff)?bR&9pqq=8jhZ6GwV~Y-*v1v=6n${KrI_3t4>^V+h z&kA2wk#+XZP?cug_%SK-@*^EV+vr1^H4MZX1ZrJR$9 zm|CWEglQ zE}YdwTZA)(y-{T`C@;8V5BxxTd3n?kyu;hicXUpBeJ0tn6n1(~w7X;@ABxfa1-Pn_ z@I|yr+c$WK&QZ?Bot-6Mb1vdjTS7I@f#!*QJin!v`eco%WjJMNb?lhYCE)@xb+#m<7Jb(658ysp7H5uj2V=2Cx znrtcf>sszxX&*RFet26CC`0yox$pEe8ji3-29{%pD1#w(GU*& zMNuoU-$d^u_E~f$s@M4mD5YR<(M{ivD{(F2s;rpK`f0CJP z-MO;AAL#6tpGW%1e~$kA33jO|K1q{XWO|WaoXkj~Otv}DI@2A(y#)V3R6ADgPl@u6 zdGE7h*3Xue06kc81qf+#cJ>!1J}p9pt_hZi|3*8|SxRahiAhBDHOhOHh~MV1Y}}KH zeQ~(i{E*ZJHvb3q97LSa34NaEIiLjoyFlK=c@V{(#4`bHkw>IR8ptfV(A_*~{uS-$ zf=(57DICnf<++c@jrs|)2_U`xP_;VHYkJSNRq_A`|2V#Uhfu$(F<7^TysHDgQ-@&v zA?90b9vFv+e4BKd$NrEgs~l+*MiM4$nkWNa^NBn`jH-;4`{SGVu+IYoe&-ARcls%! z-fqW1Q{3^g7B|KM>ka zTDi?C%GhD zH_%8I#g3y$?YH~8cs<|fWorf?_sRJ8e*bMAzUQ~}|G?9ycWFC2sDy^y9ozGGAC;L8C z+eUt3-LsF)3_tS&|IW3xw!xvGYUy^C>o&i%KfJZ~BgNGp$Jt&906{>$ zzqUnhOC18m$%X|*^R=P)Z8|9X8j|;3BxDj%`q;HpYF%HoPVMh@ruqK=RAnr zs8&Cs)r7Nt%UIb^H-2+^x#Yo}9`!J2tfAiv`%~+lo&ueTs;}oqz1efo@6jBMUM!H` z%|o?@Z|wJZzhC1^=uMY4@2NB2AK%jR^tgAYJnT+fe5fuK`ii$#;_Tfh=za{e=x{Vw zJJZLWBQQjQ(37$=I45q}GcudY!g{7Mtf(rVq@$4~(=asny zE|c3w;IbrVJwkdhJzGkG*f?LdvGQ%)f8h9)9p_Zf1oW;e#uVt?lG>wn(WoI*T}EfI zk?xK9@R2>soyhf1?4_G_qt{gco3^LO?Z|jS?F00eUWEK;;yDBT+Uc+IJD7eG;hi;h z^A5e~CN}?|e;ZGloO!SPOVX5jD9r%wfKyG#?zZu+}hCVM7h^cqxDbW-*GgJ`m4^;b^r9yC`&2%)Td{y&fnPEsrn=uydSO4wNwj^ zuda(7mr9E3xmhV4)uQg0v9ne(s+gsmHv5@>{n)0*V-wWHmb--a6v!?cgk2M;Mt<+(8{r zQA>$SR2qF`fa*56)n8r9EqZ9$MGzSX5zqxH#~j5{x`-s-mTyL}(}1fw?_ipm_?{n~ zi}BS+Cw|=&cTDj$er4<4P@fnCSMSH3+ey$vpl{R|^o;CbwB(HRRysD2tx*mM@?{kL zhk77Y1ZhjiM_#5;vaFxC3-4bGtp_8V_uQSe3ye+wEzyeOTO$OD>~*-1I%=URJmchv zn-lE14o;pk8fx^K#?BNiZ}nC5s{}yRN%b`3+n$KoX;jiCAwN+7&_WO>!PH7je6Kx? ziT7Gwf{XXLUO3c;IWFMeV1|3vN~H?i(IP4#>Rz#HWnpAtzKEQ}MtR2iiNn@IB{IYeWyR&s9^q*({4H!3q=|6(=x zI!4Ym>Z?fNJv4E)zV#lWSn7GP4i%9C;be$YE(0;WKwT*=RmL>gt$z2J>qgY=L?a>V z7Vj2@Wm}H|NREh+gq%v?GmXeB_G|Iv|H81#f+3xeP2!C3-+2OAuRe56#ZQLn(%^TG z{O4H5usrs-VeNwf8!AS15O3;Kj>^9$S~mv0lf)hh3X4Wq@7 z31+1eM4kZgvw&{_Wdy9*Yql8cODHWGyUdg&?^zVL>>4&bHJk>ve5n}Vgl>)0~xkIVsDOA%em$l(b{%Y*Ck}Fa2k1Vcm*BD2{Fvt zTQ@PE!}+-V-sDD!1Y?d_wvAS#TCaIeq}(VxL^E@uqmv-P(l5-9t=x-2$J9HykypPu zy;AL1&Tz%W8+bpdSi79)nOcknIIawL9Ah@^5UU*@VGRlrgaa84sfv#@N=(7FQU}R> zZdaq?P3wGlti@sbh(epk21nJIYSBsV25^dj1OXf$UWg&zOwNUJkMZXcQlN5OIOUxb zzLfT*V5{A{7Fasiz8JnOd>@SznGlzvk|bx9B?=bL%FzZ}saH%{ypi z6J`mywtO4>-IeT9GmhQwE!p*H?<8ff?!TC*LF~SoO~}TqE3qu^ov*2TuDYkm%QMcK zbJFk~M7FF%6rNO3LZqDxP z*&J3q2pT;~pPvNr4`#*Llq?%G;|BXago^sav~wgLYpqBR{$#c|^_+~h1zh`*+h{CE zVnt(_u%c_^pfFZ=L#bcM0_Qa=oG(U44OyViAq!UvaV}ns1Y%oj65NWgq7K2JXY0DW z@>agWIVS+7yOW8;QHoS-7|nr{yt|>DlMsRV-g~LXQ0XWm(mjd3il047WeTc>Lg|mi z{EWHxSzxw~#2$5r&qCzU=%va7eTtF~OQmq^Sl?-z8Ef_7Fw2u^KS#cZnJdf?V#$^Q zB`tw6O;*1T-&HMa^6v*|M_N#R0rHjNZ8B|e%^`tll~#Uc9&x=7D={PsT{Nptc(y866KT9f8H1bfL6>2y+eHA=t6UgH1Ob=XyDUHx}~lU=CX ziJ?gdcr#Sth6`i9P>giC#}u*Uhf1-1U6qsJZnp3BVv64 z;kl1gGZttwOUaCw{TT~5D{Z^P$dG2cJv$mb-7jT-1OSTJUVB zFvLn;@NH|uXwC8YjQqwEfBm_PA*{CgJO`Ds^p2H0mTd1Wa@Z2TGrjSgVFnvUOz4el zFgNy0H3VE(&+WcXUwl0S*T^G_V#0blv=l>7{kX6OkHV?VQdHl`k;x0|yGA;fFLFqw z+;Lc9$u2Cfw7x*Vmr#8Bf%G|w07rRq%F#YTh-e_z60E6RP&SO})_PrZ;Xr0D$_)?i zE|VCs9wB_w!u5Vst4=Gktjx&*a*6nDrK)iI4Jau_;|N-pQaRy@cF4Xm6dp!@45~kh z-Yw(PPpF>BpG{e7LK%Jb6v?Nk_R$awLq|Zw^3b-_UNxX-Lcf3w zxEZfytilE20$&)y#_1qWrSW&g4{-_qKKzI9e}(@T{*$Q;DF|dO4>GAURkTDvX>pkq zjl{yI;NG7xRsOiOm`o8F6M&Rm#(O919drl~Yyv^gT#rv;j+7lTtpILW1P$ zqVc^i?VboLeiB~yGZnrN*9_jd!-Kw`kWQU_MCv>IMO=yR^8afFH3qIvr={&>`>L_l zYcLCSJ!=Rsbh!JfjOHOztzM~VMb<(_U#!6s(Mu1-NP3N*3DR*%WOdq31l6M@`N%3^ ztRVD*Z^!Sq+xzc)<)D)(fI;O_=gF3S-nJo{YMc?HA*?AzEtWwcB3MbOQp2UEvr#~_ zv<_hu=uZpVAdplkwIZI%8vPOT$xzUq(NPA(_GhL?pDt$6E_zU?781V?%%HE(k|9gE zmz*2)t45ooev;~rqm1u+co+YD@fPe30*3c9}F9^`rCKs5b&x|r2>01mZ0@6 zpMu1{u!e^WoNG&itl$3O2h1v1Y4C$oh`Ed05&R43VkwZ~h4#@qjs;%S{+vw>x{)O! zS)#aBH%cnNriigU>!j&g>-vhPKE zy7E}ir!jI6|4#TMy@=8_fj0s11b6Ru${|(a`}@mpwk*;vjGY8I_7}ohi~*|Bsp^*1c5{sRjRf@`5y9x!8hq8z4P~<&@XvJeUR61px{FyRUBR} zj+7>>yi2;*-PLppSnY=O9Nrfe3#9Lklu!%h$WeEqahw(L!3%zAHu`+ERheVv^8~#N zR2O*QLoB{o@ehIRg_f7@a9`Xp*01;~gXYgzQHJFsNe`8(vSyd>5LYnqws&Q&$old| zi96;;f|T#{zIY`4G)up5N@lCeh|<87-;dy{#EM9)wa|@Sxa>6Uyac`&I8>eBCC4XY_(F!RI|6)YKB6&qsHvP!9gN15C#Mx5CX9v7Q}*B5DQ@;EcBp< zeb~R?zj}G5DGY}TOI7;S+}zykv(GSsgJSLt^teb#ro6sc)PV=$ zJG2phN4c^8kt;j;nb8a9jG0<)c9gvEQ$)!cZ{K}{JIKu#9k|yZla34wfPdU+!dGXK zeCK4>fy2FIj^moV!8`Sg@^>c5lY{WAEJg`AFci5hlU!E{BO{x#33m5eT+{PyHUE?7 zfJ;kQU>yF919~A=67(JDh^v>Qg!ngDw|~lmd6T{cCs(XNoP4nbswGqkY16ul6f@*F zW9p?AagdtjZ%}tX1ji==oC48l9(*%iT&0{n%ZDT%!P47L&8d zE}!0TFI;U=;x35|OLiXTC7;nh^{mN#K015vA!!CyX=;bWuA-Tq4V(5g6-X4j?`#eIz~`D^ z(tir`Rax+}{olj?@jB`F8ecl|dvf&f(#bz7aL-L2=l?HxzyCJ;UHJR(58&I*o}B*{ z{+}1__)EPuzf>OH-u2?l>6eSheYcKyg{qaKdul+uWPn-ow+Fw&v%572 z;5vB7`v0#)W--EKbjDHNLQ)8tkSi0{P1T=1U;y?bY8t##p?eBgMqwq3;ydBzxxg|9FUB(VXvP#tf4j*74Rf6QAYFbBq$h7T6vb$l$2gyZL@7F!!p44_5A zE=x%Ny?upM%ta3}y4x-k_tkjJ(U^4Rb|b}j#7GVw^tbUPJmar^aE zy^nSoG6GIXfup2ZF2VR8!8h=j&+32R*pTa6i0JWH`1x`yse>{PwDKHLlMov7 zLv$P&Wp~eP?ILzNUITgdDCG_Pb8m1x$-|||TvjN4^5hyzJVtV{o#0(e)072vPi>|y{E->kj5BALmCmEjd%JH2qI zQG8z6x77DVn}r~&a`7ffM`GEGw+Zfu)r4OQi#fwR-2vZl>v~uFA|=17OhiYkItPtU zKOkOlqWY-Sv;FwIhiAUy-)TIz*_Zc_DBo$48g|0TTFxF-}3>x<^f8n%z+mXvv+z7MzNw|L^*dJ5K*V3c=0pjBclj>wMXQ4 zB(C|rTOkTIO`MSzB?Evg(S>ynX8UDxde+c$uE}mNHE+;|1U$*(M);llU3~(VINqKTW_f_#baJVSdH@pEp_gzoGK@v2qNGmuo!wt1z8Av~^?yyvZ1zpZLraH@vl88nyx7SP%BDPb~jp;z%S9Wt4D9 zLn`n5mTh40;@Mug>6No+mGixbljM1jMC~NewGo8sROPU?X#}MPlPDCWp5B4;uu!`( zHmg@Im=4jbL~;P#6P`Q~Z=d8R$SH&y7b2udiCn;tq1;H$K1jTqwoS5CiU#+X>b$?? z%q`ohu~@X#BwR(>?j9=gs-*%xv3y#QxrAJCOJLX)6Jv+oRL)$*wu3g`-EJskZsO)x zA%mLbwhzbK8DriAbh&GprrzX@${U6N*ut&XC$0K?;l)t28UoGaDhIC9GvHH|VU;|N z<{xazZ)g0_{H}@8_ZQ0TM-MXdh8Y*ielqM3`o17Bjm~czwSGBK-t_T-xw{c+&5Orp2K(8O9+GmRe~s`qLqGcDwB!*5 zh;esfVb1D57NQh>$p}9w^pR~_-zd@XQHKb(-%rYxD8Nw5!5ic{lFED0V$euef4=FE zAJ7MQrUY*8@o+wJh6UuBMw(lXq=I0G&4CeGOJMr-7&PH6>DZzxyiOdH!es?MHKW4_ zNQR!)3&p8M;IF6%mG>tVZ zCKy1pSS+)%B>IE(X7mk2wsIaL(C(PeF zA)7k|=3}t9mo$s1Wo@kC7q&%&e-S}qf7$$cl6uO5&{@DdUQ<}$vT zx_LO(-?IJw_M{8Nx&ja6zL2})G-~r>7p!+ACQZ+=3Z4dU*ZDVVn+C4uh1gC{Q|lbY z9EXQHFS%oAFQPe^NSL=HjbvYlC-HK=l(T@|`bPCYlR+nxkgO|djZ~j}b_{D|o-jxi z&W|m@NZCS|X%TIWj5%n#Xp^uFZcaMSfeK960K3}Ri*iz|zn#vz3KMrUZ-wmPJBn+0 z&t%3fabh2dz0O@WEZUUbXQ{A>tMxaM6CAje6U#$!f(ukAy=9SmP8R4&yK#28?>qD# zqL0X2R2+1Aq_-L7d8dVvarDO3R~ZIfIag8N6;i{1Qm94S8I29rMyInjuPliuMZVAN zJ4x+sz!oBB%*e^7jm?A?)CK0#C3g=izbMV7*i^YMcgWGl7L&g(zjnkLO8*qgOS3ng z-X*x3ldIAz|5Y!wvkwNhf##re+R|_ltWrG%v-2;vJSt;Ibc4VX@%bYyJH(e;?zQL*krP`5EN1K(4-#&L0(U%x%qZNY(_+ z!3$+pY7JVw2Y+zi1re>UYO(XM4>QNRlQP^6FG|Vfb9aG$?{WU@%K(!X*Xz^ zW|`U{$1t-wxfgJ5mEJ=O1E`cznT;B)nMUmqS2@0vnL?b~&nOxsR*m?sv_2)qc@Lbp zX{e&xeZ3d2D7BA0MoPkpI)fznQxa^#px_XQY*g;r^+jjxifTcB{HD}a)T~a0i{`mwyzlTh>3k`%G=oG9a&*ILqSLbmA=&RrdXYBfe;Rl}s>48UD z>)Wpx)jY)#Zn`Z0Og@{B%-uz-ys*NShF1b9(so7-As;HG<|%F2GzUxUXvop*9db}U z0gYp0tOQVS#8kdRes$wGhy@(9H-(`TH&efhp6h9=msa~`9+VR>PL~G82XF{y3VCIg zYQ#Mxe>m+QqP~-&$-!UM$24FJ0KL4LfPDM4<2n@LNrM9bKt^K)lOZukWxQDG#Lrmy zj|$AonX@p)15$!rCNtfxEWT&|&<9_pgv|_@uhjI(I{6c0;Eqyl0Ahq^KD8X@7?47Z zF-D6PVv#fsp%Yph|BC7F)6E`a&U1=fn}lSr1`mzCJ5heoGJMtt8;Qz ztOShpFD;uOfj|__a^7ErqEm4_c;j`+7Kou!zFOIM&-N*iHzCK7CD+yhR(4FEh|$bp zcqpr0 z1wbM&FY!v4y%lTKy|vt;!0p8p>Dk`P7$dNN9lsd+&IP&Uc~gZ{%&?~#^^hN~e*QMs zS2*P|dR{r%$bK;>s>{T@Y&{d$4^$%r6fEl10YA5g%x2_*ab^pm3L?n$Ef<} z2$K;fQ^T0@E$}87f+QYAK^-C0a7ULnn4EJm^Hv?xBd03N*{?O}L1BG_pXa^hz#`yP zR!lTpk{dU2{*8N^M1nceon$-UvCfpdi=?ToVR1GF@qyDCj$SLHpNVM~Njc-8#G}B~ zMWUIP;quX)T!>?jd=s$N!EU|XZZ zelmY(NLRXEEBQGXz9HIs;+&%A>%gULhOh*;=9oWxw2O{n=vO?V#E2uN$HR_i-`F9h zKC59|CN6Mdci@;Sqf0m?F)hS(Z)AzuLxxUsLI`IS8A!scx>Uq5G-Z*dr#1pJvSk@4 ze_nO1(X^}T*{4+M_=D)JV*i$8wvjS)MOhcR($%(byp*6omM|y1NBM5vo6VEn(F+oo za&*r_a!>mZ&G$f=| zW<0RI*M4G1D?WzF%3+Hiz2m7!;4oCMQJ*$c0%8HUaWcB*y|F9klnrd2tNLQ`qCu$jn>tqfl z0IVghlRx`eQS>U!lBqW)t+;R1UsFWcqW97Y;zrka#_}S}ZYGX*8<50Ak-vhh-__17LNeviG zn}mIiN#mBp;|AWu zm}$ip!FEbA1eo&=A~Wx#vhE3xo<|iJP@iW+lkFH(mT`$eB&Rn?p~`ec!ZTxSrDRy@ z>$i`M#j0JEtbc-!zz{fF3s<+k^A0XIM(R%_skYkHd%f5?RKjB7z}z<86AY}RURBf@pmB__sz!uCQJnUk_1r6cx?5D(u1QbdH4<%7T575$eoI%`rmn5wVof z7>Ezi_c)wW=5-Q0AcLfP;P738#DJoBzA28+5q;$@LmX~oYprqaqgcl?d!mFZkde;F zx2s&U#(!ZPX1mdNwj#X{@vNir40`8+eKY2LrkXHX+-PJ5fgUhZy^sgfHXE<9ghRbs)*2oQsXU3((e2tkx4w!iDPJk1p5PRm|6<0 z>IPaGsH3kuzdk^nJ!1zST|ELhznB@o+FZg=FZPWNnha zA{Ma~Z^3kMA8&cJ@6g5`j*!)Dy30rN1SoFHP|mSHY-J7}*Df}#6LrjwiAKO9Mn7=9 zItKrk@%*dsuNC{oqZyAMBZ7Ky{S4@tov4((6ReIWFCx{eWF!H;TneB|5AeNCLZ`NF zHu!NqVy3~qZVxzNTvBNV?#JkwT+JR+d$H9TwAZ^7RowDej?mv{ubk^@qSG|j&iSk| zRsb3G8?8cRk7;L^DodD2JziLWUdD?#X#ukIiy=q6b+LX(u3)!>cLTXD{EAFH%Z4EDS-yV+(+B-_MxngLKVXnrOs_c+W!jH{?K4$3hsF||1DEiNJ7!CyOYTF-QK&VEk3Re1Z?+99OhHH5>8OHqrA4aGCD_8&nj4Zp5ZFQ* zD4`QA5`&?6l>51C1+BYXNr@Fh6!$Q<27wyW-rn1K*wTQ6ncB*X zx{UV{`w)5UirSF4vjq0_*xrNY6Y-~yASbJFYJ=O^v{B%Z_jUiiI%TBXa~VT=?f4g@ zf#vb*`^%ka-$p*ug8co36wC@BXPHwteEhBW94bPd==6!*VYh;|(CN&KG8 zK91wve(v;z^rX~V?{Jf!=^a>h2HxB}id~qK?`a7PX-UcV!yu&9&xt*`?3iTw|BLpz zqj~LwL!L7l#8*9IRL;_YamTWbL$QvNTCS#ACwdKNev!Rp`jq5KeVW2oE+<_`um{ck ziwuYq6eB(}dH*`KyafY;Yd0h8at*HT@+$9UGe@rWAo&osC$38&^Su2PDfAYDl0g`U zt!Ll+jx9?ODv+JnRi@fRQ(n;ykd;2>ED^}&_OdHuGD{vC(v^%HC$sL4Y0x;ATLm18 z;xItM?3zceLbp)mwwX;S(=|Gn8|Q~J%v;CD^vJa&txmv40hLcSHM{ZueQ3(G;943z zl2jjzRI{hr$n`ZPE7nEN8*=T|my^iK1r~krKo#$c1^yNk2bYTVMS{IGn3@#DSrXsB zk#GP%!Cd)LG5zZC9ZZDR9i_I8GJQ!oz&riLyL~Ekis`g3_OqCu?NKGj_Q?8pH8M14 zamb>_;(j5Gakl!G(lth-pLsWvsA1~OM2b2gu(1JDm7%butHz^~*~Wac^vaw;AJ2db{$i?q+l?mu+}r`u)w&Bjp0%+RooMW#NIv#kqItQG7GFzax=@JM zpYrMq2z_5`BttSJe)UPXd*0bTynEiEm#y=@3Rcn__@TfPe{G$C%S%qdRVdx>oP$(Z z40EZ=8|%Iwy<%_7KGMaosqnPCW2N(cQBDQNV&zRPzHnRVaFHPO4{4k=anXLe`tbyM%|?Aif9p>5}#@wo6D zs+}&zf>q>y!CVOTjC1MT{(sz(fC#?bS_*JH#`}Vvmp(P~^e#>!AP2-tMTBNLeN1vS%5XlPdpSB{2=DL9dQHp=rV0yIg#qN0xCkSCIufBE@=_%6u;UO!2wmv-B9P za$)`F&8O!ipM@;X!VmQ$6@M1LxmOP*; zuT9*{2zcye@uFa!5WcLqOXatW)5V}ev6)l0J%n?Z+5)q@7vx;Wz>!LaT+F&EP(RX* z$!8g6;^$%Z5~_ldmC18i1J@bqOzj-q7yW#zjk+C@3#orXdt=(U&|TOY!QcxQ@eIVV z8%jTuv|;M}`tc+o9hLztYAHE+(TeBeaojt(!MB~vQDg@#zd>!&j@Y9^!!LLC0z^Di zDnlzFtJ&VqOTC|DeVOIs%)!Es&v6w& za@<-1k!1MM0s-6@7E`p{?CC>dUoD|#$3{z$VTIb5$-MS4t)m^&aXi+e0_b@$F2WZU zb`9VJE@ytaNvn{h9FyvjF4*KQZPeg}K5%9S=6;f#QQHu^k%q9iCIE|*j8QOVKjsI)o(jUD=p0eBPb2hapm| zqg2<1VvKftu*~vWl#$7ljfUkknA&87r*HMd@#IDygcvE?k74ogL6Qs9JCeB$($={< zrsKGYJYR|GrgOfDhLo{{;M=g0H7whdoWSuiyl@S`gVbDuwYdgsSc`bmp^!NzY(sKV zR>kh*Q+)23S1<617xyGq*)ljjh_ddD)Pqf%_``{E4Cte)jqmo!#16-Ok%=57^9~Uj zGZ%SR9&F9MHY4!6rQ_i8xn?XXtkK*-nSstOB^}`|>4IjUnbvcT>acFzXZFxaf(qhQ z1slkW@OYHxWB~kTt&Wg!IhFbAXqCCd^*KvGr`5J zj~XMlcZIZM?h3xUl5ebv5tes_85Q3ZW?ZzJv3SdVw6V*Jl`bDiV_>H7EG?W&e%r@Y zv8uPz+cN{TyD#<>>z5RTg{IplGE2;L0oZY~5C4X1jO>-&Xk_h>2@uE5l<}nU4J#5q z_qLo#a2(2m=y#4rmUl-H>l9KxS&uFWUcs%(;^gsjz0UA^d#%awU#zz}Z-T=@f24{R zjLJR=vD^ibHObY%VM+_hY)ia)Ns4xgl(E!s9eVXoA1Y7Nw)qM6)l*1TkG z*yEyKJMUG&MP`(p^T!G{x;@qwI@l4>e1W={ z6yfaJFo27iSI40(qy>gr3{?3{2JuVAzfkR#0*@oTTkp^mbrc3#(Q|tiSTQ?{*$1wE z!#NsS3@lm_IU>m+m?Xo6kVWhD^Am7|!{=jkj*{WTjcrgu5bX^T_S72Un6s{ixkUlV zS%Q1@e-fruNdVIhj!_Db6gf_i(^_Cr-`Y_(dF2)r~xfiymTF8u=clM(Y?2iuL%7 z+ge!vt!!|uKX=}3yI?=KGjCci&%KnFNadQ0+iQ|5el8n}vbGjwEpQcY$&>H%LAc^T z!Wf(l?=iw2DgfsyHJTq#wl!95#q^DM1ebPWZfqP&vDpTgr(TRuoc5+^$uM3pfnsqv z2fO5QKOD~8lQ_;;=cq7O0F#e zGn|0xPH3Vy@xPjIgYVNb7pg8Bm@Kn}2{5@F>YHKSDE_Ri16L{t){@i}kG9<}_uEAaqTRMg zN!7mkAs&*sk2iZ5Hrk&z+Q0htfAQKd49KlbnLmARLJvcA zFrz;CG+Om(vncfrReyik#?de*%O#4JxwtkI*J%Teta8NOOH9XZ^hym?9|%qcrE zL6Nmdz{bQ7zmZs4TzZml-d{5Ep!3Ge6W8h7n)qXF=3k$HMVht*}f|o*TzX%jm?U|HEaWVjFaVSR3e5^Fs zMVVOj1T0QIHEwsRw~5~wObRAK#XiSSOO@R(KXcu5;sXUs!u zTT6L&f@$&~iY%T6C$nVOWC|R7lea1Jt)r3^&)X?*62lNG5J&! z(_?uy?EaV&(UyWPEQKIgxP2<~4eqYpag@h;xps@jy8Zr(i+c?vo}-d8oW*5R0uZ{l zB?DT)taz(#*Fw>E@pq&##S?(l1pxiEgsR@c2>}a)WkI^99xGHW>^6-;IZTY4wvBfN z4@^j4{^$~ftGA)A%6`w{3y8t?UiPo`9)0baNSI5+d3_I@4q$%sl0th=Nby+Ji_m%_ z!ZZh5jG16K)Al*PH~PvZ%W*E;TMQjf-uW-JZ(_mm@ZPpW>?hiWxc1@m_!zIoec>8h z_&i+DJ)8X<4ZFRy=;P_O>S#mBvR|occysCf_(|R*GS}PTuYp95!B5Ti!;Hi&-io~;X84uaE3cY}!7Nwyb z45ZQV)AhouazG|<+L2wBDnzg??3Hzm6g)XTw`s50F9Ui;G$(5CakE3o2ZtKials8X zKdR1=VlJYB2d?CR1La}cxTcba=>8m{#G_yqB?nQ1?`?zYZQ%R27)}}UJ7i5e`9a-; zoj6N)SWu}$kt_L5fBn2TtE#W~hU&d>9BzZlud;z+&D(r`TOqRDG1{SiHQ0K1$=qa@ zm~eN9iwg-trjWOQu@}UX%%*Bg4)1kb&dd-f>%B27Twh^x4Evh~=Ztq8fEfh#jSeav!JF)nG;6S6vCoC#(zB=ul$*ZM`^Ngm-)8-p z%ReC>8oi&i`v;l(5g5*Mw&?GOY13`MnR2wtF+?~wW*0)f70pPl#L3?WSqLn<+Sm)! zp@Xc)pND@F{%!c5g~SfJ7Ni~e3c|x{(LB@{KH*-=r z&4%}+H3w!BZ@5sZ^*J`*@b}gywN^*pihmLQGW?ypVw3_Cf(>G>e|#w_ zd4SKBUOl!9_M@><#&@Q7Pofdl6e+ zmBQa`#y>Xq+IW6_Fq)zZg>TQDfpJs*O>CuZS%M&iFWt-j*p_?e_bx`vyraKr4OYYa zNo&x%Gdi|fv{E0no```WSOm*b1XqTzH2C3>a-D8UE7P+(}rZ4?b=scs@^+Gv`dnaNt?FA+8Dk20tl z-93w}0p(V=2lkD_sL_};oN1SX$4P8G=6t=yY6i+A{Uf5>2mybU>bFY}G*TU>J6}wt zVPs<6bERZ~;|I-D>$yZN@T1!tjQ6gpHMR(>%VeAivvnj=sKjH7H3lrYQ5j^K%McJM z+?D8JqssP!k!@Ke@oxRd7dm6uBe>J3;(4N>S)W4#UuJWyC;n4RGCi1hm9qj7zJ~ei{$sgj`I z_|-{zY}cd=Kve&iCn)u<6BYb*7}S!Z&2f2OG7bY-$a_xKBRcPn^HYdgox~BLZ&;kJ zGj`5{)>!0fLBmB~i3WqSLj>YU`q{U} zGc@i-sZ_~&rfNZ=ygjs&*UZ$z$(fWNq-Uh?S2Q7{(GE~YM?XjXKi)ohpccwclktTU zUMVjr*W7oUvPsF){>?V%d zbv3Nxq647@@a>++{sU?k$B%DFR@tURpS1o{MA{1uCUpcx=U%kXRmXHl3vS!Y>tZOQpxbmp_Vvq96isE!=VM^UjYDqC0T#eWqKCR-n zpe?F>40eAeu{_U~1&gE^ZAapJoCAj$dI7=1!sa{WNza*UpPJ^-;Pi*-=ro66m6hh{ zB^C)L+66y;D+9LX!%plZQ!7jSaK&60yO_2Kn0nQ`+CU4zZ{>t z{SbWbQRVI-M{MT&&yqi_Klhe?ZsMO^5F`8`5P=TzTKVVSo1fRuuz$#Ys_yGhd{#cc zY5}vdg|hz-QWvh#PBJm-Rzo}_Uc;W&2~h@l9s2;~;kn4G{@h#nxikN4M@80xl*BSW z|K9z)enz1$$&SnQb*MfopO2d4S+r2}|Do9i{DO9Z%NOk$OJ(G#*E&BFVRCZSwrP*D z1;JTf3}NU?i7~(2hVa2cJH9P!FN5PhcGLcW(;k-4am~Qla6SnhVPXFocD9qg_{5%F ze|4YQFZ|-)=^P}k)h;DwgC$-{elSuZK!(Kmi;prc9Mg~Cr|{R|Z>q7i$5)Kej+4e} z1wY!I^uVeq)@OR~F26@q~enb`8J>QFp?Gr|y3C#(;ulj$=DuTS;tEayRVUR1tpa5g}KT#)a^V27aP=FmOV=aHD}@@Wh>+;H&pPK_^P$S zVJtt~&d=XqHVXf`@GnGm(yycZ8u8o68Gj-AnA?wRuao4a&W*!U{7>L_v|e(@Ly2+p zr-BWEvx8Xs1Hnu&>VSHeK6`|hARsDEIOH=%CV7tWLPZ zv9UQ|`OB^UcX;nTgob|l$MB!Se+mB;??WO8(yu~0agB4SU_$CF7GLh)viJJ-`vGS0 zEyS&*CKVMqj1b-5ET2&Ge|<1`LO4S2) zI3It=Ss9s+x4(UzZeN;>tLG-_O9NctLSrjP0`Zw;IkWvuh0iU&nV#*H{b+YO*Rsj3 z1{z~rDU%R==I5RyqC?W3E4X{ZRxYD{F8|6e73oY05|fK~VC`4??4d1AxYky!SmzF&EY64NE$ zzSLYjiZAarFLJg2c-zAvxFmSNZ4hKq?#h|Y7S?Cyde&~;@o#6`yTWoqB;DY2T<>zv zKAOlJMyVhp_&6Q1#8Js6%Z38epCyH&3l1mH8$M(n)ltVgp1D=EGMV;aWq-m@$|%lR zN10osk;0s1keX%Dn76hE7|jc1al(yFzh97?jn=bIMFlGvbf+425wLL--~U0{_w5CL zzpg-VDp=)SKL6Ha9G~H9jPxf>(O66Y3BZBpVE4}9DSYlNwFK-YV8d{mpj(0~PeRE6 z9brSb7n(cbfW|`(H?p#YZ)*#10qQwu|y zB;O$z(~)=ag!lGkaJ;Wyl^T`w9_vi4tuye+wdbvfNS#QhcaG13uEc>a zW?timAkh_#fsH5`edAW>d|L#eSwo?#Y>N{*LU~-h;VLyF>k`+OHSxt>ahH6bOiXr| zzaqTg@P*e`m2fy?p+r4Wp|#}t_zabaeDjo$O;8^q0{~Q#qgE7bQXq$m>uO=%C#2H% zSjBgkQzLoyjT?gfkI05ABx+U7P`z()=vI0l#W!m%Fp0}Ms{ABT033Y_Z2!^yA0bwY zo7ETk0q&B$zFgpS)3d!%)GR`Fa^;RBrUJeIqtRca1<<+POBN(kTSlo#&v{*LYu z-zXi6_oV7i*G2VgBo^s9udF%mMt^3a@D>GN3&u!;qR6uQ`qlH#c2FAfTkZf7ttRqB z)T8HJLrV?8j&do`y&LvzFS#{b<%;wvFZzTJMO50P*0SBXyIo#=@mzwwt|;f7qE@sx zf_Z>A{a|AP)KT;|1KkT9M{qE$auF`NPS*I55GZmx_EN?m;pdQxGYA*5*iB}-Bd;hw zb)#VZ1#%yXIk5FB_RJ8LvC=Rc}4 zRvDc5o)U?2QdHh~&phwFefKC@>)UM8GZJN@?NH+8b*`7qYmb-QZ~ain5`e2 z-=~uVw8}1xtZB)PJb?A#Ok4Z%$oPW%%e zY$|JWLnKe_G?D$Ow%Cl^FKI}Nk^0Wy*WT+b1NO{q$2xv)Q6dOGQm<&V*>~y((78-4 z2%a~5@=lk|yq6=@m7>TsKp6X=ewcxCtpbOxRfVH9|QnfmJR_(LI@B5N!7^a#yNWV@b#D zy$oXhN9X0Qw3_bkIs7$iOm`2v`?#e+qwCj^giC~{>2hp2_UhURi0C1N0$96yro)fM zUrUIvNO|{^krZ#z6a74=9DPPR@<=>id$*1NgSkJiSS0ZBNpchA zTrb|k&g8Rj-59<*1WT0j)F`7KN18`?R0{~aug*_ne1BMkJVYLCe#fD0*9X5&nEQp8 z(rxT6W3wsFmxdtqDe|rXLi&h4$t>jgJksbEYaI%wpZ*;T;9nW@~&9a zj~#S+_P&G@)lp~5k=vyk`N;AH_#r2C&WLABx{*Qh?M0yzhFSnIq}H3kSAj(zGpfTO zxKcBaT1`1JXq|^7NxXs^0a@z_*M1ZZ#VjjQS6R&y$9n;v10FWoH!L|$a(0yb-%gZD zOk(3QNYE|~lu}^%@Ab_A5_+JKMZW){3@oD2D7hW^vq#8~LovEcZcrGW1oQhi*l1Wx z47s98f_glI&|;WA{w(|jWxf}aK4P}fNSCOE z-nB;Gvb>#W>v-)u!==XCg-`L;TFd-%oMN&wKG7<;xf72GP*RGa$l&0P)88T2$eg)9 zW2qz6dch0tNI4tERm;WRujUN^R}$?R_*Hl3{UpQ8+?;+6GVUR$IvddScpf0qCp)n zN@QCL?TZ!jQXT{&7Rh7rr0+w*@qUN4AHIqqE6cbwVTIHTTLEeO1WX!S!57z^aomti zflW<&ex5?N@VOoB(}F+GHO%=VoT&rq5*8Xh_)UD7`Exz_GI!|GhirjJW#hmgrHl`} z7tCjJ-75G5zh!pt_F&z>E?y-nbXu=pLt1Z4b2sxV3l4sHo&k=Nbtsk zL3!L;?3Gg5he`{Rjb%@bWr*);2!;k$kb#r@!G&(pgq|Ft&;u9ijY#I9b0 z+d~+cp*EK!2SC>oD~8axEEGuV^dSt1fn{R$|_F|J(37F zN;7Bw$xOjV_D9GXaAp@jUG`LA0yzRWgUhDRMdmwC>JD0+yUqpcErk>jVY*M|8SiOR!?a@xc_bY6`h4N1DbaQpea8)Ah($ayLxd-IELx-hJ1nSxO*`-vCMeV74FTR6a zK;^%WjGVjur3YP4x$+?~K>%MO&>J*!>Gm0GwD1OZk~xt?Zxx&_ zhqF9RrmBVwiF#SbrmAHVF}gAY$xAjBmvMo(m`NfVE??}hM=pEPWK8zt`tWx(MDrqp zJYWraFi<)ro`HiUmrQY29nKg>VOuB5WJ=cJi34CCv>gpsI$AV&Q<98CQWs!}LH332o2So`3E zW_}HJEZ>|X4=?9(??>7{_-~i2&4@l%RVGUKHUo`hITFBId)(7fCFBS2OuM+Elokw4&6%$-B8H&h;_$2oH z5<&c*aL17igf#@tTy=uHAm^jjEF&E#+$bua4xhIO%^t54@M{8M>2Tf)pYopGcecV6 zI9kqox?8BO7|}nFM9qT9*b#*fdGpA)lmxC->n50b6$9o&B4^=b@^&Zo%VcIttUV~N zNj%(rQig~%Ff}sdA1_I`{UDO`K{(lk4c;+~?Qh>GVn|)EETDZ-uu(@g;H)?%+B42@ zkVp{TSyGE7-~YG2^rE3Te{ogoSW=ZhXEB?$@Q?y#^{r(%+uPR3!ssOqXbkr8tx6GD>du?n~w7uqOA3hUOdiFjgv}7K%RPd$v7{K zadPR{#yFX`Alw`0r5LBSr{hF_OrGyU&U62svbL!9D#geAD-*-fW6z0!L0kbQ*}?>* zd#TNZ)h3hbpk0nVeckR8t72V*K4AY`uc-*i&O~<*6?X-)eXyA$=$RnA6;*^<6csEr z;s<^W0r6EdST2=m@%MuLh^@_%ok=$=-n-YJ65Shl{?%h6PTxw7{n%nPHj-mAxP{Kc z8lD>)Nt+#8ObkM@gIhFyac^vwVr(S4c5KP`KyhrJH`Z+;Zq#b^D4^Mu3&BlH9UiPGTai_WR5BnzEmxTH94#nDzDx=Em&*$JQEa>wc}ZaW4%eru2d0 zK-QbH$1@D4*L!wmDLcd(jZ-}2-bt{^lEY^_1mwfb_vvLsYYp1P%X#J{N95ZoyoQ}t z>Ht!-=(u?|$B%%V-*Ei>#F&UfYy6_U>d|)s=b+JdMs^xwH+yQvt~<(OUlg0fw#7Tc zeQ3Ok+GaIwZPpL^iE~1Ay_ZB-vQK`@2ZcBR5Xz66YaatXU51{Lm2vX*3!kozy==R& z?xuM}mGKm=8p;)a0o{`yFtTTEtkLX&yz4HMA+j(*piIiT3zJ^(J2_w)+xZCm^f<5f zy=?l^`T0vyJJfB`YceuE!udrW0=?w-VJUPmyMBVEpxLXYbb5CqCI9Tt477m$;dk8_K)Vh7PLaN9A5av?qWKx zILuB+Af!n4i`vT=g{r-zm{799LsOq?#B)tx}LD!qzgsMR)|%thg*);_0u9`kk1 zguS?FBfjU4;|clA^j>2>0u@#Q^i6Lt;o^sXK7Fj#uuM>A6Od>>#D&Eo$YjO=I~gsnO7 ziS}))#8<^UMPNH-U&vEOSz>B79jIWDBee!PenT4_BgAxfDo3SNxuF2YHxe@ZQuyB z9ZA{wneV_glyfHQKt=#FR@_l&%~?OAJ<^Q5Ebk~1+pxN0@b>mKEKZM7zsIs)--fO^ zy~JqUlgm#hE|LTDZgRRw967@hTdgC!42O(hG0|<*i*r|er#pPp1fd^8%S1dfl4BzD zG!Y_79g@Oz_APD3`=LGF6FRetu`YCdmLpY61KcCRNuuM-5@biXum#2Alem}MZ<}L_ zuNvDoIa`WFdga)j?ED@=&EG=4dRR5(Z((*izSn28HBuKW284W8BE#O&>#Ut8%Vg|; z&9TH6j^&%tJ$-u3Sa4bJ4BsD1K2_ydazbb^5~maDvFwedgf}&h zMX0~`;$L>SkJ5gO;(M`9hR&IMGly|4WMi;Nu}Sh)AJAsyx?#K3S zx0;?`vwPDbF`)TiUz7oIQMJy-gLa6?+G~D%e%)Ts5(!*UYDvjDPb9&?`SO3O@m)i7 zG2iC+Vm-d47~d1?0FoEU-fxfaGB!tP&G*(?vN5kQ*^DhUwXE~oj*>=;QG=(q9y!uU z(eO>I=jFf^#qWI~y?5~I&U zr`lnq&rqw7X(29SK^b4>qRzWyO4?h0>%zFAf9`qAAr@GaUq6pIl=@;K&h{6~WKWv- z{){MvVtZZ#n|5kz?U4IwY|ri>+PXbYeo@V-nr|;Tr`8uWA?Ni==6v9vd4AqRpyPy|E-8kytMx{ z6#cW0Y7KS&_GN~VU+$grjJEs6&$_-9Vt_rDzVt`s@Vkty*H>@-KD-VlM^)D1Q+qtx zUbQAR98c@wacK8M)GOzc?w-uP&$;A(jti}v*0-fnG9bz{7a z9&aJ<_N{d^ulCkzN_K3b`c97b#rOvDnvVBYRp03C)s^?T5)s*#dHpUe*84)g^d(L} zbCa861VjBB8~8=vZha!Ec7>%a8jL^OukSsN(WWdX%fM-thF;Qs{h0#=Z1nH9+P_dt zNjQzpjeeBphu_pQRx~lt(@HOw{n7fEwoOJE4ZiT-{epIIXip)wec6bTN6QEh(g(5@ zgk=qLv=nhjuyA-RKcO2M>yj8-OmJcw?L)R`yN47t&tU-uf*2^7fzq;HHV=OF*S$pX z$=4GZg7@LwpG!3U`KlK-DqE8gxTN^**k8Xjn~{CKWj}Z+%t>pRms=zE#2`NW-=eSP z9!X!VI7CAhTD{zzirt%E-1f%M!$yqa*N%JkZTIOn9QUkPZPLleGdw-dG`tr-M2l^h z91%^%;Vwk~KK?{LdCo(gOjetV3u~GU>!+edfGy#jd)Za<`u_QuMT1@0;8Hd>(Y;x& z!C~q@$;xidw8YJnvz1;qX1s>hn<7rkWN2|uwa)Jdz{*%JdjE$->l5Y*xf8)?q#Cxi z$ZsXrtYF#b%C2z}6IJ?#UxFqlDf3ZRQ##UNCZiaK}H0Q#x^15xxrP1*(_HEWz?fS9bZP$)>30s(n&9$%FC5N3Gt-j@+8|$4m-AI$i zUsRa4eTj|Ym>;8}HvH25Mc21qxI&##J+n>BM(%f037}y`5ck{eW*Ro{`Na@*HEx!Y zYnuGTM~)4)PUGJ73zr#s!GD=-rk*)+@}D6FIs0^`WG%lSj5g_s zajeLD>U<`**1uN_D!F%!$E4-UuNW-64z(;6xW&CGId*k1f?lwvey(Lc#-e!EH7LX5 zEQmBOe;=w_j@FGBLHFZFW;b@pq?}VpV~&AI11R2P@9uZZoN;%TsGqH!O6|QGsJ>~S z_vd?%`X3srZ(h3j?;oR$p_MzLNgiENySn!!rLKt!-zR7DzN0!;<$Q|~^ptOx|IyFe zh&~lLF`^nIUYqB?3kBc%1HJ-h4p!q2)q1#O@X?HNJm%Ax$5QD7p&^Tg zm8>Zo3DG`yL^Q@II^z5KgzU|5?rZFO+PlyXSD$yf<9w4-xgJ&TV^)gA>1cIcsfKTY zlXv+_Fy~n8JHfdH&YWcgdJToCul+y`bi40L3`~Um_I_^6G`jv!5mb7>WWy`3fw=>` z@V|JTlwS7VZJyfSZ!}NUb)QRJ$KByAPOSGv>!38*Llj(q*zq zU2{*<$)G-Vl`$suszv2&D7iIUr9PKK zXhNaaKDYFI<)aD@vG@JdK|M2g!yN$uD{Vwdk5ulP~f7_|3VpA{Kig*GFd zdJQdIwrShBUR!#s?zE8kpOe>NWscF&#R1EFMU(JnV!UcY7a5|mE=7K#VO0}0v^89d zxatw(NX&1KSs^q!v}ws30}m|bjlo0{j*vq_Xv=19=7JVBbD0flyv{swwwkZZT4>@D zzeQf<&hYgI!G3H0VS!w%;}PxrO1)2ghNZ84c}myOm#m zxyi2DyG^XbeQ6+1N5w(p>cQuHug$>)zD3iR8VX6=VmN;vyM2dNda<|8F82gZ=UlgBlrxno&HvR6IGVFv5}kE>c&8>MEd6f+bH()cc(a? z*xNdXoVvJVtc&K-36j`TBS5=GV#CfluL+_Ne5|rf5r&ok5D3o%ka6ENHmai zCg#0$c7+Uy!vA7*Og`AWB~%6@FWw0()wAIiv~`hiMoTiGYrZR&K zz8}-~q&}dNSY}b!7h;eCv3Vph6#2D<9Y0y#L}$k<{KndP8YovgKFYa47E|2=$};9- z)G-oN6B=%9KLnCk4RyPAcgS^IX-ngbYfE@npHzf%V@*d5IPsCP`9K@!jBEH72eqEIk`@D(uv}+V=y@xlw0*-OTIvVIN8GD)sNkbiQok<=9%-K+U=Gx~3xeTI2yX@qO_{ z_`YwJ$M||P5W_2&ipqicY>$gE(vCdz~Sf!l5 zvUg58F_`zlr`jd9CZj|`NN_u;nuA=Yj97nZA2{EeK5F#A9KvNEJ^6jT{h#~!VY??~ zhn4!J8+|GbE!8J%&X9{6y=n|H+ui*!(9Ac-z$=h8#&CMkI*iSol@*ALirkog_qu*{ z?pyuRtT+0VId`QD-&yfJ(&&>T2#-;-Zz)94wYJ>*pkCN_kHus$Y`fiedR6Cx_`lu* z(*5&BT`!QX-r)?R!Cn~vR#LVI6l<Gzo?!56D*qk@ni?5%v=0$DKxx{h$IZJ+_o%biG`}}niOR3Dp8xpMV|0T6#Ia;Kc zh_u1id@TB}q`DeOL&E(iDp_}fFgDUB$MWQO^$9O;+0hqItG`-PrmUu>6a?Wl{i#;o z>QArXy2D`a;b8jw{WHBb?&7Wfm+C^^nz-D^uNzC_PTn3%c`OHwf(z0db@vrQE#t7r&xo)NPA(6F?gOKV8uL*IbZSOix^nPfgkx`<6qB= z-`yMa`1Qtc-}zc2;FCLObtqx9ogC93OFA&C0`sBKaqV`j zMsqBDM7G5ZdEI5&`s`Y3YAR{BQcmSStxnqPqp5*RABEDX=3sP<>Epx3JUo|Up-k%W zclX;ZG=^!{DT#W_o!>*hA`Pp(;-6HLSsL#`X{X<7-&^LtsQps6jn-F?EjVwv;jb&w z?FTx2=uVQlqDH@IYsA;)Y_XVxa6EAR?=FN59Z`(zv|&?wpV!NOzXKMaTyQ zI+9zHx9yft@~f5@JHkRgxG{0oZqb&tX3I9M*TfFfI7@mr*3Vm`)!0cnYVM;Lz2d!J zFbC@ispp`&-p(PZo`2ySGFqVBohlb57MPp+dS8GULolOMMblg3j~U?ppqWQs3pxAaI@Ok^zKmvR`a9OZVW z1{!hO>tNI4%R9i&z}^Ed>2uq=pit-fE+}S~Y@dGpKG!RFXn7F?Ygu0kOGm zx~a{${gzEz3|_U_^ZjjVGVQO{W#zn*_Gj1Z^WFK4c@;-^qwD)DZMfDj} zEtfzX+k?;Dd!`SgL+U;Z*?-XonLt^vIu-5zh_hV4bID; zHO+*}Opx$smjUq*Sb=yi4~@D&FX>ax&sLwtW-I%&?-<|b@9+1zZ)m=D{|$R?W9Fg= zUptnDR&0-@VdrhFNZJ_7*B7tLxFrRZ`M0?q-Rt{z+Vt)!Z1-=iLobWZ>_kh`ZcAnP z;;)v$=jy&<9EXM$-rS2<4Wo$R%Ujvho;{xmdwJ%fG^NFiJ<$~$T0{&+S_;P;hE2O&&Erdae-8a1H|uR+uPS(`ocF~y5zfp zqj1xw*Y;7x4d+z#misk%;C=O;YQ3d5-kxjo$(hO;>SaX+y1mP{-x{hXU-x=@{JuRH z?;ChtBet*a;9j`%-$2(*2kB&7gFM*N&OzZKQaW&o^cg9sbK(@wJJVM&zI=v8SPrSSL zSBf43&n#0XBJ--Tcn{CBt8;fO=4~QlvGRL&w^~T_JG*6H2Ad*eUI#xn&ePrTw9x7O zofGYzDlZ=o*oTj(dq2YoZ!yXG+w2bdcL;jRJvFiHbKq-FO5(Ah*vnWx7UQUq?e&Nn zDByB56%M!@OvoEktOryGdwxZp!@}G9|0&(a#W&YTUrXhl{qUL*ZsXR-Rk^I<3wxYgo;9E(Mm{;GSjSo3n<6fWMy7-OyWL>a#?5rg= z)V{SF$V#h6e-0J6@*2z=9AD3mSX*YigA8Ld6Rj6eaXz@Hs-fAknNQiEVk;E>v0zw?1!<56E-7}OZ}Iu$2NYrHIO^& zky`5kZ1gXYkNY@dI}~#RUY`{c6coQMzk8{i+`%Jn4CongN$y>bKAIn18Z|||^-Sz^ zc_xf#^!_WxP_W5NKkHhQ7)bN13BsTl}QpuRSyg$2(+xE!I;iB889p;( z*nY>qYz4OB!_Rv{wwFYlAVaY(=hv;wcKo;;-DWJ=3~gw=*$CK8RPX^4Gs6uEiF`c3g|x4EKWdtlPCFI=uV0 zqgoq%wR-_RJ~yXN_fQ8tR4usc)8Cp6U+yoJ0aH`6-ItV8Z>^l*9f21M`}+E_-tNUL zq|fa=BQD&khGbd8uUYx!Zq=7|y%*EZ?wPuVttxt4lhZS<^ai^nH3*9;MnJ>YVC}KR znarr=Dy(YJ-5GP=tn8Iqr5L;0e`PHmk>Aed$=-_%-Hixsd%#1C`9ucrR|S*5#IL)7 z5dG+M#o9In(!y%gq+Xlwnzje5Q43WtZ6#WjSA#DCYG}?0hsvX8CZZH{@hVvVTX#E( z^i#Y)g!}$u#Z%PYIpz*;qGL$WSLTxep2*Uu51IaKX&&U zOF2P8W#@8eeP*^)>&9GcQxr$Ag6@pB*fq-_;ZP)^m1o?uRC-v@U=qLl86PiFj)JRk z_a@)AIOD<9s()`-7X*`NEzKem(H?V`_GWoHm@l|$w`z}$xz|YHv-AnZFg}mH-tKp^$0d~bTINW7wzvJWF_Sy< zG`JD6fpWj!KO3pEHc_kJ!aQm%u#MA7zrTBV&-danvG)3GkAfXP)@J))vlrBBVpt-? zlu?!lv1gDZqIVn$8~G5PF=4TFUx=~*POZ&1{$zdEI<_Jk&zM@0jYk7C$#{Kn-)`h= z@f*};qoH2+8E7%Nx7-J=vWX}1j=%lZKEFrVH)nk;kqQk|zI5@qbP4oOP~9_t4u;Ti46;dCp z#l1R?XqLeTpcGkdC((uai;^uXvVey;ZQ(Pfr@ZiNC2`R8`^&oO~W+3$oe ziO81Wfcph$WmpS@^V(>HW~^NHeJKWwm7l<#?69s% z-D@McChEE9yUX&oQW-UV#0g46&u(s?YF3ed?n2d2t-q*a+Aj2&@n^Dbmd{+occ!0R zg^3Z(22@MzKSTZ0qc7K1XADvjh-}6Dv)Miyz)u#Tss{u!u!6KG19>5nJO-$7o4erZ zb&=|2!D9x$_lV!+tVHpFu%m-?eH43*e>#$njy)yOe2zXFvlMoT&#jCh_xy1CsoM#= z>BiqfWc8=;*WqtM0R4_(8?0Tz5eU2iuvp`SHQn(>#Ck#b_uXYW?r&d@_(ob(Me-XL z5n|@`5mP}<9_!lQ_|;2P18x4>x~=I=wn2F8e;fWT{5{P;zMh>02d7{r{FP_a=W5Qk zuQwr?ORky^{eR6RC^?>?mF%|W#WTZMT~jn^mH4QM`Q*ZVvI9@lg!X;D8S_1pWvIuu z(+(wg4`+Cf>_>E3`KK4So3a%2SWjvPjD7A?_+PZ)(Q_TE7O0)gvGpKbFC82H^b9@y zva#6~sGUe>E0IUa*PHiyAaNRWE_8|fV0`Oxh17E&*5LMa2vcvf5ZZR3;JJz#en?BIaU9EoO8fOQsLIv&f*+ski z2*t)nHN85Hw6BOc#jbcJa3rt9SDV!x)@$q0--p)21I2MxbYQ)u+fe=UGs1eMrd7oV0Ej!PDkq@sjad-L|r zqVHqfX81l-yu1B*N79mO4d;IwoJ>S3Kw2bVQTbV2Q7ZpGBY_LiymeU87w=Kj9DE=3 z=n=x$YCw-Lc$xI{@h>{Xxh|u2y@phleMXx!QLT22YEDpy5h}`RrS_HH_C2vuVfo-Z zMyc5b5r7MQ{=#|dsLCNF3m>H&fA#_I>f2}kEc|)+i}07>--UmFvwXiscs${~0wSPS zcz$Q~*$m9jgUI$Cdze5fq%@wUYOY!qG_e7&hQUy68qSs>iC^{$*x@`F7)Z9Ec2av3 z29emq)j`iQ_K$xKwtw_NC+O5!6ivOJ>KU%BSgqc*J;t~fo}X6UX%efOrKvQV2$OfjQOQE-abtrl@3$=vTW2p zkAA@Xjs|I(N%r!hXO9)xw?n?kz+>QQp%X3>d7v#$7VG?-+@c$cr03;(~l?(TeI4aub*-IUyGF} zN`_|*wBlQeA{G&^9B_KzFZ7|Ho=SR&Uj+k`1*i;?vn4kZ_XnspcmsdncScj@t~CrfPWly8{Z zy%Sk_c*J^@5dJLt4F;CIGriQZ7wJr~l0}d}bK<;w@;5-d8`q4OWsYO7l|rdhCOKfV zFBkKjLI<6WXmF8pTt{Z6C57kcxrupSG!djPVCKg;ridwb>>V!nk>x2--v zrBhxNxwX2|2*X&5o5OgqQD^jlNzu`TakTm*3F_m)H}yeY#rx5~+vGLH@5C%Gpg*&p z=GI~UtJa5ww?4g9^LHbAhfD+$-Ry)@Mg0u4zva z?Fq^7c{S(#n7lSJY7flGa1bX zZxu%B;l58tvNFhVqoy7E2Kck=fuWsdx#>B~K@Awa1)3H<`|O#D#hIedy^}uMXG)Hg z=?hkKe94)zCrbPL4l1Qq=Sh!K=%p_@PrKKhr^azA#}6;NXU>y5P2_6=c?v&noh5ga z*cQR;j5D4kUdyCDpAY3Zl0Fd=+TA%v(VU}v5p{RY(JJRi-gJa671l2BFQ!M~lvZ5QoPRF?@R-G^|LZP%OVV28Gx{yNsn765(Lae$q!d zZ3rmq**H?_ee56`7RJ}GhUDt%^obEwU)5m2_YHWk@(H1_QQ&3a>`RVhc5FM_b_Y|V zog@1^|071w@dRdl0evVLgE}^tyDU1Eu%Pe9sCD5Vajm|Z=pozR+#_0k5W#1FWuD_B z1(Q~K6(Oo2trD1@#o`0NBa4z+h%?3NgPs3Dk#Tg%oF#&Z&JXB)Am3#dOlrZ(v={?B zUZ|J?JY;fDgY?6Go_t~vp&={HRlN68Hi3I`W4bqYOol2QHkO5uR(%eOc&?N9a(eWu zksi$FWtNnJIYW~{^lh9XMMJfYQ8c`F<|N?-ul;dV25XJhB{F!xIPAr@SIahICJtRFsu6Q8nXyj)}4+D9@S3Ha5oQyu&<}9xZ*c zYVozx-^SOK&SMFYbcDECg0&Kp^@~3R3W+Ut0q5YsKQPBuJ*sPKpwFI+@14ipZp9+ySn9x1tgfVIn z7c0lZZe2aX+f~`Cl~A1yCMH9nam;QWiDmvtmW}Vjf69?M@OiK&n|7bx6cgrHpoB;K z7rrZvHFpt2WnSzU7(Wp?KB2DZIla-h`mBbp*sZJBuZ;0tCDna3-({Gs*vs(!T_TzP z3FN`a0D&y_Fb(40VC$0|`jMiI&hB9=jBU`obIe9MkhIUNJ$OT+fatCnESHQ9rWX!9 z;9$YOC$D#x1Oo)mY)L$OB29}m!btDk=9=So;Y81YQDOoUJPcv`Fmz?3xY0TVP&6T^ z7x~^^=Y*haF9#hkO@Qf_&=edPW>F!eBL^$`}b!|2-w{uRaCc-uv$e;m@uMcuw-`qlc~NgGNa@ z@=7d}Nr|$zm>ha}Yuu!djy~F=WJZH0BIkGIKIE0Lm@;P;icGHUUjB;OP%$2RuG|(y z^vYSlCT7na0io=CC`S*%)aU>yXT~9O)8|3+5IMU7oiV z#87QmL}ejHk^Fj?H9esjhPoJU=BVB>ayWLx?a^70SAQ}D9AM2paGP{3!b@-mr?#^Z z9!@&rbQQc&7LE<}+#W=Gj_iqm(WxJ=qa&e_gv=#HYxx~i%mV%&Jkj}89M4C>JmmZ1 zgb0x7K)<78(j|#*(rW?fK=`Q?Q={N;v?L|$^Po8T4-x}ITk%Xuvm6;=YmPBhl99BC znPnq#tG9nF=*sz7#DAl{8?dx`$LcIm|n=nA|Is5R|E}MzDk(!K|Dsf?yOjs zMAw!0jWYfRZVvTJuwPi;o)OU`XV4O?^cD>#bSlC@7~9mqp~s1lqwg&K7@e#c{EpF; zr$l@g9ocu`X50OvL}$ngFSgsnzca?v?;G2IcrqztCgT96NPet0K^(el$uWbm-Nn_$ zOK8UiljxC@u6Yf9Gf9oi1~RNFFpzG^G2ef!D5f~ExewBp=l)a7N*b*GGa3!qd|(bz zKE1Qv>zcI?Njhhn*O>PMF<_I#-wl!yAJnKl@KkgrkI4FYyRg`o)8c9)avyIA3q@XK z5SlB~RN_tVe*Vwljz@(C+s)hgLp;(FFDBnKXy}Sw52me0=o{n$ovqj@o`RcNxP9OO z^Q*o`R(c3w~b|t6ZoI+^4 zF-(djy=?m|Q>1F5K;33E-AEuH7rmD_Ajf5xol6`HCwfi(Q}#fbMVbW56CANeU%D0i@O=N)L(=Rz6E@%<^(*8){Z%M6C)Tg zXZI4+yyrG&C*8B3AM7WGZEWihi%wFD2%^oa)-Hp8qw`UW^AD~$V7WzK9k=+P;Y)(d zkO`4RL*g>Rhx10;{!)w;SCl+~d+p(72&O-ZuLaRr*G5l0M0Bt>z+eA~?Q43bH{0W% z+}i&Cq(_wcGB}#+|n|R{EE%0Jg{ujV%evN!7Vz%dO5*?_{Cos)Lxlb~f56?hj+j#Bxd`rX2$G4OH$^A_1>)Yz9B^|cs zH>PL1O1;^e)>taZdCcQ_ujBfiUwk=88TBG}NHJJb28GB30tekyf$roIVWjX@S zLn(9C*}{FdWY0uWqIK+6GWh9!|9!K^R{OtZUhQ6n*Uw937pp{+mCEjnqb0|!QN2u_ zx5rt@wet(A7PMLpE)4Uo>{H1V!?#&kJ2wW)V{Ck=d`JBMMhS`;gbBiU8DWBn+TaTl zLI@&+kc(X8kH{a8KOh&m$VDy!v0cMY1i%s96$7Z_DRd`A-`cs>c)yX$rF4S88-_iuSy#w|P| zbPwO)=6r|RuEAGT*#%mY=WMR`LkI1O=j{9Po+itP{9YqWfGSvCzWR*KGL_T`=)CXo zxOU>}*v!Utq$)lBjxq1zN*}WGBR@}q=|9rkK&cqb6>>$#M#&Z$ifj!)7NMK05|sMS zXYr`<5~+BTzL0()ZjW;iUC2>6%N7#9VjWQV)E5=(xk}IZNjYtG4bQMv9JbDBJKNo! z<8b=$!F&u0zbg75xsk4puhQyf_N3MK_Cc!fCG&hknFEU|{7Nfa==rxfNqHxAKl6D| zKQi^JCB0u;Y>bP1rLfuOP700?XPoLRkwZ;xJ@{LTI_a}6T%7B$oDJsA^c%%j+o3W8 zw!;y%sWKO5$&#(~A)#z%j|^dn!%191_k?~{U93pcpY;dUTgTN(u-iD3Nj@Wa8cIE3 zYvbCHtX^4u_PN? zVcYLJ&O~ju z;vZPNfz$HceL=pzxBW~O1Mi_I+%PaacCm7%=B61!ujc(9S+NN6hD@piLGQ^K*y7FWsnMP#u8;P4?%01 zITw2x%l48yiNy{mWywHTRz(~AngkHsD;sX4V4Vs!+3(5Pn9nOGV;1`{+i{oLSdl@L z+2b}A*U)P{LKrj$5;4Betx6!nqv90l+9E3~eQaK-FZ(OUL(xlzJHoh)wbbg)`-0PS zt7~omRcz~NYZClfwAsr2+H2JpD*bc+Bu7RvG9dSB7%nH(PQA|;b;awNcO<-%nf5&- z7;1$M-UP+eY=AMiarT((fRpq}?I)@G*0g%D-Rh)f8)FM9-px)bW?`kl!7wNkA7_<#309tWBj3ND7Mh-(qPo}oI@Oyh?q88QRBB4gGKJ*)^XlJ_m{adHy`#u;`g?oe zz1gJXT?ZP^%1^lA+epg8g?ER9GWNL#U^Z-5>@=*{<@UV&%JaG_JPxzp z)?j(o=XCCiSn*BF{S(d1S8w&K=Am9w5rYMsRPG)pl0 z^-j0!GZLgQuBa{cQ|s2b@<>cdxl)Ica31Zqnw#vg$OKnJY)e-p6=yqXENXU(s=$*4 zC+kaNncw2T-qWw5G<^tK(vYfj-B`YeTfs(QiR1X2V!2~HG;E>!R)I6-DgsQL@teG% zaWIUaulORDjo_$OhEp@nw!B(g1I%%kD?_o`D9L8WgOtaSBfHV-pDQthJ3`X1M%aeS z_Q<_;+|820Ywg!ad!|ZfSIRYN{k_&32O7CmII%%Vxu4?t>bpvG7E7lbLtU0NMIj%V z;cs)DH8ENQ#>#Pc#2&Xu>)@qcQGCd)czve76=-q{jFWc`i`9l9Vkt}Th#I1; zR&t1dA7$Q+>cn!tSf}~Wq=0?CoBhsKtu*C-t{lE)ayk%UWRXOqGLEAZnn(qCrO_wF zRWQM7@w#mPD%P{0ZFP(zG+=MNX?`~O9ikRnXi7zv@x4IefxC==I0zcL!0QAy zwQq0R7f^i6_q`?LK!HBuH1#qh048RSar=6Sal66fknD0oM)Q^NwQ)adMt7~qCsIIC z*{X=!r<(0O1y8ATMKyi_oW2i%cF1}S`It5C2$NJ-?(Dh9ngAJeII7iVot5 zT3I%n`%(FjT6p<-lKMGtnck)O>n<1hCcF!6Dr=@%!OWnd)`6HS((-l9RnFP)?|9Eq zv7O+;hdpKdZy5zc6nyyh2&^)IJ>dXcR5mA>tSIAoGk?u3`{6s*;86@g&B0F2x0mN^ z$hA=1T17(~#eU>_Zaznq)&VBSf8#CN0n%Lg9gjY_{`UAr`se%sOeQ-;flNdSZAI)P4n00P^qYK6i*u(h6y_1&T-y z?vc3GM-y&wMb(9Vpm&_`$Km>sdz|VI1ggqPTwO(U?suL~;xzvhoaQ+`}UFRw{IxDRdJ*%&U6Ya zIVtuWAvB}PX>Q{{ZE$3u3W7OqbxKYj-a_wST_N0YX@Fn~SIk$)_XBKNfw*SU>O1GF zio(MqlF@=lRN+HaKB6TB=Pz}Bi$xn-Xt>ky+HZH?lG>>#+Hss?QA4*$hD0tm{;|{q z`aSJYk3*j%KEqUt^B`=djdHRNo23`$#2$BJgt92`&4nMR<(gcQA*!QB!=*kLrar0H zpH%{)%Kx1d?a%U|Xmiisg&PqkC*by-!-&8}jr)dcgIg%8^$fL1Ax)%jw~W!NRm#i- zqn*gP-RK%6&t*8W+w|2Wx&}NuFQJ&uT=)^eZ7<hLYhVKm4b8UTy;F(Uxo#${!OC zoz~GrL?-u;75mwj_v^s#BYXsP`cd`+hnw^j(NdkXx>^*1F_;nndM=kSF%l--na<29 zut#~doLp){MCZDZJOR}8qGs1s`oh*e_*%H=5ro7>aNdfupk;>gIU8wxr$_?$i$1MS z%ZIq&*y>Z#<-M%HWcfzKS)+*8XO)2~=C|axW+zn*!l08}i&>4u4yvJ&8O=uwce8VU znxhwSeXIIx*!z%o5bvL|y!9AS+M0jcAOarwT0d@Z2eeaU_|E+YI#+j1jW>3rR zOw)?aRvb+h`j1!eTZUk9sBa)!Lb=}5(wb&Bla}mJ0~lvY+kkSDdXCkmI2Sp`niH*& zvuWo|<1%?I#XOH7ppVY3mXl^0waUSf@8FRyEd|=&xc#9|*xR$FAM(Alp=TZav#Q`8oBi>k zQw4h}hUGv!x%5lUeI6epyX>`woT9lrku61v__#;Dynxua&9Z?1l%d_G&MD7Mx|5Vk zKKTv(8iS`E>4lqVi#ALF{Emvk6B+At z#WSo`Y8bEPL~L$3`2Yo^Mk>JEGpOy1cI))f^^U*aCE=>6f^lf_xHEU6_(E7m+{5{i zwdfKXJZ6W2wx!RuyQr@&Ji9XfM&_2g_-uhRyW-g`>XJJ?0%KyQ%3`d!UNNwx`lBSD zhn`NB0`GzR`d7j6`q(p$*?WH`j1Q{E3yU%3{$6?p?E`s6y3KoxXcZ2l^wXIwH>8`ntUDo-deN&L1RucV`fK z^eg*_Gifa7@{a$>C;+$L9ZLwAYNL zx(D>os&%IhJ&U9|&%VPVb$%$$;Wd2SgCO-2K7o41(CpXGm{irQ?as&kLk0H5>?~oZSa$W7pYizu?4W0tz!{V} z41?}Ivyu1!LhDi^i>hj?*>0F7i|*GNqyi2O7hji=0vD6Dp5s9Mph=EHlD=n z>|-F*LnK{wtoLX&w8GoD_fziaVNQs&-7t=hB_9d-9~tdZPqN3biYyPSF<^@$zg+ z(xWPPMkQD>2IZz|VbL$Fa~*+hSp^?UmwwHe zm#TtS#*KHzX0}JmF?j~2n2PaAeq`mjC0mOdeuLN;EKdb(W^THVBJWrUZ`Gmbaa6_y zM;pld*>Td|lAclSe*A2wz!-@KAu^b^lh4E_mrjMWxHui7VlUbm(Z*-oxo>0z*G`K( zVeQn6VNT^*JfzV%=QH%t+9|4a1dG!oQ|*pawVWTcygXTD&x;c_&QSI)^;>t!r4v`{ zGuBU@!eaa5SEaReV4utEB-$AKiNxaibLrRC_PU(UPai&^wVSOACw0EmoWhk>=S|sL z%abcliK{2rVaSxnSROKl%jfyC%jdaXoSh3N+YZs%2@g(jct6MPD6aA0f@S%)z~UvC zFVvG6DF{4gO7elUFO7YW$BMN9^}Z(0s-kS!q!%#vjic&NKNc&PuuBmRy_ca+PF zosh-^l5T^l;>f@ALc*pvL5zOJ4Lo`rTc3#~)J zJDacWo|)h^K4~7Vp96vXhr$&FWc}h~ybI|Df6#e&rSouM4wify&z^%hKgYA?prG>@ zA3gr}-9A{E0bz04Di<5^NZ$`r(&IHG%V&=_NEZAl zJ#&3e&$_c##<_Pmx-WBA#h19HSe3bZ##rBk&x;fMH!pJlyu^MkIRu_F`c?jc$KO^vyzg<2=8_EtM7M=iN`I@Wi_*-6yX*SKPCu=-G2edlO3bnUmw@8<5;mQs~jB z)iX#ixXjm=I0J3~sAhbc{CZ&gOGcfaobi`LJx{r=3te<+nU&l=FJp~3O?-U57S1IK z=V$2P*^kf{I@x!)W{J~aUux6>2=u&BmyAZk<5%3qo&98=xiSA{`0Yu^389$q2)xkv zC1+YPK%TksiL2H4bHh^vyZ1+2Jo(0z^kTDMBnr=)gqVzviCtU6Gw%6(?ti0XX5AaV zkfeq??spEizMQV(d8MCw_oo$>k~BWcmbncd7rD3JHV&JY(&L|Nv*lc;boc)Yy_N_2 zoUyLlbPF8a7x1`vgyiQrTm)6&?!|SyC?y|0viWQsM?lUnnk|PB(y-+%XgIBcn2T+?a!nt1@MO?1KlO zatX%KGqR&{*z$~q2S$EEsFW$LIBIn_i%YHA0sE)h0V`u~6TrkCq5fSMc*B5L81em! zzB26l{j_lfTl)pZ{-hYp>iA=D$w}i=#{a;&m)PLXAG^mEf6lr)Sn|g&yFcq)*w4>8 zMcU< z{m{CTmakRSFDB)@)p2V~COv1x>j0nTDLws+*Q-POi09f@ zy}ZO8e@dL@(mkHDriWyZ0ngH9R^sc93F`T`_)F|_rZahp(q?x2nx@)&UXtgI^~Uj< zTxY#Us(tWd1+=}HxuA|QEC$0cJw+dR(Dry)UF`faidam~(ZXKc<7Xh;4`r!(5zSjKsAp+m z1W%Lya`%k!Ub3$Z$LNKmnA5q(XDXmE_!6$?>D((4jjU^`eCuAy)MPbN8$K1KdS7Dm28R#ZtSD*u)N5L zxCw$NcwPonAH6v$t>(kgc#dCf#SY!i7}11{>?N$Rr^Hb%?FR=;`V=FSz(G-GN(eL@ zq^=pGb85|A>+l*O*%1zg;zvyL!GOcJif5;<^^Dof=n@%Ix-Rg4qC-2clYw^C!D@FS zF+BLs#%jFl4bDq2ll9T+(H4w{fPwaU*N*>HK?iZtCFhA`jHxKxqQCU_DlJ?pEGYQLQ(|U9>~v z<{+Im6k{sdaqrQF===-5C3#p6eA(vh$=pX(ve!F%y&_=~R@>+axqu{E()Y~T(f4RW z*b~650bWQ0uGhTcx9IbI@5`%xt2j7#-z&UtC;KB|rZV^+&DQ+A$P(whB+qZbtE=z5 zwG+|=NomubKKT6H*M^`6AAUaX=4+m>Gl2c5n9W#S&OV@BTlsx!@9WC<1zDe!_V}bQ zc#t$$zOR?((n;_SUV9%-Owr(4|BC0LgNydM*>mrCU-?{qV^l6F*=KY=a+Og4+NzAB zd|x+vA2_4$YmYX=747k+S!=JC_Rjow>EO!yy7~JUF!tW|w1W?{ryYcDA@h8MBs+0b zkVJ#Xpvvw2E$@D6aY*vsD4f>Cdym@cDAC3WDxq)pR?n0@zmg_b`UzbpLP{*!vwrr{ zPkpbn8dm!X89d_s+Sz4ai#}9t{5bosZ4asZ8)a(m`0NaJzRS;a>z@hQ`Kz9T9r38= z$nLoJIkw-U6V&O#XL{c^oc8NJ!gVx8h+PC2L5QCvF_nvSUEi+x%=&zX3w!&*8WjV&@;OE4szO(%li5Pj<*X0R*)-lSryC{_VLB3Y|OSg?|Mex=GLW?_22B{=F<0nqYnH)JkLRfml>3&M@`QChJH! z(32yxe~eU6m3z_%&NpE!N?&#yJIDJ60huRU z$BcJC*v?fUs~LrDD|+_`-Fpmz`5ub*LRTBaj7Rv8`3zMDe=RM`DIGwl$@XpLznY%l zb>&xv$1Hj`r;f7cKy>fg-7!F(X4c#!mzV9O+Vv&BoBvxg2`~XkkTbdF&N*HCwdvZr zV{~e=#yJMrhmGKX>nGTLH6BUPk?#We1mrXIGzzhN-JMg3zb68Sc>3%~q`(+T9rm@~ zORC4JE{lo79?^c{S>(x327)BYDjl8d&CoOU%30|8ESxrmGK+HR%4gCUx%Ic*(QAPx z)$r0x7kur{;89MYDSEv7Ykfwm9srVW@~n#chv_^K*n55$&1MpLW9w&p9;!J(>=08} zD)gt!@%7m#OTENDze^HFdOj0axR_5;gmg0DS^zb zd|uWc`&ITpC3_ZHff}KWem>80$4pE%(|c)6+R_;xWo+2VHup@oHIg4^T>65($h&Qy zy=1$i_;I4p2MF%&%n$LQ$Vz3VIaCfbRz3$Tv_|dt(g&51xbj_s=L$Wxx{(G7I6@`5+i2tWH zn*uijm{**g!grLk$0#P=p8*0iU>C#ggCwehx?P;FjBit~vAF&TId_a<)<2S=Bgogx zMu@_9w%R{tZ8!X8?O%`nodev8;)7Gab}RG8_G3eH=ls{=e>+srqO!MW{`qa+>E~-^ z01LA=Xr`Ex%C#XlvEH|yM~OXlp84I!WHx$Oyk`47(racv4(@zai_h8f>aciC_j|K= zt<~4s#cMbIoXlRk#cQ>T4{(i`d(C~W1_b)8_h)Hbfh4BAR$z@YvZ%Zk-RGn>OJ6JS z(KS{Pz78_Kt5^{c-delPrf_(Ax48Rd*4M!n-d5e}3s z{@%H-c;V;HajV?-U7p3#`8*>~DVfG*q`yKVDx?r${dcJ*%ZTmD&ucim5%pp7AEGad zE&fCFmf_DiIsdEEEdGP=Ux)uG{LkTk3IA*O-@^YM{*Ul~hJVf+%I;rr8xZT)GhaVG z=JT`HHY=~x%l96l`%ARf4sm6Fq(6)Ql?-V{%~l&xVp>oZ75^I^dc^Dv?xMa6E}TW* zcw6NS_7wu4(+1h<{&>Xci_G;ZP>O3`!~&a9xi`~Si?8^MpL08`xh`iJEFL%-kNII` z&h!7iDnLD}NB_iUk4Vdwa=s=1Z=IZsLFh?;4~ttaqO-v?V%1wswoQ7Vm-n?qhkySg601yCboe;=XXa(BGa^QpiM?{=T7Z*(R*saYs42m^DedSYx>K(;PAzh{T%LT z+rfsBJBZsJ!6rTewL7=n&K?-Ll{POjipe;7jG>-=?`LCN`yJyxgZ!FdSUHuc3H;Z_ zb-ba%Z~h+f_v!O@M&#f?y6eSX=D!<@{1Ddu8s2mB@y$tQ{U_m%!aoat68?M4^!&CV z8)Q5GM+7hKJ^kVx#6xvYJMyId(q}s3=hfG8#wgG4Ijr3wVZpDP7Vm_`sec~aD;55H z$8FvCi@~=uCq-qewS1quULrW#=_RDwoM5ni;@0C=X8BX!4Zjoqz3?A~zca1U-wl5d z{+|P{Vy_BDDXKFjBu&LC)}dq!FR%ab2<4)ttNbfZ&ER|B zI#BD5z#5-cNSm{)`p~W0$CDiSVv--fF=+sQYr6e^k8b`yob<;((o;oPk6YsTrhG4A zwz2<%wOga4w2%+eEi`V6S9olQPUH(KoFgb|GOQE&3+-AY(HaajFXl-v*>eo_l zXXzp&H<8oCNo(RF5aZrTm2Ybd?w2aL$16&|a9o^>XG9tQh*yX_OwQKAHOHLt@)~Yt zLJ|(_3uLwlFaSiyb4k1ilcx6-U)ziteJi4!qZf{_kgosFJ6Sw45foC1%%R zHaMIF^c+W5I+~@BY3SrR^Lsu-ns1)xJnqcxn16nQr&R?9?GOa%TL#YLH=~Ju$I~Dj z(0inO^PvlhK@*+X!MUfBdHM6Rqo>I&Qi2?xsa;W zS&iN-8`xhd{Q)nF4U+TS9ccZSiZ*BSMSLteUw*Ep-}m74b)68>MV%xbiDBW_f*+sx z-+ZTtC3uHZRt3)tDxA@tf18$e*3Wo!wCN0tKc5-X@efH%y* zrO}S))+w_^7m)*_O|88SP<%!;SK!4}_Wr2sw7HMpk6%{5R)3%FiV%P4&u@R`X7{r{ zfBeh8{N`tGwm?;$xE_gAO>PqI&6=iGqXY~&e#iMMyks!C)omsZ?y%DsB{jEEO%T5ZxqnSlmbK=#3*3jE9*?a|H*GY<+y~{1G{{XP>YeQ0Cg7A1_qW`I{IeWK@IjY8DRDarPqotjajrG?oAOue8PuC; zk2_FHOy5z-C{YP)-cgHF7#;=V7*!yFY=Ub~i2o^3oUycFnPYP6o@UxQMf!U8J8shi z`XLSdVVoiZLUcC*WjpBUra5)|=UHpr?v9!@6e&lY;~aGCBd*bN@N_fEX;nMko>@!N z0@cgbMB2Lc&T@_$l@~Hggu;EqZq69KwX;j=FkUhmm|UplHKu$KFxOG8%Puq4mF*I9 zov04ZA{?za+SI!k{M`Uw#|qkP_H_+>TZy)weATgQrxA{5!tMh5+rh9*r#9IYslLHc z@4f3ZfI^$hQ-(o-Z>$c&i5GXE;KQ8Ij+h=( zE6ocnex7j7mVk$!*x{yM^PxZUnfXAuk$2l3G1ffCuJvQ)n#hbxU4voAWDNB}dRi+@ z(x5!P(fL~n{b5J!ty>{=;SwMgHpJZscFh_m@&t`c4`G!YXSmY=LZSQgECcqk6-i@J z=qh_U%F(iKxKblRwiQ3VS~~}$im0eML2w*+RIi;qWWeAYh>(xS=L(+Xd?$nbkw39h zAk|N)Vvh7=^6qkug^_eb#l0lZJEPuVF7f$uZtdiA&-Q#PlO5e6%AvhAqF~_=lKxw; zDN4K?XW%gDBI3W|+=3!zztx!i@ewimQr!)Ooe+L%+J5Y}{iI;o_DmWV?lz7X)mhrH zXNT_bBfd*@QRn_%-h!nM%upN^(AZI971tyeZw?ex8SM|IYliHPOyIuG+_RreV^Vba zC?w%VFyHZhj;5oKt)n&%{$68DS^vL5&Dg*|i3~X-8cJ9w?|L!Dl>A*I$FcM=LXk;{ zb%91?muTdjUJnq+c}yLu_*9pKCjmM~R3FFy(1JvnhA}xFz6N(MN&17t45#xmwcnWA zBuUX8`&|;%&E@%SlQ7BdO`CV7s~BhGQ3OLPe1^Qk`|MjHt}NTrKA2lT4_6@-9AT-n zL9Oht*4(2u=7@QY)O5PzITMx%T6E2 z~(Q&{Ffs%Fn$Ci7(`nXoHx& z3Kv|JBq!+P*G|?J!@NN*MdUE3r=;2d-wQW7CuM(V5`=3TQl*m_fhKU=eG8SWRHsJSxEyo?_IggL zIvHmUa}!r8xn+_nkTu#m$sGB00!)>NZ!VYSSwiAlmrr+X#K^p9?M4}xc#YIHIIbwy zcnr3R`IQ#^pgZNg+>dM*9#>-7p@%_By|HU;OCB`>hZm@W-Ig>~dVgf6b=KaY4J!9^ zmNNLRO!86U{BkHk@tmn0ra!z3=b(o4kn?C%vxHQR-chOWTuj8v4(7W85xwRZPpVjW zSK{BQ`RoY#rJ~;o5p*7Mt)`Hs)&*-Dw*vV+Q4^k#Fo3let=#+ATT0^*$}OjKyAtpm zRb&9toe*$rBP3lL6w21(8eZTtN)4&`fj#JKZI22vpQKD)GT`LeAsw2nLwR$AV1A#+ zHSL*C!@n8+t?+M$e<%FA;XerfQTUI;f67^KTi8V%G!Vj)c3)fOBR|3~L*m@slRWl4 zedhq7Cpg>#O4tK+jmvPLxX)(R-JM)C>};))?2vb+0aVVt9)P{*B1Ee3nBja@Q-GA6 zln{|_=}lZ8PjD8uIos{GT#iWgZ6M8t&b=mzh$er)-6NNAZ`U(TwComEMEQhv)aE4B zkqMH&XQA6J!=o}N<42bAYxknqvgfd-udZsb@`O4$Q;q(53ZDC%J)-?lEiz(L5^XUBUXM~Qi>QqKCG z-UW=EH}G>E=!TkM*Y`+~CWFVNi95}3m;K-^{9<``?eRU!;}&n*!;UC2;O4eaV?BMx zyW6;DiD~vEqE^xt2Ngn%gh#0iA?JM55^y4oCtI9)MDIeuGTu@~T8l-!;k?pmZgPfz zWScQky<}2I40(sBU+>fi%!>K%H6U?N<&48IoOezYSdlKN&*S#6pZ1L)6BXiQZrPrL z1(M8SieYdD!?-vJwmAsEgoP<@Zx?T2pX?y|J1AhJ;THCKg8!#S{KQ7ZCgAvWg!lOMx z^zr11Y^uF%>egdc{q{DW^Jzou+4>yIkd0*frC1ooF)iX*9z*4=vXyRoKx*+8$ zpWN4>_)qQqCk0^ite;n0lS^&Hc^j3ZGES->BNkn>vEf#vg`y?j%A!SWbERLKhsRa{ z(U}Lg+OLi4Pj{(b^A^)}ZFa6**Jjx+8yaA&N@7dR+kCS=gZX=!&)o87KbQQF8}%H-Lu7sQLc{@`n5~aq=t?+QrmI0$7m+d(vFq6zG|IV((4C_Ro=W3KVnVtUSWSc( zU9Ol4IZ~VX`eH*Yv94lausna_qkK(w8b{-b^V*u!VEQQ}$Vra&1|GcH=!{3xEn;xF z^&H%>n>)e(WvLw_9GkaAzbsBzX0W)9eF{f{^lF;fZ;9`4y=PLdsYxZ)Gd}5~Qw6k0 zs_^S>G~(qk_AGh_z2*R21~CYybqp5Dn=3Yj8XJCU5j*`@R|{UV5|ehY+a_`;1e48za0NvyaVsWxk2U%gDvJuZ^q&EG**W-JlRDd4 z9P=^FS>jcU&4=reGJKsT?J@RZI4eSx#FvoPJ1XL4C~^;2%PybUUwoD`ZTwS;*4tT} zkaJyTJ21<`8s9BuII1Jt!iI{uWm&;N?)4@~q)gj)Ug0gG8#D?z>$7l$B{umOhU`|K zH_>LyK*b5-4avSx%J66T5jD#!Y1JQ@CW;k8$$~WRRBOR{9WpAxUf94&JTrbk6kiiX zrW+}?9y!h_dsZTbBv*VGQhhZ!s{fJLO;V*K*_ERl89C^cF7c?8?27lL&*TUtEMRg@ z?(Bh$*od-SG?Ud=<4P`MRkr=9ljj6PxOmJKahA^Iey%<59GsKMKNl6i_RLMLK7*s; zU~ytOVB%J3f+RPd5~mHi^F%s^>_){I0Vidxs%PtD2Y z6B)UxlVcyM{AAu|#}vAimC_T*vE*~moJl4xNl0O1=rf5ulEjZl@Z^&@Bt4tqEc=5s ze9VQM(4+cJ*lTit6c}gWEoFkn?hlsF!tipHuC()0tNcctvcuW$*S5}6~CGMpPs)HENps~ zGm~+SP^-{{^DN33U8iiTI-{R3hB$zEA z(bD;87OQ7hq3GpN63{pwgnjB2PXVWHy79@~*!hyxor`mGq9oCdlDfFKqHAfu9l zB`66usv~UXIrZw;)_irQ@@&L7_htoXwpweJ>f)QHl4&_~oJ-V7d;CARD zf1uosr%<#(eX{*WK?~}ZwPVM1usufF*12p;GIkEY&@MJry>eQH*(Rd)YNuODt`P!k z$Ai^Y)9D}!@l-f22ZYhIVKEv*u@=6sJJ;^+QGGQ%30NiO+SrP1dyv3i6HrN3q)$Xe zhnFuF6UE+D>#LvPs7T&u#D<#o_D9iBVJt8-1gq9bVgQm3Q6a;DvuuEQkbG|JYpcT$ zRew6Oy(R)sSg-9&>r4i9j#vp7DexH?Rnx1aaLDJRCFp0WHXPImKAT#OOBeYlgNsO1 z$=_^#jv=3d-Y@1I2zxwaYMu$G#5tY4VVlrXGv ztyFG%Gn=h)mehWB$G0lxC~9FD?W56VDtoOF7kG`+k$d#kIPv6bVTg^2PKis&%4-{h7?*4NMcxmR>j z;CtR3;f!Yd#wdPeIcRsRYBrpv!FLSyCOn-TV?xn?p&>IC6lYdse4hcOxyXhVgU{;6>Ldwe5kWL~@;I4?ahJFs zi7-#!gwM#^8rTro;qgrBH+APD#BwFWWOvNhF=s+_ZI-TbJxT<_K+fPXK*CqC!AN^hs%Z!)TcOUD>> ziKy6C{qQl|TKyxTe5lJ6g-yc#(eoyB+L{d)-QaOwR zI~~>*8yX4tzEp*4+A7VnyUlN;oSRRIeCZ&V0$Zur((2sK&#CyqvCEag+iFEc`i^1L zpIU?(1}ig+W&Xf9ST=IxiQ-*mxh9maAr+rw7s2#MbA}UyP++9bK-bYuyO%=A&&S;Nz;~is4JGB;|R0 zuJr~gFEmrz*Wuz{Gh6YvR@&rY6x6nFla93ajxy+bMcsI(mE*pODi(W>`9+Fi@w0c; za+&zRKHu9s-Zm9B3!i`z3~}2cD%qk#`{|2h{*fzl8{O9@10FzXsT8`UBEd#;k!%F0 z!M+L4?@t@7KVztV?EMjKp+e>66Z-@Gu}Yi?vH?U-M!Ya4CJo%cv<{2UvHHKI&(%uS zgb)cr^jQbYSa>Zy6Omw%HMAIn7bt^5F(lkgco!I{w+`}|4K&41r_Us0wC7ElLB0Zi zB5-`4F!y%wv)ld`pCs#J;xTdF1Dm5!LlQnRaSr%4d(K8$m#6j8x<0L6$+Z+y>(Wy& z*BN7xp7ZVNM$|re)Kz%GTs$;Wi!od?Tl=TZXce9?&-afn*W6^jEaJ}lOX26#hbWgf zM-_mF`=x}o=tDWDuO>ssb?H5;C0j|8M_imRh5l03 zWUcv~5CqaNcm4J@pE4J#p#0yt764X2slUg*x%UFvJNCO{?-12?ZtS;#(}&$YdbiLD z*@ya5xjoVuhs96O}A zYzv>ApN1RgK8@SlQM}65u}asBeb^Tkjh-?6n34PZ!f`L(m9d|!21cK&^q%4fZG2CQ zx$Y#VvMHAFj&6j!o9i;DILBa@m=a%HV9U490ICvs}Q?{{=|Qag^An6lRbexavvrI-KT>F4|R_VeCeN)NAG^ARqr3*9@HU3>EU)vo&L z+8ybl7*}jZ?c)>Yu6}gy?(bWCp?=NJ^Y!QWijFZ~@8y0idd1k9wx0LQRIs1dCklB! z5>u{T@{B%8>Wx<|q(7lAa6bFToX_!r11etLXZCAzy<`*T_jPjPNqfxq>ft>$To7b# zm)RbBri{4u29UL@u9p(eIFAqPs^UDZcWQPbmDBv`@*!R=AI571#CsR}Q}o8KU43B} zm1}l|jCz)Q@@w>j9W>s14W7OZ9U{J@jC$d|^)KDGC*Or%gPdw!MowL;GZ_5m*R3A8s!^f3X&OC;6{g19|j2d+dluKU>Gy z%xwK@?EL$^5HD@#Kel((pOKv(Usku7-`dZRckw0l8#~}XIeK6$?C2lA9$2I?{{-ka z=fWoZap*Va@FMp6<`I4ll}y*3{U`66&DHBPTNoNE`c3td zqJI_#`^Tg2ou7M-pQqorgZyW$-<)4Ye#EQo>POzt&ypYUCFRF6&&!L-vuD}WFC;&j zpOE=@_C5Rp^I-@0$0NU@<+T49%a0hId9Q9BqaS{)c5=K*9~-W7ivQT2|5Q8qYFT-| zq5NYR_jB&g=Z^dQV|p$Q-p%TB^{M`eduD~5Jz@ECe&Fn3oR&Ib1oHTk7FAz2Zws z+3}9BY%3ei$jQ=;BvM9UyB0ht!;}=HctWyO3=pt3F=mAj^o@+$Y5-5^>{!o~yT{{| zpyr7&J}{S4zdzk=4|Twtc@mCF5rZpZ-YIaHKFqZ$jRjSKeN3MPs7t5yD#-ipYeOnh4n; zX*UyA6V;j^mn_-@E&&k64PShF;3^2N&Z!-^pCG1ceWDwGJ!|vm+T7mLX2B+TF6zg- zTtCdU!@xG`IXk;j#!e<8IMK#EDNg5D@>GS0T@@wiIHL@pKFd}5Db-XA@1_>8%mAH0 zzZ463+dF7eYPJs1Rq9jfrIyeSsW$wE)C#W{=Xv*nhY$f!Rl71pq?orrDdH~TXQH^N zv|o>Hvr!fSDoPecfg!P+gB+%tRZyjhQD+`cp!|9q9s@Uogc_u1hXLyg`J7Qy1p^CA zv&zrJ<(w)ytTwt%!mPR_?p21V%avTf-l-ff9x|~#K30}9LM~x|`~z6B7{S`fzbxxN zlIImw`N+ks>HLner_aIgae*hJC}wk>z}I<~6Ho(i{$ua4!AU9$K4>LWFAf8Djkk;L zev-;4r80pG$GWIH4&xhqh`1+@Jg;d4oGnwqG4F=lHx=Wset-<;9nci|%2D}7s-*(c zL10b}Saz|icOJJ8NfR2e}ia>OrBecTcQ+QBNCA+hqk35d5U7zvOFL!dQOikD9i z*#zAI?s}?sMcaaGcI4ZA7exZ?u(Jm(`V9)yR1u;!L?qyck-zQRe?x6*JrFaO0wTWO zqFFgMQ5lPPLI%O;87MxZIFkW)DeECUO4PM1mG){-I6$NQt33+d7!0{D_&LALdo-ec zJoYm0RT2Ul-0?LLFmvcA@#k|=`1I+IfwH(`=s!l{vz8hm;o$KOqBIbu8gMBX!r1sr zaL&Fd`mcOb+Dm2!j5G7YY?#mHgkuG)X|Lso<#?s zvD?U+^%W}`Qk%}OJ|s|DhBgN7E3Mk9JmvEQ5=TP8U~r6}6ww4sitC+djQl)wY&9qy z4lwBUKtYhQsk87PMW%-t2oqG0U{0u$%KH>&=%YNl&_q4rB3r<{Wqer`#$qLbpI8&C2xZgRp2R6C`UmxEBa%ezHe;P6Fyv6L+zq<>z)p4m8XSlz_(0qd zsV5CYWSH>lzA-CWS7qD7))$h7Xr!1G)r2;@!%QC1{))hf0T1q0s3R-Jpc&H*b&4+& zXFG$-nrvsWNF!zgMUtp91m_iD4>d`qgk_xWuUtt5s9wH5e0zLP8vq}-sMYU61P5V9 zw@9ezW*(B;bA0pdwzHcx_Sj>}XGPm<0LV!#+C%R8NVpVkJ*nq!%;QpMSeYFSev@d| zKJM2ln4e7i42ZLg-?jt4_<}kBk=OLfuzH2fMA2IOl*}6G6zDxG&D9a^a z33rZ0iS|J4O-#B!{)$1-FExsk=gU`d&3Ss)$Q~5H>CrC>Xe{PJ(=$bRHU> zhn-f!@|}$?&{cX0H>lz*_4Lk=4h(z*#5Gz5%O^it0`Tmd%x?@mu|W=6mT-JMFovzH z-Dd(Vg|!2cFYgHK)f2Bd?vpliknPpFIH*P?w-wp=aysfzDXWsH=Gv=Vi6mq#;$U&vwjEHy6~|$JWL?j390JF{oFa87CkYt z@40>1`yxE0%ytw~$ikPm5kC+4xf#?h^&AEzO1O5unCI_>+X2V1!cY{IawDM7eQxd>aspG_ARD+iS90 zBy)j*3&;n-{TV{RZ@wmbGD7@ZMvP8A)MO)+XX|#7)@X;AYL&AV?FCC3D`Y2B-z<4Nl13dQaHwGB5JSKUs}uOY!NXKW=297J z8gX;*6KY^~lzRbjrj2-Y8553fj$J3t(TZuwWxGdkUkOMlwU=%FI{5uAaXsf-X~mC zx(Xp9%pBCYw=Q~N;i-kT|C&g67dT*88mp{);=A>VY1{MlgD0U{fl&_V0 z9N1*0=zQ0ea$HxbD^_Z8&zZj9_}k{W2G+(oEQ9HFU^El<#{gw-anJ1?gNe$eAU9p5 zXgx9+#D-mPv`{=@%dsy{ltUh7M0(WcoquU{b*BAUhg8bkkCkiWP;jfbpEndjJamej zG?cu(4Jo53iG*RaS;2{0TgUCC`ztArP9f)@{~*$Q+!-%T9h`Vmkykn&QZBB7G&iya>VZAus1D02GC z@;sWR{&s5VOV-qf4}J)3PE~c1q6;}%oTGsRR}=2ij4NbwaF{zB+1@#f9D2oE3YFn~ zjZS>c@ROwN=;M<;yqi#u`0hXUmC%iPAZ56D>QEeJf9ah0Ne)~31HLOeU~KcQfl)=_ zh6dqy*T>IsSIl~ef3u!W^AJ(q){46-1fmDlXw za8f15z!dq}Q>A171GBs(1Zb9PHLkqOx6|T1`A(vkjlO3DGfQNOri$m6+Ig+-BDI^< zy9!p$iM<%7P&*$aw>^FCz?{WoB9Rl9LxDAs@{(-fT&bK%Rgpg^8cz=VfQ>T5CFAyy zgrOVdr(5u7b}L^6t7^%x8q5C^eAimr1&-2N$I&@|*1q2^{w;Vs=U>(8UsGE2&z-&Z z@9n3~h3{wU_+AS})V2P3J%7$C8?9?a=QL0La=#*zrIG%bW+@w#!peqcXq5BzG}zbfl1^3dwE$h^9+Kv(s1zA~5kyuM=B_1mrCvcJe4iU!UlP8pSCM&=KH&pQ_DUT`)1yiN1U1CJ@a+x z#$EPne$$Tgd-jU^|C-z8@i)yvs+9c;*Z1w=+vQ=&a-Wo0?DebGF0SnHav#m*z@>fE zy!bvU<=>@!wAROBCwY1J;Q8OIXxdw7wW}7u^_q9PApI~4;aU1rTwS+^cTjan9?W*r zP_E@8^v>mux_pDK++@pr^uV+4lSU6qqQ%a!WBx?@BVIgFk6DqK1>%?E5%x#7Dw!|c z@P&rGxa+T#$?ZMT<#IpnyH&?kZMx{#6??=>y>%%w@6W1)S?XJlzPs1;p0&GsRo5x{ zV50wey}Mi4A?>}o&FT(W=rh-?MR)H^tZBR#?!Wo?uXygI(LX$LFD1vNopGhCh*xQs z_usyAd9iW_+oU`}hq`S|w};iF&I2QO)33|Iys4>#owKFYJ^j+ZC53+I`WJmD}){a%{OP9+K?KTmR|$ zPIoclc$Ia3$+my=9k;IkUE^)IJR6VqgDrdU&}>|as6Ec-ymmUft0NefqbsY2<4Je^ z{kQEE7Tvm9{AhX6Ud$92ud-U2%eqibQ%sac^NN|{xr&TyxhdftnZLjd;aZbdl<|U$ zBB_1HS|w&kZnzdpD^YTWSdT379k^zrtM=1uazdSmsB_b5L;*jD+O})A^NmV|rljO1 z&63jUxzQoqaP8Q#zd47v2aPF{I_{2f`fsgN;;8!sEKg4L5o%`5r}O>&2)R&{o9r5; z%D2=Yomgo`0*8&412ona|SA zay>^`!$`%DXPlzN3M>D1(o%mnAD?kOQnA`pLUCNI{;|JJe)&g9e#KU}4N_J-`iJ5t zj-5X%~Q0Dt%&Ra`~tMlU~7&=qisIXr@ZE1egPG~U9*39?yFAxVMD%SH^`yyUG zY$>_J)`q)~*3KH*{#f!3kL#zcMpjpO-l9;hy8}mgwzo33*kdxk51zN_cgjY4;Jlqe zL|AUN3jVkS%Ri<5e73S47f)Nd@2GvXvQ~c8R_8$0?ZI=_A3w`W`OrC&`orbox*cE5 z=HPRWc<}HklRjKJXE%8ErGpl9E=rk06>eY4eyCHrcRR>ju)Nt^Eqx!@4|Tdv@UG6m z*S8;Pl+!-6A9xOOrN+z1+}EoFALq2oX{f&-nv2?IKDUAykn^d3F8r%j6C?n4XpRV{r(1%s1iB3Y zH%8eJDaf>uffGLKr@6sVyT_N)0_h7*M^96y^<{4U{B=pzuuXe@e639UOVO3=+i2 zRC<@^xMEa8Mk7oP5v~el>71hv=5hta%L}me4%n|dokOj~=&-9Z3Yb-nY0`U4f}tgO z;l_7P=%j{`Kzop$x8K>c@sm5P^pHB{Zu+$f$(Sr`Y0gHgZY8Ajh|yz@H0dUVFT$@* zqVUko#)o>;m2n>3Tu?>gV%){p! z+NUx)-|3TujoNuY5CO^}uE@aFvCg07axfS~${5BllZb{tC~+qpkuZQ0k_^?NMaLno zL#l&3JfTFd3a%ED_W35aykD+pzlZpZZn>zBV=8WNAbml8$9z_6)|XR+`lYWCUZA~J z6UY-o1ukE^vpFZ6ptU*QK7GzB45zq+V7r^`BWOa8^EKS073(Kz+pgWm_!_v?`F&jW zS5aM7?_(f=&E_QUzpqj?zmbdn?l0WNg40N&~mYmr(&+S=iKH>e>W>9FJ?7!nxRx4 zJW=#!VhFf-i~eqSFBY?}E!V|_LlLO`G>bh@p9oLj#;_o!@z&GV?esP1P+M%;{Qj)4 zoV9+u#T?be`&DVHxcxQ&6Ch);;hkrcUbF6VB8>y>=2q!_Cx^!s;y`L6-zmAJfm@(` zIuNQMeV#sz6J6)eWSBQUKG`u2l^p{N&57L7H^JdWQw8#Iw`VPjFx{g*!L*XRNm{=- zXk2)H?w6nsp&fhrjd0aqzNY63Rx#Dk=J)ewGRA}**1X6!jwfqO)8}c9ZW2bzAMUij zgc2jAuX((8y#C2m^+SKl=qzFxoJ2vyeR*SmC))K8@3KczF($Ts{+%#e>9y$=mi5us z_;VQ_a?G3px4>eVp3bw|0+}k$V@=kEt|Gl_U#vqbSQ%8G8%dLwy}}?eN$PS5nAY}W zhj)ln;`5g4eHE90VB`SOo8LXnjMEt-AZ4MN)=97k>CSx3c#r@h&7Wpbb1Vc7ROU%S zD1^Hpt*dyTisdRxp&JH?l+z*5Xx#U#K~>3+dg$irqcRel70e?UCarK0(C3@`KCjs0 z5dyLJe9ZdE$Q~`ihs&!Ofhd#Z`Y8e0M$cILh%;6kv5KC>5^~xX85LAVJ39`5+h<5AV;|_X3tcpapD4 zqkXTv~abGWv zD?Rl+qp$U@y(;_M1}H~-OI52H!Aig7PSo>7XY`FgBGI{G$;B2f;gs=5+w@MWzQGSb zn1nqcN`7d=ZpCb&l@I=3(p5LXI&+@?rZX z_bRZ3MOK)q6bgetm$6;Kc!JXE!ukwf#meP+&5%4?8%+QfK~^9#XHAPS5JTMc%DsX@;)!` z*^$4F0mPYdmTs~fV9$uuKO>^t8q&(M@z>^9nBw_Ak_xN=8 zRe3B~w{n~;P*m}~X1r{_i`XFIp0hF``rHkzTc|yj<)=V@Q_raV+@kFb^uF>L=5-cj zWAKHG0f|UeF$PA@!7<4zY;7_x!b$BR{TyS$I8@MD)JR6kBHY9(2(DVj!7bOMRvxdY z+daQGa?Z_#_cp=a%UnI=(|OCR2|%|$h;q7RKQrfETzIWvkG_!bB>DgPU+XfGaw->i zTFY=294OX{4%#<}8IjZ7%HQIAZN&u&n4j{uv5e?Qmy-7mRkRNXtGVUA-7vn`N8uA< zgy^^8Eu|jSG(*x4x{s4`E(s`{yHINbMLID)_9+0guhM;8=RHQ50d61H&hk@jgY;|n zIcV_tvo&;sJ)JB6S;g*$9hY|r_K;u&lI?Y-JyRu;y)9*RaW-8(?*vy_@gcRGj4E@! zG{yUci;fYHh?;d|IIjeJx(uu-xHee9o$2focVV5#G*Okq`Y*V;*iH)D4hE*{%Z;9(G+p}kwHh5@(**f@wtjY$N! z#MdKb37VaG)YwCvT=d19wn6SG+9!fyNOL2y&H!1Vii;fO&#;dvzc=5LauzB8{9+CB zs#emzj51@b0+o2sb9V+t_9^FGiZ6{kAlXCB9T^Gn>_+`vL-vMbTamqJEW!H2^xtu& zUgY<(8$fQ^``>$Z?`=sd=%)8}<$EJQJJELK+J5N$)2fKBj~MKh_GY%D$6%n(sSUPZ z6=jX4M*KIdMU$-#zCltGYxzLD%K)$W9CnEFFt|TMnr*>cMw_w?E`m(k{vECIO%UlP zn6c9?`HZ|;=_^7@8w7l|1}z&1rgDF|jW&7Qcy1=2Mk3(hW*BSLQW=>q@#bC1ypK2R zul)>Goy?asmG4sGVwAsQF0=QI;=Jr<%CjUl#*ditg1|_l(^(WIUJxyH^+tstP01nb z;nR7ncjUF0=Idv|U*H>!f&EmqWH`z*yD=o$gnavyVi^=`V$ z`6g!z3n!dSSn`VJqo4hpCZ83Y$$&MWzxe)`blJbO&0&Q3c;D+VNSYj#p^Rui-H_W}Vn>wP1 z{$#rMA2C%|w}A&b>#E``2+IE`KJ+0#pE+f`d9o`iQMp2M%7-h z5-Y=nXTCwoi?3B*=j?j&h0_-kfid)J6s|q>FKiD6#4e#shfn&3z51G8BQE7>U{#W= zA#BA;gGt)Gz<(;m~1OYHZ_*$;8IuXw`)hP03x+jwW4> z8MBh?*p0W<%(D`42SMlOY6a-h4f(4p$xk7HEsh1QNq}s!fFG7r*lz~OwWQmKxJa_s zFU#l2M$Z#~b%0KPWW0Q~EyT(@aHhqUc&i#qvKWQ+EQX;761t3*U``Q$KaNrfkzkV< zckh0;h0foBo0YjHYttaXx>o?~4s@FZ_RXo^fY_D#nWrH3lvUK%-b-LtKcg(yqO#?^ zU9*3H?Oq0Z$A1soN}=7)3{L9hZ4Tq4O7UjdMaa5dWl0)(y7?w_3_EAr(*5mzrBaG_%LQPfvT#A=D-$K?D1y*(X%6Ag;g`B_|C`m}N z+*v;z(gG04q=9I0Q(MU`?^fciDFEN!R0i~fou zBq@J&C_Nz2bZy7GCNcOeYXx*Sfif5zxa1 z*GCoaf?Bd*!Ri^sKPX|o7_4qhytptfO730`quWZ!KideCFeNR0{_R{54urfBwrZW!o<9X4Ws_4I>?k}pAO-cGp`_YI5zRrdH+## z-e}97Q&%eD0q}W~hp#nWbHoH#+ROKz{e54E{#1oBsOsWGO_3~|)uil84ir0i4Q7&E zxAT4$=fV=II&vAAZ<&0hU}8~D0y@n-PE_ADsj?tR?yxUa>v?w!zQxeq~yctb2b~ve&?e4kRaR@T7||IC7XM zfx&40-@LS&NJssKZKO}9F}$7n|LyQM!ru&kJN$0=z3}_t2jTC9KMemM{89MNfoxBg zuyIJUrpo?=4Qy%2Vv_IM+3yjy_C|i^&wXC;TO%eV|GC}q?~1W8+>#+b8wwpUlY*4rXKzU*)+7dV6Hz#W# zN8tZj`1SCe5Z;nKvPIqYR(QZ?GuX|(yVrM;Ay?C00}K%+gzuXlF%GD&mSy z$_S(KEh$H?1x6A(_&J~I@$$1)r(dfxL4Bz;dYr}2-|y&&bW3a&zT8H zn2i0bj-kqo+sX)LRN&(Dk=A$i@!<%e0LIQBZ%5co^(cPj&UkAo?uqAO459<>Wdn6y z2PF0#^h(K&V(>1nI(QDUtSj_%PNW>DgZFM5I|S_M8Jc_p;UlqmDg#g-QWeBwMo*l2 zTT$%--5opCt8%8`x5IBtw+Q@ZVl1)uPLu|@6D7kVpA+)v5zj4q7W3|Cac169?Lg_d zKZR6Yk7v&i1b)b}V35n3`8_B2;RiHEa4siMGH2s3s2e`>)r{%AeCD@^SbRZuI|15dU^iJSyS&hj$<-~-uY3<3{=5N3ay|k z%2J99tAbQjiu2!6%_3%FP!CNEjc9Ak-+h<2*9Up+F(18pN`FOlqu&g_eQ8G4R^R4; zBV229@%Hju_-!Bqm225gL>;_RIiCl9rJ2n@1-_mpS;kqSNq9db-T&WQj{f5AzjsG$ z+~_IR2MczCSy-Ndm5oruyu#h#C8kx%3th(V7==5WgeWPlF zqE*La0nx^**qIkG-6csTM3Tv!3($mz$8$Wmf0A^}Ri+er5+4*t5w=_unfJgno|Y@t zcDhZO_)!cs3W-+m6^|A>9UXn3Zsa=(W;EP=8&AS`g5i_q{El0x$^9Hwj_g*_BcY7`BvO_nFIw&oWnPGRt959BvDCidqx7`8!qW zG?i`k#~YFhcvrrG+{X{Pes^gH42gufg9ApHIC55qqS z|2TXZ{%QDU$XO&mZVNqMw0g=f076Bcr2XP`V!Gq|>d<{AI%mGm_u?gSS+@~wMetO2 zw6`X0FSj!DvAve0l-D})9|g60r`P_a{{4L>jC_r3@$`S?KYlR1{4cPAe-3Z`AwIpK z=>9)fb&(P5GNeJ)GJcdXS^OG;-59}T+1B>g3Q;U!cpkCMqY`q$y(h(6#`EWL73o%K zgXhxD=}A1L(N!7{78BQWh)fR%gG-TfGP51>l~Xmf#^pBeyMEH$$sgJ~)Br@aq|)Ia zT(U=pGZ7t}LypU-x_u*OnnwN3>Wo{w15rCAZBOdI(_p5Vf`irF-)4R5t)NVBWig#^ zi;@Cm((0^=Z1}0GEoWBkZdJ5KE!aY~01O`157C#=)Cy-}#N-nZM|H+2e(gE^R3QG? zpALU9{9O3g!Y_qi4*z=iHzeC_vV=Lej);xv021Z8{N#?-mT8Z1KwhUmP47=n`%~We zf0|wiulSGThZ@lr9U2R>TU;}oc#?9i3v5gI0oU!25Ufs&b$*^6NO6r%sUAdRFO%xh zU?dwtq9!UMdOGclb2I(5hR44puLS)xz3@I_y6OLsyF&bZlt7_=F+QnGV=dL|tR7`$ zz15nU%4`MRT8%i^2Dn)hSdP^{NdB{%M0&y(ux5!j7{P6lfWRD-9Q}jrv-~gih6AHa z)fz7lkG~l5&IwxCF)cPF7Z9HvcRc5`B@qgR{R;2_evGnP|){#Ri$-l>1t zIE4F%%9ywV2fTdmIQKHTuqAxyq+I?~-U$>3^)oe4#$*G;$LWv%lE2k~{~Fl`nHV7g z-cJJSW1%frwEjJo;UdiDqsGZ&(l{@bBa<9^O;Lr8=M& z7v)fNk6hp=Zc8>jk+4akC)Y!oJ8}yj7^{>M4mX+^W{wSC$UGKsPQkeVtPtD^ zZL*TPsC^U3z_~N56ZZIR_-K}BVL2QVzo3ADg>nIyMo=^v=Guo5=!EloMuutxR)BV2PwGjJ2Ew!KBISaNZ7sj%Cb z@88+YvufGw4X6+NZjJ;jSOMi)JcpIcZOJRFLUey0r3xP|8m?!jyiSSa{-Pqqv5@WA zSBY)Of`ZBmB0?mB79oevyh;jDBR2y-y+WGDi8o}8{5Eznn%&2_yPF;dVTaof)qfhC z5?5A}M%|A(`jcW5`SxT#@F-c&T4`@6E8vEpHT0oQn)kTlgnw64n#CjESGbuQ*)WEw*`hrCI#sguktY+P*pPNhwt=oNKzbxj?UXF!6N*o!~?ZSDVvZvq##VL zIEn-U(gq5z(xY1BpYuM>66}P0@?=*$JzTuF(b6`l)JJkOsXw34d~T6C=nI3n2xd$9 ztW(c;yrGCh-_Qg?U{s{*p^O1L{lp2EZv5Yzq`|KUKKIJwR%e2HU~_RwMK_jH!f;ki zz?767E9NBUv4 znXNrp&$DsL-EB)>g)|@G7-Z$6j;|OU*9AcJ?__i^##>olPE#5Lw6D@}`BC|%)<@ z!z&-YK0?T(HuvWhXTx{!v6Cf9ZB*IDOLFVwXIDCwz?dbJm$w&8kg4N){xm>HM#xA= zt~@t_0nE?-P@b%(wU2fR8!|FA14N$NSU%w4hezH3RAvwf=P zi_817ea^eI5fQAH0}f}U`-taTCOdvF7{(*R|Q`o8KGm;JA&+2e;N4CLqj{Du9+rGA)Ph2wTi$nvX_02Zz=}Jzimx2^sNm{`eq?a1%r?JC! zJ|&sw>_EmGaN82yu^AwoK@zlF!8xGqR*U&;>@2sV_IXpbDs8&<&aS7lE4iU*?qm;q z!Z?*(Idzof#1q=kK^bit*-0-OyvA&vkVBGO|F+z}&i|7hR$7JQ`Z$s-%V$>lSyPR06#HKyVBD0ks5Gd-%;{6Fa(@UzFKQln5uls7 zKC-0C4y#*r&nc9Fb6AN|C1WR#XWcdlrxS6IzldVsS31ik)Na$ zp+2T^T1jLy0hh59SLmc>msO~#LLZ6!`4B|lpCsgVx6THxpeS& zDBgI}6l{mo2bbsc+KuJVog zSwVQ$WudB5g)A(D7(&@9$0{o1rrZY2M%2t8IjsmZOaKvMyI&1}p!Wu?JrIVgVgt!~cIxImId5gqvjtsBWCiW70ox(6ZUSvUyz=cQH1 zGj(eP=uxt)q9Mk)l_?8|BpRkrx&tCzr%;}gPYv%%y>jk&$W51z(v8*LNDh}?c`!C4 zO5zk)dbg`9mwN}bDXKLxUV}%n;^5LKN|QLoE5#}y`;V|66ju(Y4@0ty$+LwIHRfDv zUtUXZj+(a+6?1aXq)Y?-IgH+3* zdKoy`i#g|HWySCIxGmg<=yS)*ZODD=`~F&HK`e!cqf~2w9d=kHJXb@37a-%`@XFfTiHYKKib&0e1dozq7S81}U-2$9u3LE? zCuJ7zRe#h`Y%4}MRWKZh$+Esze0C$Vvfa(rcaUm$SsQ>g$od+l1p7K%xWetPDsiBR z>;AHVf{@2-pS{*o2M&_6;*hYV+eqMM?K8Be^@MV15rB-yU&UB{ypG6=>^#B*>kPVv z;%nno-%2GOVLn-vUqmfx4ZoQ0mp?PM&*6DK0jo9ubD8~2Jb(Hu+9u~90IWQBnKv^Q z&w3;H?Ciog>Q6i$$@w3+?+A;?u`_>i(Vkk(nxVVaUMz7rtJ%3}Wd`}gQ1oZ9$7P27 z>~fBh@)`w^0nyBngRrMo8V?uUHB#XtpJv$u%DwS{&KHlcH+=1kc1FjaMR0WWjF=O# zt2iU8nPHJuu%_5C;pE>dzfX0SR)YBuN?G^eqW-k2XD)D8e(B}Tb)RLMfu-Eyeh|f5 zZoEQyopEa)^CLr$E=;S`NBK0FUF{2(n{7{?$Uu`Uzeu4y`8Gpy# zvdR5j8H4!|OS-Ud0XNNjZ(T3<{}@C_i#Lp>zU-$W5!()~frXZqcMY`uHvH;JOcqSylsHV;3o^j>p*hRb|uf&=_!fu)yo1drA!UUXvLQwZawFVMb4>Sj;*vhIoY=6p`5i57cKCdyF_ATRkX$mtm{?W^2#vI5#Z)M6Q6)g zUWEk~XytU;H@a(hXNwl@c8|!>vy_{jL$q2I!@#M7;^T*?+8Ng#pkkeYbqkr!)(YcO zNd28;aNC*}{HT}yx418&w9{+bJBK-kwo4>@J;Te^BcoFY=Tp|GSm7kp1i^|>%mj;c zm{q#nA^&?9fwfm@VThL^xVai-f#E`Z4G^44j4hF+%$A0oXbv%UL+3ne10-R9%v3Q4 z=NViHplLUs5{oJSd? zJ+u^ls5mpf`6vYkZCET~xpWsDW`&)i|~8oHe54b|TM0%om0Dk2is z(z=Xb!6eC*QJmlD&}0R8EjcjKLZ1+*RjuWwgaG5-{+RHyJ_mXeVElm3q?yWl$H&)c zHB3P(kX#M3)Z7h5e~0=}!D(qYPnzOt;FH?#^jy$6=>#DlM>`IXNBs^!T6LOhPotq9 z8N6srT5@4!hPV4ao@%r_>2P7LvGqsS*o#-W+E6KB2M92|z~iA(yXBk|$|1{ld**6ta?DIto$!REmUF9+hY_`wTPvHOeYYvF z=B&1~O3^33d%Sl6h#s{nzIX$Rf(jV1!2S}4JrB*mBGR!YM+#WoA4xJ86DbFj%4)C<^erM&@VnRUOxF2-?%cl)KZqiF-Ezqc%rL z4Vf7ip1&trnPfvtN6SD{h8hcr@-koS3A6>I#`{9=q+Ff zwn_vi>8T3YMfb$0u7f~ph#+^VYc8&&JPBJnC!!7Y*e}qCTH6(JO%2X$VzO1I^Ud+N zWXljgqU=+rjsD_c&5CgOR0pXXJ#DDKR|YelRWy5O9S_Ar~JKA}A>bJndC5 zEP`Oi&FQ?2)&U)r0z@z`CF_on9Ox@aCPot^i-O8840k7bU=Xq9XSxaRr|v<4)2WoX zU&Kh};+j|)RibDeU*)jVU50TloIf3Sd?IJZV_Ln*TtUR&D zox?L>Tur@wj<75uP=cz$rtrusV_8vJj6N3ltA)IvjFt!xKs(MeNo*cW&7L z!9h#F7Ci{a*$vLe<~>D%MVOy3cu?2~r>uNYg7|wX6TacFeyNT>Zk>3NR0(wu?T-7M z1Ia&dommImn{3X%6G6I?A^2Z+Y)&OtIB zy3O>H;u32~uji5jh2Z&cJ~vkAiNG~I3wX%b$_ zWV=b_a=BcJq9}@{Xo{w2il!)vvT2&8k;VrRVT$-5BI1LHEk20&AR^*}h=_=Y_?HOw ziy*ety%Bq@?V4l!#>bp%u6<5qH$L=D&W(t3&R%PNj5+4`{QU+84<8+uuXF)eO$n&a zEl#lL#do?Fb)Vw$_7k|9+=n@jH!}z#lm)x)OCD%qs~~8oa190fiSbGWFpttYT@(O?uRRZpJuK zlR`;(lQm}u7fq*e*urkt;O`MhnNp-EZyGdpXW%3f*+`0l??o^sbDn=c2u4+&0#r_89kK|7|7jQU=wJ#ViLA$5aQBmds%y!hG z&|c3DY>6o33hI5vQ8y zuETMqv2d?MjbCwo*z}bk0V|+mub_dN46xYSn2gIk>KWMy!50zM%{WZ*SP(7r71b)7Yg(dY>)&5XIiB#b_M=N9&|04*G@BW0UUefst4@27TgV`A_#fPZ0 zK!_**1M-@=_D;_s>grod1r>hI)wC+UC_d{x4i<+u{T;n7#8!5YC= z6k?SKXw+H2NN&{i&H;vA^~|?&H}VS@-fc~_CUg+*IMa80l8lt~3HnfjMmvPz{T4P8 z@Ro}PM~^4{;Y)$p>bSS2w^*{Ts6xxoTwsmn*)wc2**xD^T;a(*y~4FUW1SiGh9RgA zyJZkvxP>|}Spp{cAkwUIFdNG~)UVXhkY7tDK=Vu|20YBWJV@|SL7pRsbZ!7g61SD_ zQ^LA`TUe*CiRl!5*IkZ2eKt9uwoV@@IKymbCvX%=)rV_Q+nt~IbRIiHAy2-7H!?bJ zN6lMsrI5ExJ>!KlTeD_+tTF}~O!GR?Cq3ku%$dkBD%9?9Asg53aP7rIsB14C6Z2ya z!Sh!yZ>1FqN%@tCS%I%kiD71jM)Xpj#A@q&Zc%Sq;=f{D2S#V9tiZlXt&Powe2g3d zcnHO~c$ML-&MNHrgV!QY@emxFIX=6$xsC2I$xjpf5P0S%nRLOiM)P=A&cv^RpVjPE z#Le&;ba8AwA8-bCV1c*X{ehS-3sABsP4-DM%Ulb<`-x|rq&J|98V=gd>mDbFi2Sr* zGBvmwH>(HY;NM^^pC*@=cZsZQ_8;x8IX~<-H#^&3f#NDXD-Iw^5xG+ z4A$3f6gckabfNargXK8tF*s>-@9q8HF$OQ8xAhoc!9iB%%D0l0*xr|CMnT#V`yz)h zrqw8>WNbWgAb(x0$E>4yP(SL;Vn6@Xa+Cr<2#@jtstL6$qpP^+nVWL?Ic#gdtA~Oz zp`=7b@?Ue55pXZ1PeH~Q8)p(_^kd#r29eRrWy~ibWFZFeA2af#+;J}(x&tm;e6N3Y2HqI)6^Jj|i;o4_q5He@&-d*A#Z!?*=FUBI zd0dWrLA^813FHI2pll7o{Ug;m2s_HThCGOO)O;UKlksex-^U~2WA5pE7b7TUWyL`l z$4AdPz*#B;7{^<3dn{f`V>})>f;(oUhwxObh8}M9w57hG7*A9`mRIK*3=`1SNKhMF zBRUG&hXlGtH?GwV8Oh?LMc?IaeGFw-UUuz4>j3(Kr##!|$FjfkJ&1lY;weRliA(Mp zhEOzpO6FVcsSM})Yv>^!4|{f#q{4MgWDLTDTXht?k4NXi>6=)pS?4_->B&u{#|Jv6R_aeJuKNGLT37LE)gp*K*0N6$#kKIBESj+}$R4zP_ z#6%5)eWczW#b4|hS6k3Sk43-8@zSc?cl|)?8vdI?HT6YjiS!)Yh$;Sov^k>?MKpB{ zaGxaC@lf^W; zT)A4JH>y2%!(X}TQsW;JHA`5Lf1iAwqWqKZUCX7u1CuUQay^|u0CO@9(0nR9YwiK4 zxB1^azAJT_a?3=YU*G&+$>;2YDm`FpB;Q9iE=R;v3mNVZBN=4hM?3F4eW;vPdEM2D zl)8|T_9pY4ujqzeANcq5O;sQ->b)s7*_(paF^;+Sif_!5Bd&qcN3>8{FL9DsrQtlO6YdUJ8n-HALmKa0pU4r+_(qi3%+3b{A{lA{c$v zStmI|{|0Ha8{m0l{r1WA4y7mtQO5sBJ!6a$I=|Go^^PGHjprS4Kk)CqD}VcV5*+Ts z*#XSBc$R0RVtmG1?&qQR9?vdgsRyhVBrkBxb6;S*oP43IFi>8k-K}%knov}wxJor4 zjS-A%&R1ogOg^Sm2cu1>nx)d}R!{BbA*4P9jomVrJjN}YuG~K_RfKt!^WC`oC4cp4 z4n;D6)3BftoFxj4yBPa7==kj&+NaE`DwZ_8BP3@L;BI6R-<8U*zxey8t%a2=3QkSXLD zG>#x>VW|B)M!Rt56bp5Fv-jh(=bghsqTU{ueEN@T}fKS;J4*e{8Q^j)h@! z6g~(^3uJxMX+=nsTc8iFPl|Nq8(D{gNQ*fa1iGe(agEREEtuEPH_A!vhm*Gf*vq_I zR?`7UmI-TzH^O2MYgxM}ikOf9GolFF6!vNzwvBl&t0z(A%TYg%$S+2NE3N2llNt>@ zF}(T_8bj>CYv?pJBW(T8r<+UFFSAbyt`9xW(J@AB%dthR?fejxwFjia_k&Y-K5zQIdg*a zRE*_I9t!}HkBnf*ZUtQ^Qz-Qh;r%ergXl=!8&uFnEwDFECh4aR+Ef1(_6XdhyR#x* zupSHEnp9O51t(RDF3U5i`a`4!*%=m_0Jr;Uy0`cYRzP;5^ZS5hSjpLWhn)M4@2h3( zu4~JR3rb$b`lfeH=+Wb;(evoe&py@O-T551*u3)%3+bJX zMR5$XCVEs|eRenUmf2!q{SPg7s&gun!kSnh;N6w3}aM;BNn75am4lbDjhZ(yRcjArY}CKy@eF zQ>nBAqE@Qr-Fbu^&`Ic8`)t`$>5>DUvvu9cc+?VLJlCYa-Ui-73**+6bdR2p(jovh zMDGG;o)AqQsgL#cfXq|ztpG%9yT(PhwoZT|sLl~|lHm&EJ==qUfeZt|Ee~1_jZUGP z^>+rTda{vNJ^fBCgC5*KDO&TrR9m{5AeJn%50dRebjZ?-Sx{IAQZt{VIwGZ7XYdK} z8W`-2N43o*P&ymKZ8WgkPH=E=ZnzT8?mDbZ)b772RpVf6K;(T`8X~0oD#a2gku+B9 znF}05=Ws-AS13MbHat>9Ek%vuNrb+$em}DtQc8ZEogNXX>J?>6iLsCuD?b;-VyJef zb9*BTQplm=o=JBeuv2&*a}e`EOJF0Kpq0O_D|(JXJXQ9CvqhpO8l02olk-Zc3;vEk zo!e8r*qT#Z{+>C6b-{b7JDbY|SDfB1xSA8QIUz|$wI(<&AQnZZzK&vph$LTD@qtE! zAQ{?}d-uCWj6laxSrzM8ffyE1$L8Y&M;|ZX% zt7K|d!~pPl`*h@nN7f{9P3*fQQ~wrvmops>w6qH%<;WDLUV{j29H=$DbW%D%7%qe%-aD zaM_3-Y(^05oC^-KkCCVc?{-wsv3s_oucXj+F&bMj5;xSL=zD6>(X|8%zwVn1kpFH@>$n z=Ag3UtO<=hG~@>7)Z!0^G6F#$*i{I^oJ)&eu6<>Hd#<7oG0Yo*2)#fXy39*n=j;j> zjj(lZecmjLV_{+V$b>ACtr5o+&fdPz8`DK7B((2>6q74vZOcN-)~KQttF>y`8Xm8p z9kW>PgflcY0vGlMpUZqC2Je7UBV@a)LZpMW%UzSJJc!qZ*AzU&Dj>3t1($S)WuuJ>KuI_%&QIU)td9EIij{sD;FcJrNODVzS&n->AK@e z*EL7uwOuWQg}y5{WUcSc&+EJW#tyYKUb-Wa8eQDJXFhD}yw)hTv|eK$oZ9P(A!u!# z={@Rh-qL)%o}1(Hou;Hb)#UWNHs|J~a?=W{-nnUk)m!QG(~$Jt<$b}i)lw@}@2jk@LOSQ>^xU}< zUBno(&skrq)!neXHsz-S2r5R>Ugs^#t2~k0R@dstnEvTgV~<7mJUwS~iKN}JwnW(4 z#ujfzZEL-6*;?|h+RE|`XU@oyC)YOC>AsDnGiqB``m(igr7tXPtEcB|D|zF#Ri)>3 zZB)riYn$quZJWww*tVwJhSkPYYfbUCEnBLbUBimTIHgMRu_JIJr@rUld%A2WdNt@B;`M^EHE%cndsmEqG^ zga7|^Pigmjwes{TS$iz3pSh5+!q*#2vKltf(;aWG@y3Qes$X2Fr0V6RJ@oBekFW9e zwr;8hP|8<1fZ8@XZg_ponXmO!_2yDl^_%OiZ*JL1TeGfoR%6n7uD9m=)>eH}b2Z<; zp}$%??^RgZ*!#TpUpKtE=DSN>wvzIBYuXK4>bG9x*=_7VQ?K0>J!KDkZZEd9TkFJc z>A2=8bZV~Li?QL~ZRHW$uZkJ@w6Yd|gMs z)?M;~QfJvqN*n5UFP<)MY3nGhb0~CEu|C7fZ)<5LH=DISvW@V1sJUi%Ln~%p&ZN>i zZX$N@Hs+y{wW)2~yEb%;-y!dpg~lGSU$%;i+dE2KqS7@tr!qEtvFEi%v3gCN(G&&t zzru6txTPuV^la&eLeibzWv_f}#JWji-m`z|wUBk#w1!GVgZr^>MzS6Yy9k~7wO_V1 zj?zo3Ufzy}$CZxcm^h&pZ2N4RE79`c>Va&=$YXtPxP7_j&uxun%e$)vv>i9+0X?i@ z=M<-C`+D0e)AIb*0f15+s2Ez6PX6{@26A7Gcefdh_hW2m;Vw8xrx*C9jrW@7ovOE0uBm&?XZWVAnbw+i zu3x-%O`CIk-ZyQ$y`@>}0W@4w8^8;F(_M4s%{q!=gKN)JU;Hw^baTdq)@)6<^v_!J zeSu%PYrcQGrlQ*P+AD3#+?HS3e7Dz%D?wYirS644(l6a@?7&uy#g^2WSL(*}S$=72 zB=>49>H}DLrH#GlOy6zlx~5)RDY9HQcU|Un6&%fFEpw;c1A2t7X-rdaKTGzrY5Cmb zJ~z3~O&O@&eQt7}o5Pr9_qo}9ZcZ6N-2Kdbj?l&3=WgzEx7?SH&jBSn|0vHb(0$8olS8p@gYMh%Gxxd4eQqLN+o9OE zLH8{?mqW2{`ZMZe8;X4!bl;YrxzF9)=Q1iuz~?Zxf%h%93l7D;4Z3fc>1QbRZP0zo z*f&G5Z~8N0KpcvF8+6}#LcA;Hru){D3NGfR`_>b(N-;Oxx1LkJZf?A98JMCk_N~`_ zBLAvM|=DyfB{aNCElVWbVZylki6m!#k>!>oZn49ifN9Z}l z+;rbMh6i_Z<9*8v(p|A{o$gylB$9q^o$gylXu^JO`ZEUEEB39^ed`Dv*w0OWhPHn{ zw@&x1BZMA5H~m@a2rb-*grHH(P4_JldwelB-M2_B#>L!p-y$J26?4;lV|1!w zZn|$&c3$jTr~8&skGf*t^k+oy()oSsc;AQ@zSy^@`$i;0#lA(|x9oSsV&C*<%oADc zThx7H_76Wd{TZ4O{oJDNTSiuj#lGp!2xBh#eT%$rf$``3+;raF6_0Kg*_I+D_;%>L^>-v+|qu;mn zr^vc}U)LWq!1rzau`|o}AB**$38u}Tjhmj0nLBRX*|_Q1m>G=ToeljNA$r}4vvJe2 zF>}YdI~)2lV8HmZanrMb9dlj`}S6=-sT%VVT0{vlV3VJ!3gewp7NhCian z$ys_C9r7dKUKtY-`1+VVxV+Cwl(fvt;YDV?qU?9p41ZOiv5x2qW6?SsDP$E&Zt7bf z7)$9(otJ0a5(e^rY4MI-!zRNgXQq!HU-7{I&VN1~%Aa+H22I zG~YM(Eypv3Cu$ZfHPOdMGKAppf^n2-3DtK%0JVwc66#D#o40f7- zTUef-U$ZA}AXU;hM%UltD*|ml|0(GIdqwC5wxSZI&B=2qsl0bY801z)7H>)`c4E() z<>dE?*(X6ICKAYJ4*xnT2ro%C)?5#!htO~Wd)zy zr`WK2p&oiV392E_q|f|ujND3Wj9_S_lPllP`sm&Ab;Oy@e+r9kzh+G@l721qRPjYC zkpd^sm7+=*FiRR(jw>S9(WSL+7j)U3;|wp@sPq78Gw%=tBrGXwcgd~X1Bn>uyaap8 zeZv{FoX%12fWq?@4e4VVm($WI1{eb}2IcL2Ak2UfN|NEn28Ngup?^#tm)-ph{r$Jg zIm@T)JDjkeEBf|d3E_v6@}bb+Xdg2^FLrgOJ3PAYeHRbMN9^Pi)@i5fHI!)EBGH{P zf25Mts-Pez4L2%Rtg!*QBAy``8Xg`udl}JG|=iy#uwam964d$oord=GxkBw+NwJz z|K=A3mVe&yV!w}ak{K5I#0;j&dkqTKUNF{i+TAHH*5$x#(T+()mZgeqNB#e6@o#B2 zpIKby72jBTB=m6(%n|DP@||Q{8N~OwCq8AzWXxQKJ8*qnPDf^LW$6ab;U0gJ`INxM z!r4$kNdp{!kSxSRa@)=tA-v|qg5yj2s$g;{WUY6y^;GMhP!n1!e1|hKJ0(P=u=7>% z79QXUK8EBtW!^bP1&n2{NZh;3ZG76fGw{waB063?PtnI5kinPFWM*6G70a{-gcr~H z@W>RYnSrlog83ug2(EfkvC|(M^6$(!S3+jS+8S?nbsrroiG8eAvsO#YPvnwfw~#6h z!(MV8S$#(a-OZ%byC+o0F~;-6C{}`SF)k`y3EDId$Jkx3RbM?V+UfV`w*8~<$Kg-H zpJiL>z-+@znn&vd2Gx^!1;p3~NO)Kh^jmzQBlB8jOZr2%JBz3j+4}NJo#U!^7DcoL zC@6~DsqP#(>_aF_mIx3qK{<4+^e0pCTi-+H~it908A*2>X+Z;yZ9HM)R-rAwy2aMcU0hWFFk5Bwuh zDY_Gmm0`#wFi#{dwqeTA(Xr7CN)4LVbgygrP8nbCt!jv-2f&HQ)Ehfyd}n>>PS(+V zwQMK(dJ?P8F^wj*rDlgu-KkjJf*D;#7Up;|(quYF{#jbbSqw=!KP6rMNxGRH`9vz5 zOg38(H~WdM+jqpg@N>OC|7!Sa;jf23Wt;fI-spL!e?K^^jvah~2w?Un(fdrwp|;eX z*S3&J)BO%dT@`P12FFzE;xfZ*af!~8n$i=-VBq(Qk^*cHp)@Iz-9Xn#U)Ymx93#bQ zU0_SFUjHt-^S5*7a%apBr&@FO8}ei9ymmpfct5++=|^fpMXGb&#Hc1EAF)qjp^XLk zIX~e_-~J>Xrhv*mut)I_h|5Ym*${=ehL~M>raO&xMA2KSj7yIw*1iyuj7~$}6gXuL zQjhdH$LcVa`n>1(m6Xezg%LNx7F^lC%l+*4;mCHLGr{Lj28jw5bM>vAD>^14?sP1P zAIV(+=*ugWvD31KzgV=B-iA@_xeJ)w`Of3AqdYI-5WE=wFb}Ki??HHVuJXjbaD6#ONPg;D$0fu&`E65o(`h3nB-J*y zmpyFX9ofBn=hb`abvAkD%0pDprQ=_O!#CE`!$mO;&qToa1|t_9U|9`@=cKmiJ4D+U2Jr%RWde61 z%s!4^DvwN#EW{*0fKyVUo-g#w{j}2Me;)oO@qv=Heh^|IiB^I3$V#Fv9Km7_5@AoA zx0Bp;Sx)z0_SsVp4WScoR7i>KZzXF_Og zjl`9QobGSx+I(HaD1W}X`Gjvu2vXpK9sm@l9(z8AnTM-7gFB~*G|qs33pac$^zSuA z4_F});I5XuG9}Sj^<_kaMkvMk&Z81ygrcMxbe6l1R`FwCu?&U2{)6zh!@nB-weW9- ze>?m;;osxj1++1=wMF|a27c4fh!6VV*G3ZAkJ&F`9{GqJ zO2PBv{_Y}kDsgJ7llJ3#Q3&&PIDL%veGnGgB0A0Xz@932%?d;JNJvHhnCD2QAzvNG zJdWG!qZPgDDT#%*Gz&qN+X|uAOJIpePPYD1_@}}@6aLxo&xLeA5>SF z{mpi2&bC#ywWazdqc~QDle~?9lg6snSn+yfYd%R4bY%yASnL4rsRqpgijQ$RxI0Pg zLKcN15RiB3b=bO#h&zq3E?q=ztRupZlnZyIf;Pwhr+qzNHA( zhcZqrb}Y~I(RobbLmoxv;pEn_!!9%wTvYYetu6-?57v369`)0oB)gFR#*VVxk9`r1 zTU)E)i8QlBk}aYvk(Ql{vOI~6?xLeIs{;L8x1sPg$_rmZCtMfxpeIbt^Fc$VoXQ!< zN_gaasoGm#3hwD1d|MHgR_c_lg^Vl^mULWjBD|o>8hMWO^G@)ELD>dNHMdicMYKDy z{^&Wk(={xeVLAREmxn(Vsgx*Tjg&hE1T%{!V>R#On{I@{&2&|5J7SfpX}3(T`ps^h{J|k{N?jlbhagUh*RfBPT^llDkZ^Nefa7|>>@{vyrd zRY&ALdcR8;!|VQE<&EssmzaWLAz=(ImmCjbauFIDt;q@u;hM((!^sz-AWZ>SeppSzU6#^!u!zyiTY0iK#Y_ghS0@pju{1rB%Z(|u zWyb~+R~Ni?zCj(iXRq>nSj9^Ht;bgCMJb@2UvLz1W0^RiZfAXyX9r28eHMAFGFL8J z)rjS5KXe&Ii~<+F5&AcAVZfKfm1#mnkw5u~eu<2=*Uq=REWTv6>9fcEx5K}}k}O&W zRts^S^K5%)>B9a$an|-?5m&iqPtFQGy^k5ATx|W_`N?_T+5{Qyaq1T4MDURdJFOi6 zu0@~*jhjVve}whOIki;Q%u4H1aP`N`(VJ`HC5OntWC}DyxY{|T$dzcaOGMWhCXJML zN$MT*^SWGr|C(iyVixFF0}r&|P(SFqAL~<|mEsP#@5K9@S;+GjQ*1_EE-B`Mk3r%g zsf|1DK+oABze5;32~RuoxTm>joO4=INqFS@!MHHO@PpX!@ z3%>_E#;^z3!)_U6UPEdnh|n3)k;ikOX>fapJn9eP#W7U+B}bhfFO1-dZPci8=L$yp zpqMrC%n@Cg`Q#A0`tr=v?q^xj>Ew0EaP1vqQ}+5K$M;S6B#ddU>+PRPoC+~GyA73iJQm85ul&fwqVYW@@b#j$?sYh5mBMj{EKrYtEh;X!Hia~Muf-Iz z8N76^?7Bq(k#(`s{X#E()c5vlZSsCOsQb)Sw5-{fC2pD7NL9hAO_}^hv$35oKhsmdEZ`9m5SNm3Qcq5}l_tgcF67r#O-xRjDkOE6}C>M_4 zuJ0XRctb``QhU6U7?S?!xQo-|lIAQC!~~o8Z$skgu-&rSgYd)~KpZm%tVvOIqcmx= z7)i4$bC84~1%*4#%}l1Rp;P(HIgNVc7%Sf9^yuUWHog9&ZKbVz;Cemc$aIx@Be<~% zXyL>$+&!-CNcG#x7kQKvmzp)$FO=7A!)90P+R5KW{(;dAB|pbEPC{^7o)G6+<3#9L|<_0s4D_S!K(;;xJQ4*d?ZnsnWJ87Ix zR|DB}@c3}0PL^kmL(W=)VNO%-ZHMLB<7I5pJci)Tim$$LonPR}V5FTfXNx~-6(pfGL+2yXgtT}(aY#&=%$4giFhaGdW zC3%UERVN|i3_g5rcs@g_H20-!G@up8dL&EVGKO4r-W9=kwnw>!Ocb=F)p+icvzSxa zvopHAwx~6ECHbbvZgWNw>M!i$(wie;^mS!+?@Wv)K_Cz--qa0!HDd~X7* zw%Ezb{^`Av2#oxjy%(e~T{3SG`K!7@E)W z9)SE!@K*gmqKt>Q!b+RlZTqs<@AF>oaK?P%G)35kz0s8MxL6L#XBJtm#e+LtzK+>% zE^4|t96bjYK-c@7;{!WpV`Y?|WyNqxqj-iv$`^$%c$UDLG6iq+=>h(^E+tlrZsb&Ea{YNj~)@X-;?aZ$Br&l$BLtq zTr~nAeAnl(KRSz7qbGe%A&_29C-j=pDP^k@=Q)^fhIj>Y;vR7o zv0rf^8;|xG45V-=9NkJZFKJFbA5+K*Zl=7$QFP8R>l(1cNlb)BIiVSlXO?^WXR3CW z7(R{pOIsnfhPcKdQYaR7FKG{>0byx91Dw%t_DzXdU)N)ejC|U!061^IX%a%_C@nv5w&UgtJCL9 zjzrf|DC8$SEZ@4im`a}i8)tVO4<})x^yg}2C(Z6)X`^n(NJWD<^s_9;z_AFziIF%H z+W}HrcVzxdBaeb8^SwMHkO>^8-t5<}Gn+d?V5jKDOa2h8vV;(=;&qlM_sjlkYXNOI)O)Pb>*#`eX(WT9k8$@!2`#5q^kgsahQC zadLcdviZZ6CZmq$jpx1w;;LgRb_F0m4TI(a$B>VewQU>5& z$`Z(AqwR9z(m3i9m9p(*Z`lv^h4-XsiSv^rCaaKQe%Mp>1;xreLB~2AHrIs$!xwZ>ugc_Kz2->n~hNz%lLUEM>Maqg_IxVqkT_)?+;O;QBwJ z#Asj_JaUaY@sPiBwI+zDQ;F(f&w>DbcR}VHo<#l`oi=9U(mF~jl@Usyz*O|WJGfa2 z;-*FHbm4KcAgigUIh~+>{6XtS7aN8uX2Fv!r$hCrMi&mJAC~d;L0GDVBQlyiQCKS&zP`axspT__UGvLQVqIm8vO9pNAd3PNCug8CMax`#fO8k{TImW7r{2fA#JUCxJI;$}RA*~W zF0f4MGsqg`y4pLwEp_VZ(QCQ6H`hQ_`@5a>q~pCb-_~s3N9|wT^NimYvyHxPqnIfQ zc5SM3RSwlWPxogj@7|c?Z0^l^juKWX_SBs!zo&b|R!=15%ln%7MFk0fY^}46gVuXh zX~%khkHm>^Z-2}2Y|OtJ(&knt%gZF~_inBPojJOXu>#U#R_^-EV1uJso|O>v9B;Fw z=uoVxdqO@kugBAKE5hS?vTD<|*t?Nwxo@>7W>rWmn`EPky1F&-J&|_qIoe#Ti@)h& zXdR5+`tDQ*Bv}<(7m*XOO*Yr1=+~4nZA89`)|`9GlH53aBz7|gubsqoE?z1_@8#sj zkbDeo@b|zyiLiIJb%R;Yt%+(LZY=X~h3?DM9}P{wvAxFm?@M{Vf|s_Q*Zq@!+?)}; zw>ck^o%(#2GphAleS0O1)=9Fe)Ni3uZXNaAYA(4r&u*6b-dcK#{c{(y7g`?Kh;DJO z+=9#-alyK#&4ZvLOFh6}Nc1I1oX zJMs697qu2;)&lO3W~olPh2q}UZvbzA9hcXttNJ3+OSAn!>Ke#0@YM}_+2iH!@>0Ru zpGp)M2=)Ukcr9;0QugZZ5xUDBODoC8o_Zb!>@&;ASQJY91c#Sm@hB;l;}8IQ*)o5z z{fj&72Vd7AeKM5!x7kNsfvBx6b6s<4)g6GYLgX6@(3NWts*x0HAi7yI?CaRR&#mrq*jVCuFBdS4Jge;5rdm+&s}|pb9AAxzi-?7d*pr9 zapb-2bqqT5(*O3;?|~!OsWN+1T~=m5!;`?&QN|TJjF{Gl9aiiPn!J<;x~?xe%u*}H zv%g9K`BnTM&67CUI-a1o^B^$u9&g|I*n_0P0w!k}Zt5|kTo|@nZLfejHM6}oYSlc> z$pu|W&APP$prc*CHelC*IRC1VLlZA_Bail8hVx{G$SS9nTu01vxizuWQ3pU{*|~dM z#&Hx+e0Sl7AI<7XBwx~N0!!&Kd&q!XVV(KZ-l+Er*YdHY(x~U7I|i2Ksn=eZI z2IZHO`{RwD-#UlLcZi^{#8x)Zb*qRgXqm;XP@q!3qx0LC-QIbf>$*k5p{nM_?&j#` zwly<-{%$)@S^?Mj&|#Wgyk^uhG^%&o-ZR`q$M&vu!80utQ`4I62bb4#k+Jo@$-TFe zxgo;b$OBufQg==7J;B@<^v)Zl%b+>K4S5W$Ik`OTkbKsBJCohtnZ-Jx-50gSZtP!e zNS!K?My;%Z^3{{@`%=u~csD1n*ahp^_@?mnls-@9_D(^z=at&qGlcZHGH1QfJjY#Q zek+7wuPdC?4X)1NdAZwfR5**1xDvdV$X$-FZfb{)Q25I^z(N(h&^w=KkNQ%{K_Yf* zGw9F@4gbbX;^w-A24Ac_IDbc?hT7AOx9~fP__V;#vHh<%H=GQ)vus`N#mg-ft}ll(>k@rGXVY%un&0SZWDzS{?@<6Z1_xs6P5npC{f_~j z-PbNM*Q%BAXtdJx(W;y23#{N~0nMoSeuTry^{O$c-Fod2UD#vYaxX;$uAuf&=z94E zgxP~2%&AQQ=K_n_+GtiRIewg)@KxA?YWRpt<2KZzgaEjQQ8&( zkaLW#3eevczVf0ATKXmGT&e*}`{c2xtt~r&&;sGRfl|96C_k?&dM;Phg{#U!S6Ar# z$469neZ3md4)IBjMOOne818C(dGoG1#=*rOQAt*hbFUt1W5lVhhy-fZP>jDddY28& zdZQkFV`YJN_K9T0)o;o>RwK7J)FW@zat=~FZ#MZO7z4i9k_G`PZ%D#^g}>$TTplGV{le)$FG zFh}av64SAw_TwD`leeUzmu;igH$QbfQY4A|IK4mc)~_q@3ph7HBjzecQ8#k2cdV2Q zl$QO0AQ~REomnpI`F!BT<8bxKUGQlR1zM{guf@t%>o>@mw;P?ued-BeG3%G2%Mvcx=4?s0@J zdaW{T_l+J%eT) z{LZpvR^PCyi1(W47TT5Z6Ew_7sAjIdXS8Z=?TJ0b;=R%x8-@76MP~-u+eAHdh>tvQ zu{h-;%T9-?{(f&3TV01QSB|U3kJ39dvQ8=clgobI{n^E#D;y*3?iI}ShbZ#-%y^}a zqA^~riFE`16lz=n>tBIJFL z;763uW014}lc$Q?3C^fq#=moGeLQ^EWiiDvM|2`U7%^mO9x&T?gr^g@D^~gjkUuyg z*PX0X(ozvwBjT16LSSE~^A@=Y_7z%v(@v^)4sp)|0lQ9nbOqGC)DMvMp7=;zUl02$ zx(h|`23K24XOHiWP!p?a<`_{UHKe=wzj~hgv;8UPd|e5EG?hkOF}j%;0uNuB#5iK)&sn;{)kqLG!bb=Uagn|O2 zV8FHjsh}e?$+~{!ZM%NudmV{%P{lH{pVk#DzMX0al1_-yH~9r0GF^ibk#n^Udw#pi zftr7^iPvC;LNfg}r>fG!mWQofULvVR=$R*pa?n!aQ%JF2r|3r6iv_D&M*yzxUu|sZ|Np$o2C2 z*t)n>@2o;JTB_Gp!JVV9LUmoOfUiCp#p>9``A|HJTO07BmwIl#tBBw-t?Fc?j$?I} zR4#mUU|k2*IkeGv1)A1rzszgZv1@eOhDKq%R_l~4iBK)4x}_^A18h+Qt`z4d3Xq`N ztFh5nQ*;$cbqi(A?ew@6>WrPkN=%aCX>^A8!Ehfyy~UaKV@d0=Y+=IG>@FMFFwp^< zwn1W~<;BTMRY&&Cw!G}udZenEYYIxGFIMwz=nH=nZ)u7S$%rjI(VH}^bi`)uoXhpD zx^*ShTXyU+XNPaveXa44*K6DiF!ai7PujI)I3^!F=N7tDdg;!btGlkCZxGSr05~pN z#Bh4$bbeU%pME8=fjpYyS)<}w>+^)zfTnP<6gPKk^Z`KwZuo$+o_xi_!6 zM>pT94i;6YvBV0d8dyo$R}{n%>T8T?(ki_Xw|FWTRutcEwq!~3Wf&26|b`o zYEP})>)k!|b?jSvIwyB-V|!D(U~&xZ@R#rDuJFRkJ+*?Wja}8|v&UOPJwS~K$Z64o zu-=Y{*1M{nqvJQ5O<8f@wT9`F!(nA4q7GHAy0;GVtU#9$1hHNt8y^2GwNTJz`#P@tdT&O@)uCe@QRWmqkp6(XkOjdQux_ zS49UpUG>Qz$x=a5!?|0+kQ)$<<;&t0x={Jwqet#yjFgi`WPSXkbA5G1QJU6PjzJtL zeb1NhH?8-o_Bjv!eO#+AF%gZ|B8v2+vyTQS6>7hxsKlMYrC~`JDg#Q4Zo&EOS4I6- zVIkRi?5pv4PY)}T{Fr8!HC?YzuMj<{@G~D$vjR;bG8$hL9F*fl*T?8>x*|lcf#wHR zI3LwDl3{0 zM(>u3@e3{}SN*ts&qxj~9;6td!ShvBodVW4Lrw#^2)yUL_Rm-j%0>E}PNCYu8?TC!8D^k6_PwABrFs=8k*jTv8$8!`CppdzQ|IDe&3=$Cr)O|+iTV)w^C@UJFJ()j2GFV%**&X=dJTv-eM9c^2%a;P7x9- z?BFs3#P~8=i@L9JQk{_vy3k*z%}9W~mdTk~LfG12zgY~#z0W%QXfM5qukVP`_%Jh# ztv;M%Uv*4eu%}*t;VZtgpxNBT^DT7IGq}DZt}^8Sbn#$6PQgq2&PHjNY-2UbCyCGr zsBRI74Fv>+we&mWHnyLw#|GniNQKS7RWxnfU(Wa(wFfohVHtP4<4R<+vI_tN?t&HT zdMMx?t^G+LMFPxi$ z%E%_Vi!rpCxXDRy$-CeyoGbj~5!ATRBUw4F=EvdyUO=J09;VUVT{9-%N1$Od4K!Q!ilparILj!Xv{PR0 zj;Q73T~NNh*$7rAtDEi}Z{uW4e;g~EEg1ZT?(^$aZQl25Ttawh4xKPoeCQ=YVQ|zB zhD7V&zC2jr7!=|y;-aEo%0v8#j&pQXJw;x=xxyp?%SjQ>+I5c{S8J>eNMTo zX7IwGaA#V3;MOPS4$9-+ame>uNRP7*NN=D$a{Z~W&gJ2}Q5|S&S96SRuAbs1Ud_GC_nsx%vNK7 zpx(#~SlcN#6%oE2yCCIPz*zdH^8^3MKy|QRE$e#@KPRTsKMH@MoO+p^{NGT1^8XmgGhfLt+0Ex9hOh!U;q0d{UzG+ z|6}?3GSO$#PnPfe#`5)l2L0_X3Y3LguqNst&=VE}juK0qN_Z)U;RKTVUVRpk;R!<2 zD_R=khiE07fD=SI(|u5C2Z}?@QuoX@?NRScmetcmc)w3OL9`&o82S$X^t+O?S?+WR z+)u!uGB$beaWTTBaZb+0(K(B9UG&j1s^#Cm!Ptvm5zF*1!taMa41XN{jJP=e_3&?n ze>eR5;XexhN%+she--|l@ZX33G5pWre+~aTG!*`OBD)EJoJHuPV+!6uMhUG`ze^00 z`u82Ujie@`7p^16s1uI{1S{V^;`c{H+2s@#Kj+-X}NA9M21@TH{hTbN}Sg@fpAfnzL?KUcvG7HsNU zjd?F}O3MEN4rZyDmN^VrgZ1!5x&i@wE@4q9T4Vj5lwTi%tD)Ml;IfRJgw7a4i0+*Q z8`U-S2EqpJR98uM3%<0UuXLiibid?Dk{R8rbv7&^H@8a z-)B$m=4ovoQIqlHY(!%;M_o!|=@b=;nvs{^tl8K6?zwwDt=AP{AJiDI&RoV*MogGK zp5D(q>R5v_k4Ln;XB95Ia{4e5KAjo%my7pz<`B#p z#w<$;{gRN5%=7Lm&chv{x5`cY17;c3X3?6fs6?ScbElbH(I<<{y2>L`B_vE#HbK<( z950hOj8H5Js^hEUo#`?gpRw?ii5(%xQCKb3`8&m`q6${1Ft0-7LK_s8md}CK9v1g8 z?&07sV7Yro)^}kfD??f6xm|i0P0uG&!QXsirj+*#+}Q0%8{88g>S=my)cJYq= z@9n7je!%KbIe&oO%}t8g&v|S24FFqCV^9J|^#o}n<=(g2KgvIT7g@r3+ZD0HN=qV{ zH5MiL$Td>Y)?@HB$;DYeSQmw2#o38BE*-V_T*|^;a-rAvF=6vCF4Da#DuaqJd>v?gLfY1zvPmZ(MseXrA zN5+R0h{jvA=9AhhW&;_D0kkT34|zm*c7ONTJF^)5v(6qxvt--rjn)?Deko zj)E-Hy=Txk2J|52p$t4nNs_Zuv@^jcoF;vr5xd-i6(PvOCB%}fYnuayOi#%^eNfw2 zbb9gX{549PKGiSm-M!`Bre=-USwq98^ct#{@d%Wi)LH#o9)S2~?<(KA z@jpbZU9LP7TwMN&eXu*0Wbws!Y!Q*!x?_C`ZGFdf!DNs^@N@^LMKi8#sPnGy!Utu5 zLD5ke3G2eF0h}SYc~Tvgt3_%@v2vEsW>`hCV%P|0MboSiF;a@ZU5Zt_9L1~4jzHA@ z;~OZTS-)wwA1_@9!QBmI#S9k7ULnGhE3zg3guJ|w&TCzjbah0{#Yb~j#W3iCZCTdc zd}nZ$Bb-m(N9Nh(-LskQob~JJ29ix%m(!uN${)@tG27j6s?4_Xw)+$cXPAvC|0L7F zzH+&;r8l*&+0)Nj)D680U#Sno2e`=l1yP~h(a!vZBflRy0WOk?3FE6Q)U0={B@Prt z$ASU%(0I?tcKVdchr75>@Z6I=NF^pH>hVM%hc*6@DE$2UHxbq_i%UIl`rcbY%8<2 z=lt2|3Y)j}mapT6MOr*H6>+yieLhxuU0I`zeV$TzRoWhp!Sv>^dgq-tzQZ1GzHQ@O zX8XWTbMe`GcBoWeJl?TKoz2rSOQVl-)1CKX+ef0B_iUegHs3Xv?K8a4_St;roj1C- z!H=YQer5a?Zg!P}ku|x!)smx=mMTT};!e933Kv7(F1}5WGsjw1E%&q2t!PYkj`C_V zZ{E8=PIA$K&Z4{E9(=h~H#&>X(s>&;ou)@`+cur`zRCDdxA*xL=eQlgDIz&(6~);Y z7II0$OYE;Aic{NPg=dz3%Fni~a3LjpE&KyEP-QToV7N z^jBU)FnKU1u;6kYH912@?ZMjFrFb`NGO{N?pnEEHufpydz zB3!Y_9oE_JdvSX4?I9r+vfRz7icKM>p{Y1VM0IC(EUHYEn%Fo^(Z+ifadz>3x|b^p zV3jjPWU!qr4RwT2=4C;`!Nu>tx*x&sOYgIpzu1W2gMV86Y?8h@zg*^(EoL+(seu7c zGsj6A*|2vKo7>2Qxg?mz$kZ-%JO?k${Ovy{>(|csaq?gF^(g0yErpAejH!ZN29m2G zpB5EfVn3)}*4SeS5U)tkF_{0}ui|kD_Y$oHz3yBLLiVdMhFDzK`G%;65ra2HZ&mfP zVVcl5T(=GNuPDB|y`>o!-wdsv%wA$2tf zv!C_V8gH)fVY_C>Jy$Wv`)XZ(#Ht=%w4(Dfi#ZA&y~OChTF28bW-nO&uJY%`ppKlm zc4-a`YutHul2M7qZ!Y@OcWAvJr_y6Q@1D!8*h1V-u|(N_>K-t(xROm|jO?t;(9G@R)oH`Aqc_F`*>PZrN_%<@*0SGDJ=_!#T>0qytJj6K5L zlSjK-#}ZPBynWkViC&rnm6zwSaTb91xxF$HTQBnGFOY?z3AD9bgB#yqwLN5Wv90^d zAL~8WIgw{QXje~j&xw9;9QIMxa)o}`tUuE(oxQ7vY}KLFfH|vrw29#C7(-U#u7v$N zXxuff3tK7HURJd-a+I4Y_#RQv+9~OBS=1T|x4`NAf%^yOt`ZwL@5TD9gEov`)B2TJ zbf=J9U?n;%d&K2Wu0~F4vRrlfsg#eXsDq09pIp5b*PMq!ht3*Rh#)O8r=14ZYcB*0hQa%z=#Dcjl^I1=Q+e_bc(bYe9ah*Gr z;jOChbqI(2lCn1Mn~nWG+UegO{?X|R^?`pG zeurmrclT8DIt^UREk{nraA!x0JIN}?>b))R=V-b&*HBZmEN+gWl)>F93jVX$sH1Mk z!B7surx9h8p;$w*YhF68N>ZL3+geuI<13{msqN)#*1I03dA<#=^A=jZH!x|-_!{}2 z%G*mM}Z?0^P+;Z!h4U*+hinaKf(Hfg;al9CgJVi>X zbpRV-XMB(CMTjBUd$9&bU%S*;gX-PQ`B(41H+dO?#`s@YcjkMX2t+7`X5ELpzb-rL zT`gGd3vgp7!?) ztswcOW7MpOpw<3*VvVOBgdls(L0{Q8o2u#M9pA+y-dBXBZ!Gv^nX8v-=UXqYxzpO)&lgD1?vgN&$p zBp{1E-)W1eiXKqgY-We;hMS%!`2_ro7>CoQQ0-V)uEqs_#qPLUDJzn3cjb}}!A zs`xq}Vlfl0C&CkxY*mNL@)mv-A{+|Ys9!B#ueFJKHnPeSd}+a{aC(|Cg=zpO~ZU zm=S!BJykIG>oEZKBU;OoRiVp30#G_4M1{xGseQ*>PSu+)GPWb%O1q;1cN2X>g3vNh zEaTJb+fd<|Po8}%7x%Cgg+n-)Kf}`vQJ%zV`?Rkugdo3_1S@iR2^G_F&J?S&< z#8J9}^#Ju&f{?Li+EzV#Kgsu7)-Zn<{)l4~sz6S>=RZoFX2e3TO^x46=xv|X ztbA-ltMaw{3FzN1Rj`2HWtqa+8gQRWhxg&QQK-gVeempB>6%oXLeHv&DDPzeUOH}rW^8#a9`pN=v3ja*l>3sPYhriH)|TV8^LOuh zhl^|PHQN}=zMh@s#5&+d+Zpl51q>@j(Z&AwEL)>@CgFr8-oJnX_#BI)C!v|aqQOya z@YqS6CE1SOEUS=X+`p%~w=j3LX(`)?LL~3>aXjnpop)3zpY`2q5}7Mbt2FyCe+Z5H zFY;(#5r*C@QCZ1Mi{@73#yRMHrs?w(4Q_UXSuFS5E4Jr3K7_F9>0)Y{z$M+V{e1VB z!QfK-QdV+vD!L1rz^0uFy}+La{KISFPDc31`jXcDr<(Ks9Yk`fg}*patkxO9d$HQ( zu6ZOKSgtzB-PJENh|2}CHxi?RkQ)|2+mm1Bhz01OjwWxbJaW&Zv19u~b2OW!%Yr)6|<71Q;-McRl8N<}b@BU8@h3Oa#@j^9Nu}Ug&!lYk82M*+`G+OPwox z18lema`$XbIzzYKl!hmp9MYbpDmhu}VhoPdefGrTVv9Tm!V7WO602iK`2jBpJIHHa zp0yaR!RYHf&a9p&vg9_-5NvS6xFw~>xU90H6vH?{O`iAI-=4OLo2NLU88vwx#H@fJ zIQeuK?>m_*9eo^f72G&rgx@>AJ3YUhrn<{>D~ln1>b>LYY9{+dqx?cnYJ91rfy+zN zJB(Iv&gVeT#-9!^X%`vV09;ZCjAn0S1)Xrnqu6N9`>2+rXmDs=X-`P!n=Hjf#F+ zX>{D3SluBg+jn7AXLe4L5Zt9-@C?U0 zo?+<`rk8kvrKHYDe7~r^$yZzc0AqdirTx!WL~Zd?gdwSqMEiqyjgQ+`m$QpmR5z`} zFF0~hU7{SukaxYx@A`&W8=JF`xJHJ!r3-UNl}E#O638g)scD>JLX;y2_7TnT-k#^P z+}h3cYhd6GBHw%-x2&2*1mx(VB=s3AVj&{nq@$~a^)V5PmB>1aoVR9t-n~fQGKb1g ztV!BbyvoBWL!3pf*9y3!VAsu$mHQcXTibKbW>}9hZrBd2a2o>JFe2vCZsqZ{55|4d zYPY9&S9xUan^={&wGFLE(IMQY6vO$@yb~l|(6UEQm0tpl<~2y^jm+kV%&QCG8cGXw za?S@|ww;a@mT7Cl+ulb27lwC{zU7JQU~s9YlHWdyl0Fu^kOrN&c&}@*olCfF7<7L!@cBpm&0EPe>MEI@YlniV%FQj_!+UT<93{@A)hY^dEE(jHAME=*jGF1gA0PBN zbJPcgfil9+3;Uquaur`S5B_;~{RO&g z?X%xIwri(-;{YS)h&<5dSk0d)#<`4dNEUq-IE4=TZC z4I;NnJ~njLqt?6p*0OTuW6@sMev}UboErAUecyk_vI-w+6$LOOW7GL3x$qv-+P;{! zz5hYa-4}uEQ}+Kq*V*4Vg|EW1F27DPC#N5s+PLfUuayTa!cX!XeyLXCZqtqU(cVAJ zDwUf0Gu{8!wGRJG_n*%R>RYHL%PiwR4u2Bq}h4Ns`^`E zKZs#n0n6z@J#5h!eOiUEn&Fv(keK`Y7yD3~+0?CED)V)%5~&}pb}#3I6l>b*Hf#w_ zmg^gfd~nC!NvzxeA)S;N46HAyp8K~+TZYfcor_j!=g^5K^m%`sBS*_wE7Rx?feVng z)9B!lu9NAm{vLbtwQ=5m7wfF=#bte|g6bmmjrp$6Jg1MTmGh0^BL^`7NUN9(V%?@> zsd0`+r~{s)h_OR`ZH|}!fSkVywvm2YryTneQQ_XWtZfLhi11XSBu>)x!rgFlQh3`= z&f|?YVuH42=xL5s{zUTT7k8hwSJ9UQ>smgY&0&jN4@0rZ3u2Vw!~cZy>c6roVC7E# ze-{HiFSdAYAhhlUB~86}zw%NEfVFoXoVfNKt0AkuE#(EZ3wMhIcIyg(F|{P++AIxd zl?7Zwqbfl9U;=c3VE-MZv&m|Wo{&wsPz}e(+p0zQ%*08BWjVEA4K7J(%4rB73d|yf zdtP+6e+~rbSt1tybpUTzqu-c$%Ze?LNaB_ZIb;XZ7kiH+(Pw_={wlu;GFC zj_X_U?<41=Ngw}AEWDTZ8i?d<_8h>{yVr9t1_hv6cOK;5|MJMFfjms@>$Ak7hHhl5PuyvxwkZCLunQhrnD=+=fvZo}=r*}*eyQ*;Gd8i-d z9_GDPGb_?MuNG1+VBd7sYh9GY3J(M&;g;-J=VQxm&y85&>wqC*5}JS221PW1x}fL~ zP{3_aS-s1+YFet!w2jVw`y%5~{Qh!!|1|vhXT>cpMdzwybsW{zKU6%Um(1O)2ldCr zHx#_I3(rM6${Ke?k6zcfU&rJ?A#YAWu{=vPl$Q5_T$F$xVb&G`P@lI^yraWep--A8<1KIAxll6S* z1}u8`{13vd&?wIcIOXC&rnFsxF>#uLuV@3H+inVSbQX@+x_#_St{Jv&)xS; zzqXZX-Z(5DpYwA2X5#tTjc<9q?DI07F6Zl7@q}krVJpt?(4OJlxI=RqvXPea`cAy` zcWjxrk8|N!lza7r2;lPgQT3V&&`1nTE|&-rM83DvDqu6ISa$`#fc5>pN_Gc>tKohq zi;XDy?qaEYmq*+2E)J;`)B30|(2R8ONl-0h=j+H;irOaISv~)k60`gRH_jgyy|nSe zhQRnAUKGImmCi?^bTXS4MKNV^;+mQ7;pHd3Aau+Y(o-{n{F-g(bp$yEw3e;|$-=p` zjw7SFbRA6=A27>4Bc+PP+ONYu%*Oj_c~I zSBA4}J-~`OjlE>FOGR$w_=H=5^hnM+{-9BdJN}lFSnp*WHG1r_k6(y?Rb?O{ z$l{)KNJhpY1=;YaM6|_Qnfbyj^N@qakG`U8>UY(Ast)uroBK*e>@vDM+I31-254zr zckDQ?i(2K8afCH18Z9q+g?rE2BMtuXN^c*M;5A+e7nlfB@UxLnnIjp#RLe|1zO8?L z%s-E0WDKAmcE9tQpK&0lT$-mE7x;wC30#KH#fMJY)j&O8^dNhte@A^_u)R`7j0uc|!7Z|62xjh2m zYx!>q!v4;9od1~4>$AsBbto*Kz<>p793j$siny`h7=Zlbaqn0{@v77J1Q$P%p`zG_ z2KW1qwM=Ezej{evksOstadG(E;^$uyb}MH}m)`opq5T0BQaxa`xh;mb{ zEBPE}fndk?`;xCgngb;Er|f0nCdrhLQ+&(#`$TL0rDD7n3|6?H-e*)C`pW%YJB}^W zpP9RN`Fg^i%Q!E65SNQ0y<`D!&cZ^z`lt4B^ht(0X+stge6Vj2X`?u1HY^-=ym2dN zdp6q`J;uJQ*?SuEGQLjQvJC?r7*+TicMZtE=3x2$FTAx1A4uXW4Q| z6GJ!QnT_W>op#`%*qwVC?J`nN4vgVVI-q$(y<4%i=@ja_Z|13pRe$LXw zh>){#M9KQkL9m=U{eNJ__q=wDGKqtAgoKLW)+b5G2~9nBCD9D7RGfw5%rQyYkJqd- zIoQR?9?DREB4ZLU6v*F5XrzjE^ptJe!;a;Rqx#Fb|B%lFor_5q*>jgNo~Q)vl9B5? zH07Lgn~>`q`K9PD&HS|M6qbnvch+_d1}&Yz=gv#Qi|TaE8`AO6DNMDN(Q12~K9vtC z&f@z*aZZb|hCK|y{=nJv@0T^;cy|KdAO`?vc`PV}q$zjEI8yI)z61`>>l*3u>8z`C zmUb+K#o*?=6w9&6e&th}D`fK1PP?B;T}tSz{RxPB%v0uYl<7HdjXiWHOeZwF%ZWqI zQS?tp)(=agoDkNHR-qnA8ade8n7>0r#H%7jqB;qDN!AAumr0rv`Ld$3oMpS`Gsu2^ zaZ0J@0k~Iu?t57)oP4U~(bF%Aa|UczP#!sqyLS=`bVNSoJx=^F>mv(=$*CXIL%Rvu zF#DOz^Pw_ItY@??LXfhP72gqB%}q#$DK4BHcQ_SO5GE2OD+#@h+vyVm+C<}HHe8Zs$!sUu?;o_CMz?4k=)8ggZ$|Uv5cm`fqOWGuaE^^N4L`WK?nxD#b`Ahb zJUecsj-f-cvL4q(N5%K!DeF64bbU^K(7;V|M5q?sT9Lk!xlu$-NvH=LYxn!F+4pDn zkPceM(VjWbZ#Q+w6L%`AzB`kSL&YSDCjm657DPElzGrwhJKS&`v54d&k~6LuyI<`z z(l!zv_1csd)2(68R&Ca6EP?X$fkI&BE9;!znsnv;!>#qc!$lZ8U$_h|8LD-sz=pxk zam2l|LuqDyz2ECESq6n{gU=zM$a>ync7AVq+kT=OxcMC9A9vsL;~Wn+U9B0jn**uK zm1*^4ZeRI);jV_3#FZp>wBROQnV->Q=#7^mz47vu1}5wMcE7U1hsciOKEiHTTXf!qSUuQKE9M7kSZA_L0b@x%>BM2|& z*(}g}25G1`9?{oLx?Vc~^14IGt_rX51Sjs+wud4N{3ltL>?t6%(`iX^fMJyXGC7WV zoONTl0`>;Q)t1LTF01@?gq6wgsLrxy?O`;+BE!Add|Uy@UnFOJn1ici<7-qR`je=) z`fNUFHV0=jpbRc?jF#^a*o>o&p}gDJ+gu)!y~^ypBv(%-%1X-3>09e@6t)2@CBYNP zu~2%3jbGN`2PJ8i`xS>5mur{AC}B&p(2s9LH<5q-o|*M#Efeh6E|qy8Hcsz`Rm!72 ziAA%FpyS`QbDl`4(&*>%{T$E1-Ex)-1ZMfKxubM^^^w!(FFETrx}2+SpszX%9{|$~)+S8-6GE(UV+2%TGqT<&}$K z4odu$tU)SjwC$$A4GDabx)yI>`Q)0Wog_#1%Pu@2%B0UG;psU)t8t?8ZtmCj(1HEw zXYZk)XbtkvkrTTb2jeIftqbp1_RaT*pl}qcKo=0}N}K_1cLzXAem>`NtLN`1_)Z#! zys`Xje07e6kpUbBtyh(BfHgX0-#TMHBDO$Sk%#lQ6axfjw~^J>ze|2~j~$2sKt6L) zTaEZJzY-q?_77@C`OoDX1WWb{zMqh*&j_<}@oLmKSI>O3;fJ$i_9frR`UgtNIHfor zFX{+?WUg5}tG630XKhIxWqr(EMiiCQ1%(+%Gqghy>)!iOK?rC>*%ENTaxp-xKsMST z%UjJa0?ZD8Hz$DGojQ(3qnK)jX*VZBr()-|Sg!+ixA`<)_~KdRlX`tlUa7r{RP$X= zYt|`xsn|LQmFt>Sasj|LClHEG+R248dnEM%;KWM1D{+SCVybqRX59>9ud`ClYw|Hz z@#*;1I^l-cMTGWvEe56`ozyYzbsp#hj;DGKU~tYfVAP&)+VusVUr}xzgUtveY7)G6 zd-z7B>%@|w3o|K?Pr)}uF}QE!Q|f*!qk1~;q+<9?Cnk!z?kwKtiK(Orm@9C79c*Hh ztpnT}8lC)y6)6kqCB$+AxyBW7eXgi!>`m=&rx*C!N&H)^7+WUi14T_4pHI|5A9U$w z)|U}n)Hj}A!}mUV-#f8wi}Jj?&UdJFBkhaIjXB|G@LD6{BkJrHVk)G6=A<5vSLb~| z-fiuTbA&%Lgdyf5m2X^>Qn}$#Gz#(|HuksNJ1S*lw6diJ>W#$RotH-!8CyOaAuahf zmqcF_A>nP+a_Zta9CP6MYjdklPk7$@#aOVQW`}1EjE@S+Hn|-_wD{d%aa4OcJu$l6 zT>h3ky;GFS{CF zx1I}!bT3~7WY1(9jIy$-hZ*AwXmWg0O;Qir`PzeCx%R|by<>j}YyH{|ktTy}d!*y! z+XK&Otn&t}E6CT_k&mfF?$BJ(;dOc{zN-RTij3^_$O8 zTl8pFX>eFc-Z~W{bx?oO_KcFSbc>xNit{bJHAz-Q(4PoM>=ZPZ<7@-92Z>8Uc(Gx7 z<-L+SE!i1Gh|W1ey@0E9;@jz%z0LYQvPOrci3&s8BB_9({qR(uM%h`2&y=RD;O zwIiCV>&Xg0?r(AtE$5?4Tn>4tBThlD_911SC>AAb*pv7f!QbCcXXk34!Ef#;=o2TS zz>6YjD2ex=zTh3{G`4t-2lEvugc8v`B{|Kgg}ig>#PAXCo+{p196qHoj!63R4dwRK zu%%UHiZc3l7hK<d^DO>lHNUB`_WSK5woF*o#Pj4M48U6bf^nSwl7=I=7?gpv(k>Km42m!JPsvnYFbCP6L>0V9~tqC{^-v7nhN`r;!6G^Wl17T2Tbe&R!C zx|C$>N7JG#ca~U^EPSEJ+(NeuAbt-#U?D1M>p>2!Uo3?@#vGYNUi!y zx+l~kMN7DkQ4g>eE8m%8oK;oN&RL?qrpGFfSZ8rTi;JDI-Y(auIx+I>)yaVoR-Ydm zH}qFe-mBW6-?Q*BvX@#pk*%DlIIqUkiIFGh2v%bfBf2HnWnpwN3i+>h^@*^Uh zKRU69tYS?qJsZ!1j^{bw6C?A!XWDQ*S2FU5Gs(HSMNA%HG4E}>VJ>JjjR#ZBF+c86 z<^6fTmPX$4Yg5y$HNRQc*kQMNeI=`nx@xbnI>*CWD=nJGC+IG_qm6T~d1zq|T+Z)s z$9ADSyZXP8&TV;e#i)|=`>1;(d(L(5n;xv(>{)MopDX1yJzBk`SFY_~Q5F=Y4hc6I zf`E)!z|DC!aV~ArQl42ERXX%GVF}RNj0rotO0eoqTH+x`8l?_TV%Pef0jZ*-5FA2b zFnIZJ&sKV>H9!ONG=kITepEZ6RGs23%U2`H-38Uf=zQIbds}AEVud4PPJRt^sLFql zHI{MYdXIen9ud!)1%zu(uH;A5n)7ca3$sYYkc?qWG=}%qQxT7_#;8bn`#Et_#J0Z`owr-YFmwo&e8|vMZlO3Cy{d^ zMLgRJKA^9X#N#xg-9$;P#15GhO~9NGP7-&?DWS>kEDjlUrnAQ^lW&Qc zosr7W6GT2N;e;Lpo{AGB^fQo$ow6)s>%~Inle*l}oFtcKA0WL`(Oq_vE~Y5iPn;;wWOLYy75qsPO@}tRBD*+CUtK&#WU{| zS623y*6k$S>h-!sZXYJE9TIwCkBirl8F806YHF6pwuLnxclWJTSo zk}{YaVVNuX(!822{UEX$av{{1`?fQB!7sVP_99{SGY^ZkR^-&NjP0~X2Oi5V-RktC zL8IpG_DO!(3>v+w2gtDq27QVyjBqnfks+_`2}sN*K1&B}TS7q!gGZ3sXZ^JNQ&y74 zqyTzB{>`mCLr4l{rp$356-gSi4ul__{?U(vF60RTcM>iwvWmt9Xybq$JTB69$!Lhu z+$cLG*2w`m_TFi3>Y-f*G#Ia^W8LNu8f%lQR%XR8C&jwM!A8DCIj>C*B9A8)A*{ij zfnlAZTpee#Ui#qpCRE4bc4kT}J9nOy0VWIgl|6Ety(sl$=$4A_2s2(_ul_k-L>pWk|b64h|Ie5lv+h9 zN!2t3G@+bJ)0zburBbC)YnCinvtYr`_;<_)@KJmKe}Dv2HzK)ic8;03M`YgW7Ayb_ zJ#FM*UOa1{AgfvI%>H#Lr}P zX#ITx|Ex&Au3+l?$DiA~BYd-oenb7IL?RycHn`tpi+HQ+)RdK~?mzJjS?@u?(EMP0 zKcMze@9g!&`El^&z@z9O1@a;bjmcMrEEHEOrtcPSwHNz$JD_+JpI-dC&c6X%+yT&M-#Sb7gqLrc2gb+b0{+^q+RAAXDq203`= z2dl7WoY&6GjeXUawy;DXPzPon?cE03Vec=&v%@c2&liS%3jW*o=3o9)`3 zO>Zre3<3YeQO_)~vh20`vhDmeywgSO!7aOJ560GAo1@g3zeaQo`?~n>x{9B1hW%c0 z=9l=6d-ip*@$wPh-EWEFZ#P>TOY`;_Qy@kHwd0ujOTkm-^|1Ywy*b%eKiB?=+!)^H z{J6*6$#%dkY@R2EFsFMX@Cqse^k4yCIGdxu`HKGQaPd6V3)Q zZahPG{XwV2J{wapl+M>UzWUIYpbUICpO8+yYB(EQhy5U~VMSft9ol+Jn~xu))77<^1IKR9Tdy6V@4`O|_u;25=E9XP=B%j3RG}&%*9aLUB5mEK4uCX zQ(s$`{wbS5Ex*GaY6MY3F{tgL-LjmzJQP4hbjks5X{6xX6r_NwJ0Rj(J{m)ghDF&) zAR$IrQPx|>CbSffE97X^8Ha=>az^XB)!87773TfNtl8(mXMG7=J0sk%Te4i5+IV2D zH667nThR6YuY+n=(MavjK|!?a-=LgYn&q=SdQxM&{&Un*s5I0&>L0w5Zhh(2H_$@< zn$@WS=<9rJ$I9*Gig`VbSv3YkoSs6>8D#Zog84f- z4q)9<<2&-iYtOqSo_6cAPG-yTXh+4Pab5Z?Zk}FTon~a+u<#`cUA8qA?YZ5mXZ^yF zZ~D~Wf=atZUs%bui}g{G6BInBuUSUO>whw=mg^GVtMQy-UB~@1Dx6R+{rTj)OGoZU zJvl8ll-fOQfwLBy_$k<50Bp};N!FUrLNK~FH3#+R0*-n0Z>p=Jm*7d$g=gmvmo9|eX89^!g{%KDo>rOXPjZ7zwqh@c&rE!pJcFEY3|<98 z)YO~qGe#Vzhv>|1AG({-9TkE}p zzaKH>3+=YRO>FJ<+11lHB9R@&-Vpj&BN&Xot;`U1t{kG0ZaiA_pF0NiF$d8$@8isy zU1?F$$nWR?y!89?z0ZA|_iS^%6EE&dSA`Ozo_N4PkcPCiUU44j+3NKHJCHaG z_@Vyp-^hLWnauCFZ*2en-SY2L)Vb-h`pfx`-sS!*YggtW&Jon{a-jR$9`j*6<{h|7 z^he$Kb7)U`zabXT#|_j9$R*UTjhj1sCL2!LA^p4g8`z0A7;iD4Rh1p_?%YJX49FnV zAJkK2>F=Y@Yl|$(csaLc$syidJXeD?>}b{GJof-}K#RZi`g}Nqm1nJNoDZy}*L!V9 z>pkxMIr(iWYhRuA)xB-^Z`fD*t(T;mc4eEZpR}W$vwHb;K8NVzi6;dnOqt}D(w*TS z{LDD5&vB>mR;-mpdOl^?#y-UKv)IsdM=Brfo^8x1izp-M z?DfQ6@!d(A8eOuU2kjZE2|_V$M6TjyEa#TrU{K6J;!F*54UL5}dpHLns`HRWLU}V0 z_E6N3VtgVVc0g0YzSAm)|yBbjn zeL|)9q0yREK*d-J3E(YYE|WWg894A4?mZts{oJ#vj2tBTl&!?sh~vZyLwn{U?Gxf* z(ZmN=Up<4N1c*s$@hF&8SSPbtF2!-aZ|@>hS`S6lSX9#_y@YtpuI8mqs6RE!WKnfd9cWLl-hmm z-;Wt}Pp`9SwYHKfB~Q;-pqpEG`C^@0QEZy^H{54~dXpT@Sidn>mmgDIF{19xs4|oQWwvO*^|#ax3kvPFsVo z2yK58-*u+Et11*jy=}X-{+=E<*F*g`)Ovmq#mM4!Vvc-uJh$?sQm&L$tYmW|rb}hr zKssEEC4NQ_b#=d*P}}(k%MO6#gcJ`~lOD@yrfF4tc9h$Yr-<;OJ%k6LN zLhXEo@CM(N7qGE@F$%G=^7+rMR%fT6R(R}q1SVXPWp%$E8v#COFwa&TJZmutD|yrU zJXVZ?tL2>y+as^6F?7UrSRt9R9U}viGH0Z8tJd0=E-{D-4BQbat#a-b39{<*3 zjF_8UQQ0=oTh5f=$S<{oG`%xD8;xTK#Y=vX2fx%W!>`uU!93l)<&*Lk(ZAZ8#@rY2 z)Ay<$m1>#lJB|M`RfZF04$z`~(3SWi9NO>f9j`u(wyLh>K0#r8P@@|UVR+ku)+xyZl>DGz>3$AWmGxbLwuZT z4KDj5+M9~NBA+GJG;7tgv??oDq`owiWymTR9EXz|w4-B_ND-#D5$=)ZocyeiM}u|NulUXxpSh0X}c6%FYWtXgaJu?XRW8}Gn z*%p(m{6T+n8~0;fw1cME9l=TJsTrwS;d#LN@qV4ihUUZsI%_*=<3;m?p^}vjSlkoP zRI?LDR^cvD`vHPX^(ufa@?f?FFOtU+G=pipB57ew%dB2=_^syAaKDE4j=q9j=_E57%0{>*BmUrs7suIXyi`v}IjBNilj5$j7pV?j zuCxR%9KdH-0P$9Tmrh!FuFQ{NW#EjpDlUyd3jVatZ76-QoyB*xfi1k;-RcdzsxjE{ zd%TP9T2c`<8^%)vnhzJtfe#lC}M27GOOFR1N`rsZ`_Kn)6wfiy#u#-cSXUbu_!606eG zdFVSz{vhlnqIrQ3@r8|xgh6HS7zo2uS}p5B;QAQ&k9>pWWEhQj)+)zMQxXin@#1kR z#nOchgg3_AARlGnTW}C}Rgv+DA}Pvgh}6GMV9-Jd|7p)-!05glp&#~XoM7RM!8-)J zSXe6-6;(m%tTE`zZ}Y1!-N2JP=wVo;k@ZDGDLw9rN^|DZXXrPNArZ$t{1FYTi1NIZJ&qwF7W3_Wp&?nMdjfOj;`^;;tC(W1q$$uv^O)M?YX_6!^W@K0$5{+sv(YaK09 z&nxIr8bb^C2km{GFD}-2R9;M$J~8)mqX;R^P4_#LXTVQ*lm`we#MMcs5>E9J>Q2YV zwKT>20kTw*!>*Ye+!RYOZX`y^GQwqwugsKQy`|LTUWm!|=-GwQGu2tIxgAqF%1CS} z>vk7N%c`snf9Do3i_f9HSL%WQh8;rL8gGvQr`|x^y0%9yxxYxiPU&!A+Rm=f!`TwY zu&Jl&oUa!bUk-fX`o_*@P(@v2wgF%RKV+G4=G_!;C}-Y;Iw-3e;`PD{m~7I1MJ_EM z*DBOwU%qFxfL4)Tt*DS%@HOs7paA3DEEpIgqTFMNT%UhlSLehV;)+l+E3C2-sp0sQ zbdlD@jOr6m<@sPoq;`JM9c<#(<1I45hzjjlIX70FWFEng^=$Vm$I0Uj3M$cgXel>&l6t?glK1 zqvKMY1;mLww^L8`N9BMs`XRvdu;ag%%}5iM@AA*h?Bo4(pq&s@lcT z(Yc;T?)acYMxpKJ2kLS-w=ESpMliq5hP)2H`!@cr`BnT8)&RzEsHef%=U;xFxur7T zeHveWNt!E2H^bW>R|`k0Br0mWTRZ*I$tYlRy!GpP{H&=9=2xzk#;~*&fD$fKUkx!C%lq?xf@dP zIsxBH+>EY{U2-m?c&`4YV%-(8&^!htqk91&T?+mJ`gn=uDdBmO&EwnRQ(nE&@rI2r z^;;;GlN-tE#%`<~agAJT3e_;EF^ufANH-H~4%LsOMh>+oT8|;inhB)y^^7{gCE($u zC?pYmJ(7zr8UM*g@;^?74X-QgS$tS8#iVTYV1Va9WEl494(sLWrcph2b1n3^zdcUUU;QpGRL9E?x&4^| zh86!HUt7r3dV}@f4@Mw5kUEFC6o2Mf^S&RSl=DbuN6pB@H`UlI@b^x`I=3{3SSQKk zQ8@I%JiXV%n@ygS!vz|8F+1$|3#nyh`$Ga!$Uxw#lnB}Y@vfoI_oQ52Xj@Gb@=f|` z5CA~tUcKr4F>AqvMEbszcNNJS+dMN)|S96K$<7+96^eHSdW;A5|Aylx)hsd>`sOd>974Kz8)PpD28^gnP_ zg;_YEP(_|2C#x;n*YcvHu5x665U&I6*x3*mR$DkAChsLZb#K>malm^I+2J!d!p?Cy zkx7K-i}WGsNxwh4m1=xo)JTV%NJE?RzJWBLsP?do!x>sVpCzN&gVE$!nG(o^2$$7d z*=}HR1c*;E1dT$DEr&KaK33C{btINOX$#$wmw;@EP(x|{S>GtSWg1@)3M&8yWckC=-?x6(_Dw3q?#h)CLIuz~GL+TpNj zH`*iiI+(?pC!SXD(_2;{ub$@Xr*_sMYftMmR`F*({1weH1&bWIwrP>rsv9H|N14#y z_q`>?ReQk_ZC9fya?lHvw)Z76QBc5@ezRuSBzCONRWO0nQwJ&P0xtI1**-e<)fR$8 zF?8$0uIB3xh7C`@ljL%s^E>6K{qh*83v>7)Q&jMz>{C8gR-XT0d73GX_<3WTBW^}# zQd?REN+Zb0;jXhmzT2?#KfG<}euv(*c5b%oW1DB;AX(e|`JUDLUaTyiyIl9C{j+io zuIJ#lk7r^1^*b}s_u}q+56O5Z#6dcYKn+R8RW>>@{*n-h(UDLr zJ%^Jt+u6~TQ8#oZ3vhnCLxJ-tI2OoSNoS@S9XSZlg_|2RzJI?HZEV zgQs16w#2f*)VS|rrW;0`@cq}X(TB+e;H}=6_J+xA5OHlt`Zy9EA4+?Vw7n2!wK{)A zB~a~qOXumY^pJh#8&FZ%&VI_IXqP}q- z+O)v0b(`K9ee`ixmYq|S__on6Df-UAzUQ|seAmizIF~k7ExF;kvj9w<*IeiOVf*=h`*Vpa zitY0au+#SU$vv9;U-^d} zu#FGasSu`~pwT_1K6_{w=^Qr@^7MMB?~~T#^z9xvZ?9jC?ByEwWh_0Q9de0%k1Onc zzZ07asmUcC{h`a*e6{P!E~udB|L<4X>At=Clex895zN?wF9r+ZFIIFlKKfnvF*B-b zzsT5s*Vy%I$Gx`m9eZyK8UESpx5X!AZ0+ZKKSbct@^}K4Qr?;b_oXVTa&NxfTXS*J zJU;q8%4=$4PE4P?VZ3ao#w_+lN_c~f#4o~a^mFVJz1s&9^?0sA49WKjSgL=?e#yaK zdN^$_@j3Be>h|d1&i2rcUpsr=bN1@^Xh(V4>cQ3`*%Iybj{ep!*kifz`R-2P+<1O> z%=9j~Zaw0xC&_c-Gz~&e(~i%8p#)8m1v7C2-Ud9w&-Yqc-N#+4{bk&KqY2{te~C50 zCz6;$RLDDfEuE}2SQ$ZCVj>P#)i$Yb|A+$EqG}swcqYo=wX= z-I}O#myeK)pqwoi&q#GF31%VDn__$F)->dc?Dqb#%n^9s_Ifh=1;iXIO9Ui}nP! zsMkm2cp%y~voAPL-<6y{%nA@J5J9`-I5_5SI_1oU|`nos9 zmIt_gXLJW7-~PGa-aT6E4spv^e?6Ytlef5fGY)_H!T?(TKvULpK1V(e?i!#dXFKrJls}^U~hArKj>TJl@ zi74Irwa>8RlSRtRlK#ylys!qtCk0AV))0p`eP!Dse6kytVrPU~rx=jHK08Cpu!+VQ z2~3!;WEzflN5-A|U}XN1UyW?&a>^1r(@K*74W(yF@9f|K9puCsJU+kF>r{Bf_{}g% zH^nw<{%>&pLP3!5_RY$LB>PzMx$Q064?|;jNZ}K;ErZeNemV2nLwSi~6y~OJDz0 z{amoZME>itez%zVgE5N6#WAK<{;JU+SW5Pi!7s_Nh0WMivm)WV56U5~w@Nwl10sA^ z@bzew{()l@7NtYan{CmMIr88Ryz~5Z^uj?@oXL)|$hUfPkA=F?e3MZ_CS5_1dbn8i z3DnH=&Z43;ie=7?#tI?9?cKZ+0V6^3z_s5?Y3*WKZqCtbH2@(_Dc@$j-l_&5b)4rG zUkmjJ0NV*3PIv4rIMjxjsTChBmRt{;vw_w~>;jn2DW?!7Ha-ih(TSJ~@()!!VRDW_ zMPrT)|3WS%6`NGGy?WJJck$}Q3rr|mjp2wILmn7gMO#DZ6F`kHL)T8gbB4&d z`c3+KaP;WPo{UJD%6vcN)0vxaG(|pB7s$y8%Y(ROfJUgqc!O!BLiH4wtR||N*Apyb zR}6%p^XMJyd|F~{OVFlH1VK={kJy|+CGC?}R}CE`4E2wQsSD2RTjH>#Mf3Hwt;WyS zcHXH&(fD@XSv}i^Z`ZyOH$1!Mp}65wDzYBA0DKegl<-_X?7i=(1Z;Y*H5$yZYhFn$VSi*|(U)rD9cXRe@ z6vQe=?|Y}#xct?f-26{j6SS+Oyvw1t$#{=3jm7u@zS>G}Tj;)ZkYiHYY>sASmC$+5 zAr4xDcF!7{mT0YzY_05m(OSv>3v0#noKoam`K9Xxaybb#u8-GC{`&PYn$HTHz@5zZ zMy9)sriL6k@Bj~T^>=ghUAA0n7Y!r7nZfQd)_sy1{lb1wAMH+_eVt$5$ao`{iavd> z6-XBVvL!qmshny}N%2~1E*fX8$R?qI8j#F=v`>QDNe4C`J|R))(l_js&Dk+PzNhS# zKsRH%!f@vemH3XflNc@QWaFK>D*=D_h9xp0$WLPHO{)x1+vlEr3=yh#Oueft+IQDl z0foA@+^{`TBd^HeZrrP;2#~LjEE>PLZQXel6>9A~M!a=G9^jMs^NQmbA+u4<>YdHx#f94`+oRPGvSFh4Hs)K1?&w$$VA@?3xZSy-1 zz69e9#%0R)qWfuEGxNeDJGPxw&MwZ$V0-gJ^8)Hu(HBD#Z?)E}pReklxA(YzV>9Nz ze$*-~yE*dB#^W0Cc*CXz(DsHER)%QT#n<a7htGmC=Nmxd#b_uH6I#d|$lNuhBAoc48~;&BWH zMmAvk;&sm!!(cY@t46OmxrY{LigkJ;xNqm2D_fR0Y8+{0jm98jz#r7rq6(nrdzKl< zNZeRQ{Ij)zeC;6v^;YG@@r~M+yCoKk!+31qPF2P6P7TYte4^Vsj-0qtF>!pOUS+#9 zg1F8x=ClpA;-6u9dAdq%$m>iz^F|s{fFdo4oIb?jX15e0p>&8mr{2U=?pFa#qJg@y zUQQeKGk>ei8NX5a^ZeL~_iIc-d}vn;t8f>kaDZ=l2br(|N67KbN<8U9^uZc&u!%GH zKgN^V8TC;)Bv!a6MT{0#$IBitS9I`8#Dr2ei5~L^3fz&pm5yafp)z=4z-E?<EhI%swJI1)cMhtd*6oail_BXpSH*CgV zH{-5-z}3!duLsBte2P~Z@l*EddP(-$b6Uv7l^=RM0^dL_`@va>n@-@|uK%4%PbAm* zbcYblXU_-T$if=dFnIX4Q7ZQkDrkzYr+oKq-caG&I~CAs(6yyY3vTqGOA~6IP_T0+`Z8N1 z_pH^%m@Rp=9xzjhAs_i&TS2xlQv24{7`p`5#`wZFg?U)+IAx|gYz^*wdQ#?%>P2+{ z*qlr-w*Qdbi`?hC>Z_eAvhsRoWYxpb9Oe%E+;M22P0VSzH*<`|DaYgvIw@Q8)y>k@ z)WlricaP>{V;1i8ufcn~k6AK#sVY!IBveL9QZ=j{TGVfOap#-+hREOAz-YQz@b4Op z?jP0pni{4_dH0Ma<%Ll84U{dhAdR^5VweeMA)dNcFRpS#eo~J-Mg~i^NlrBK;uz!S zMW|1fM6;5lbx`)NCHCpq_6hn2p)ZR_dKwmLAa$AP+NCyw2~r`UEv$zx=EhEK=Y%o^ z<)yRJLHS|HW~La3(dmOLKBO3zcL~~vsn0xy2Zr<}_NW-Smz68=MqZ5E)if6(U)VFS zXqv6zdX$#^Rb)hZjv}+M`nvX9=48x#XzP|7r)^rxhMjW!$XFsLnyKl;@y_(`IM&e+ zNE$)B#dUvdcN%$?;x03{lcdE;_UYq#a`dCwMtX7M_Zyuij3KFdmHtc7K-6_)kHg=8 zj!GC7`Q7yqQP%x)d$d?AP}-M<+fsgWRkr2|7fK7S zQ$3%$@jtt^(&T&42$08SJX#SFIJhB~c2PDrquq4gfw9 z9m0C~mVR?sl?%DT}rfzExeR z1^w~)vNNuYa}W&|&hN0cOT^|Hr+e75hBahg#$-fhU%O8A2l4Me1m<%8O>wnKpd)3< z+O;BR-t%d4W=ruPP(es5 zU3cV(5WJnlz^pFg>S~0_<9MOQOi+jn_hn^pd;zDRs~pq^-#-26^%MUCA43h{0001Z z+GAj3U|?Wo>Q`9q@h_g=<||V-2LlLPn9suuqkl5|V~}HDYXEXVl0Y2*K_?1#0001Z z+GAj3U|?(bdxL>NuHh%c9|k!F2A~Ks5YGVshBO6|0001Z+U;CflH)cEeU!D(ZqJtA zROLi-j$9xY;05Lm`N{?JHA}Z+N~8rs;3moLo~gJBB?<%yZUR9Na0{RX%qzpS4GK$~ zeJV5M(R{_9g?&(@jKnKhcBgUj_1x;ies$-@I2Z@CyUu-dY-{IVnCAcwhC?{Ex3v;m zKVYzO4i)Ow&(=A+TitlW?L@kr(zkTCKH$M)@t}JAw{kJ@@5C@cdQSO(*-42BJsaCp!+`E znmz2s%=Z{~Dcy%P^sz=1OO#vcL}u2%pam{~W8D#Y}bZ{yY=OOH;t>%ZeEYn zUPAM1=6)_+ z_a0>zW2)JF_SbYz-t~1JG?B05UF6k=fYbGPTH?9hHuB>#<6yqxfNur+VstGgzYWsY zJ-^4&vAKgyVpsjQ<{PW%a~dB%ixt}@R?knNEotO8?e74R*a8t8wF(;VEImIL2#U> zg50NCP$&SChsD^DvC8oVDNp&{@ToTE`bX<#c(EUZr;5}^=eBfQ!uFQid>1x+tkivq zXfev60IoQX2T7;or6{M?*oQaYA&@qcbckD?KWAI`VLbCq&|l|mxaJ?PFpxEIBnvITlhfQ{LVecx~}8Yxwb4}%uD2t0QMwx^78gw;^*;7sDtwl>8zeO zy}v}x>EoGr+Jmm^Wyx;>LJx9Q^=I$mm>}WF36W?d^_ZQn7s?Q zHm(;x_>Oeld6D)%c#`kECC{FG$Ag2OJpK1QxbIVw^kC+1JXfBNyPr!h4`OX^2`$g> z5Y`a|Gs~nNVY-xFA)(MBbBYB{L5L(!k|Smsodv4epiCWFuO3R_s_hMxXqi$sN)_o=CI3P`N!hlgy^rt(L*@NY$(>{Dy_9|}zgoC=d-od8T|tj`S#ikq zv!eV~{@Jn9vcE-(rKy&#g|& zp6hp_lJXh&7SQ*C{GexuQ>g1wJ|*&O;e$xqb&BhbSgSYswl?#fHF}cPldW-qljNvv z! z*cdCihK+DGL`0SuHom;y(SGS$SxGiD5t-3&e?soxRq1bCq%WXA_d^Yxt_Qk)b9C4M zrjpKtvZ7(WlMUOS{d+@cg}JEB7x&w@3~W3=#zpEwExrVrNE(6;15r;Y^r5V5i-&`W z=Y@FhQzn65i+YpoWhsA~fAHtQjJz|xKGkx_=wN>t`@#1=uxBiuLD);{?$kA#U-n*l zCQHfOJ$+as{O0{l%du!U3x0{3jal#Pk$qy{o$aBPR^4RgiOBIYk)LNlKRMx-wXLnS zvFzY?oL%>eGm+I-tq%|JXIwQEbJ}KOgew1hbx@iU3~{JE{W(mQJvMu@k~6nTe87~G|RD|@O`vV z%wXTY+NaB#{EZ6q3*%x|QF->sfJ)f2=vfUx96)UEKLz`5#0>ubR4_(8v}ePbVc*&X=4R((Z4VuvxuyS})X;EVY`|L4x%W;1Kd zHht}(-+qCt+as30I0jg-Z)Wcr6Fz3D#)egT$MhEbTkdfV-{Lc~#&-(^|9ynFIffUr zLmd0P^@Ce`{uu36FXjUfiw7jJaJP883{8q&Mbcm~g&;ALN}^4HiSsClovh)bq}WrF z>8mM7C&oC4ajcl1=$x6vJQ#sCfOx#)(uc&J;cOh-J2S_p`PeibOZU#%s*WTs;^fYO zw!E$9=<+p*1EDc4G+ypR=uX7f-}Bba&g5eSj}D%kJ;Ju<1LE<4XA=8yL>M2~VUDXA zNI6aUxN)Iz3BGT(?3uLx=<4*beA>+QJvsW*=gE%tZdPvOapPw!~7nfqtw z<2P5%#wWgaW8vc(&!qg(_sO;Y?CS4;Sd1Qvxsz}|!2a7tDii#-&eA5WxPN}-`An7g z*O|9uFRA~(0VU~HSa;qnv6o4-DL=E4n2MU14~ds3$B_Tutayw?M`RI6&oQo3Eay#* zNHJd$Xaw;?qix-TZ->2?3V`A<(H>kG|E+sk+Mk01`d?Z!uFRL|JYC+W=S{*uWc$wu z;T=qP7nA-^ht&Tyr2coJNz^C)cZQ^I(KzIs4YS6^TB|!ReBy5RZ{z<)6zOdnbi3Mm zHtVlUZ(Zn^!vA?FuAj62;ZP=0_lQs5BZqTN)|?UacoWf0cN)u8W0*OAsETvbB3)8{ z!T;febGDzZvX89S>=pKu)O&!z@JL~&M?wP!=w9JY;J41&nsY#dw8;+fo0 ziC8vPiq&Oz|Hq>9v6^gs5X2N^M}r`iPb{BUbznnU->CWUyU@rl@36=yw!dRw8!ln$bgg1lW)iMmeS04t!Yk0gS$7^yX5|^k1Ys17Q zx*7zpCui`yuJ-HJUVj<{Z>aSK-fzJ2CXL>-|0dnu+!q9iBboigG)R0h2$Ik*37kpP zNTNm(HIwFIFeFtcshmmakPOCTFeam8GIf*lNlusKqnW&KrDbB?!tpJ&-l9v2^o&mm z`lq0CN*bqBJEgoSX`jk_s)`KPRCuRO!1OG&_tf@Ni%G3^8h&Z?CJi2GU`?Y&8gRGo#7ds~Ie5@lFe4TJ_VanHGk$<|!?#Y3ZI;kKUoxJM?(R zJiSxle+~9`@O@X@yK25mpLBSoo5bjqUas_>GpL_|CK+guLB0&~WmGRCEE&aRG&h-G z$Yehg?K9z+$vkF)J+s`I%~BQ`XVJ6wXz(7Lv*MlATxFFj8!Xvql3k7L;wJYRGy9+ELrK0Rt(TOeBwb3uRf>Npxl7|#+H+|&Kd1TU{J*gF zg|#o}P^LT+R~FB*;>zktIXaYsqn!0}aDStf)5hpH=K5=r!!PpX)mUy;Qw-t`9?6rccmA%$O?JoFs!Lh5pcIDd@mTvNO^V?nS?$)}C z??KNVdeK9CPn>(2x1RoH^wRfU^adyBEv~oo-3RYJc=yr6A8G$1Y(H81Nk4vaj{CyZ zmkxdP{%1UY#<`!he(>~@^A|aPp=W<<{qgSaoD6Vw2gox3_FvWcRi1&?2C6*>_CbCJ z^B=5-gXuB^_91i{0?!ay{|5VS{+SeVCI zABX!my&8|_c(}&HI{}9Y{3m#x=v+;NX(Ing>QD0T$Rz%M!Ty(COs45%zLQ~^VtYW$^0!|7?Qinm`ZmY>%;7hO-&}rk^>(g4&ht`)Gapy^6DR*GLqvz79#!etd) ztK?s0ZdQ9=tzWBQStEXp_%*Pt(VMmAVXazgJ+IS~b>?9m4C`@N594~6*3)2v92?}= zz;B}*8}(=-tv2%Aq)(gla+Cat5$`FaNz}exLPy*7w1)&$-^G z|NCItPpADf+ppe!c@OC40a_gpd%*iaaRIH(T?;W}tW;$e-)IbQvEb>giZ zqU|BI51H*l_#CGFVeg0Od4xtsa6Y2m5&9p&=Lj4};5drUQ5qlB%cFdc;&M!Hj=^&b z|6|UcRsy_06? zl>VL4qf@w@!tE4pr*J-n$7#Bp7IRu}PV3ES>!+=s!TAi%XXHAguV-j+RbCzyr z;XJGUS(wh6n{#TM)4Ox@Ifv(Yc+T@ZPm}ZVp2zb7T`th=g1i^#eu3`=u@_;u=&W6o z^P;nO(fTE|F2Q?=ZkOqEIoto5+LvLy%;$=HS8%>!uCL&9MUAWeK3=td)ofm+;Wd9J zuip@ zVpW+uFI#_kG`kvvUQzoM@vm$PLJ0~nIelA(5{gS`|5Y`8Q-*v~hF;_QT5q;52qj9+ z>?M-N_hjgGoL(36`tl(3hT3nGV13!HAoM0&Z`Nge-{hNETw=b7@lPyo62878LrK;L zp``hkXWx#YWSLnU!zURnlFO4^p5#M=&|7M}Rgn#6a-@(m1#BtsNNLaaVkjlwl(45f z8-!BPDHSbK(Kt2iscDcJhSao4Z9h$VM!PhVnA*MvLvO?JHvGQ-LTPE_yDyX$_jkm< zgWEetgV4LFSa)VU9o^Ewkq(Y@s~N4+%bOmK^m3)=<6AG3!F~q)%3wdETp7h=lslvS zO!|~bpEBuxCR$~NGc*2~@z0_^S;S_c+k27B-h1BPgE6Z-S;b|=KO5b$$(N0u+2PKv zRu0&5*w0}tr~RDba-IxAxzx@DYi>Aml-gr zK)wRBEl8(=coc%A5S)dxG1z_6h2FPbM6Dt)6rr(ix=>MmMcXj5Pz(>>a-k34_)srD zq`mLBP;ohn>uYhiip%j4{Xeq*k(iJ8ehl-+_C8VT6SMG%m=exI3GpT9^eL>L%KaHm zpW*Zw+@G0|lC&>rucV%r6yuvNR7#%Gv?~oqY57aj?{nNfhv9R%KZpAZbMu9{`9e$? zHOt81`z}-lwzA&K(yJ`ra^}uAUZ|YDeaYubYvo}mPyesf_zLf@{(FY;YxDUv9luup z8@>FdIP?CE8Sq^fsvx!k%)aMB-}3p6cE068-|5Hq=HPq1`5xAa@>JA^O1M?xSJ_@= z{3?sBLZ>SBs=!^%A_W>Upkb?&|4LeSY=TsV`@JehuVr;0!d7w;{d_;cjR~ z8p_j<9*y8`r00$BYiz%P$7|-&7Bp!PiW#W_ULj z+uYv}-*%zqa<`ym3piTv^=%jOZ5N8u_c${VC$De2P)qaL68=_ZsFggeytm@p3a-|8 zw1%a%e68hcEv5}DZRpX4UmI~hII}`W)1*61x~tcnhTUn}1BM=E zriY&Oz@aBjJ-zpouP5z#!qiL6UNH5dLoYb|6CCP|S8qPO^|_DtJ~Zv)Z%rRF_#+NK z%J(DxAL;fJEI+CFli0re`ojJ*EI;e*&v5)q%YJb5ldm7_zrg(q9{q9aPuu?D2H-fr z`T)K8Ro{P=-*;qaAiM+hZJ@pnRBI5dgJ?HM{9w2Sn~T9X52pEGbqC`!1fC)A4Dmh$ z-rwZ=O`W06-cbD=itA8&L+SfFp1;%ZcNmAkJWQ@(^8cY1f6&|aW@tDb!*Lx>&k?j6 zVV+0OdnDhH`1#%pjWW-p{f_o`d5oTqk^4`1|5Sghn6dDWGcV(C8K?GmyvCco@#;C`yYMz2alyNErn$nU6;{knLaN!6U)uS za{DXvafQD*zWqWgysuPar93P3YNeVh^>vl{tDLh{Fs@c_wRu?$;~G9|;9JXot^IZK zuES*=JnO`+v$tMv*VBGI4cD8u4fNc=-?v|A11uZ8Z>04`csAu}RD({5E;t zjDv5$&}R6y(0Ys5E#_hiY+KFcR_|MJ+{*V~SpTKLzck+li*Lb@Z^6(uvD;~|U2flm zq3!hB4&!#5cF=2wS=)ib4j6ax*{S|c^SBenopSBMZI}M+61Pk3UDkHXzgs_d>)CGS zb&vdeaN8r-9zMPWLwo7FSFXK$_VU@sXCI$^&h$R~_M5x?@a)&G{c0cZegKC9&dmY) z2fZIu=b)Si&E`QIH9JIA7>}b*9rMg>di@fPny?L@Sn!zwDWa_mS@#Ei{m+b&dGD0 z-+5YJfbD|XzMDc9;lD`VOX~Vw3SH8d%W_^;`wCuHV7=n+(p4H>vwqF~bu;C=Cv-z! zZ|K`i+TD`tmYCac-8QFp@Vm?Infd$nAJFfCTE0U<59NGl{gIeQG=6OU9*cPb=M(Qw z)qM)fQ~u9zd`C7+xF49tPn=a{5*XzaFrvOkUp!;WwHxzHh?wruf9E7(9uO2H_+{8DHN9 z;UwD_eo13lHdcYPVe%(k9)y#ro6MSTg|N@caB_K*!CJ5&EHc~Z!c0=5+J zrx?VnrNlMm&>)=3UaE#ntFrAE*;*r zmo5<#mkz#kXM=EhywcMyz4!ERWq>gQTp5Nl_%l2W!Wq41gdwB-O#Cz9lL_}s@MW@} znI4(p%?wi(e6z^sdmx;}eir-h@qZ7#_u%p^5YEasEB@JF%%<<=*Ul7h+hS4s!*gUk)V?B@cyfn+J*Ll^?2X8)D^I6ZI zi?wH-3z)A0dV;Y68uZhr3B4BmGe{ieM5wOLxex0c}e(6;#CrtlJfX|2$$ktO5M^pmlji+ zZ)rN0w)Q#y&#n262!9UG7jXEN2!G-Ii(NsujQuijm4UI0`enVBHPdC~_bm}Fr-$Y2 zm9zJy{Jtl`<*k>eM|r*bO0KV9{8|sc)&t)V;cwLT{SdAo?pxY?3(vQBe&;-V=iGm9 zKEH>pqVvFSRZptwNi}m`&3-lh)%;DU z4qJ75)zz-X?r@;_8U2 zYaZ+3UsuoSiKz!)Jy`0Sv-)~apPmiq*?_(c#5b_lP<%u24e8fNd?R&yQ-mAQudy@G z*vvG>y@~ZE&Pfxzn|f|atEO-_)6ZsNo71hizBISqTx<(7(1LC)oa;Dw$@b4>0|}zpdD|G;T|Wc6hX-PkV9g zY1y6z9q8Txz7Bjk@aZUjM|pe`ggc7wME6c`cA|SH@16C%Gya|RsEZzSaSnV7gu9xP zu6T8myPMqI)aj06cfQ@_>cO{%yglIViEB?jJ z{b}4E<^lExh#jE+1I+EOH2)Q!Up)`>JP@vdVh8ERAUY26J_xqK=EJ={JXrl9o`?AT z&0PFu-iFf4{XP7)|vUp>HE_8Ugc2T8yO8NZ3Zn zGfJOFsW)2OXzQarkAY(hUB>A1pY-}u?muB1YktSdIacj)a*lI;$C=r2`Y;Zk@qEYY z<9M;-&C3M-6Xcq}eEAqj=EFaqJ`3zGp!ouOz5&9EtSy3LF|Ld0 z;r<_9qHjy+y2SH8^!^8yfA}orvlP~)|2@OH42NZ&m*KOVHp^jKZheLI6?m?|W2L$) z`Z{q#Fv?SR||X?M{2LGyc1&Vw|Ghbdm) z-P^=K>`1W8+MZK|ra*n1SUC25UXL2b2C#NLTm z5nk{6;XRHVPmbsNbwAgA{_g8OPnXl|cO+_CmmYW{?Az~ktV-_{JI8Q2%n*T>&z`=* z%gEDhlOd4*;=v!53c}O6Z3_nZTE#12ELVdv9m`dA?+#;8?<@)D6-aQ;ekQ@=zz)DO ztqg94+Noe}FR?-VyDo_QcQIdA9(p#PF1}xRitw)V%X$;M5um-N=#P=T9ZWc`34mDc zC__&+AV$N)Rxh`{l%xEK%X?R$nVf;;u)j=;KNPU^1;~ca{rJ%8Ts6;9b73KXN?!5Po^6VKV6MdL|u?|Km2DS2~0t8MIPNf_6j27+XaSU$I9|FnFpio0OIByAi^flo-$ zMhCi1~IQgg&vD6&j zDq0A&LOCsoYp3}KiU=eTA>C;q5kkSC5kj>it3%zEKh6e1&nRna9Z0OTwX5e^u=xcZ z;Xj49;+Zzisv8c)5;2`;9O0NHLWFS1;>oedZ0%hS%?9I`+*GuS6RY{}YH4co4KUd! z;pNH-^GR!2kI7SWQ&ihol{c;XpVCjE<@aC)b+T?&gVdAH+aIE4WhxTD9CbklWs%x; zbwO@6MxM%b1k%*W;!n}12XpizpB!1Oe4h3GKJtjSeC5&}6K?R&XREpVe8|_G+y$T@ z!;HxW2Lw#1(=D{~Sf}U9cPw8h#}umR%~&u08L(}xpU$M+`^(^k_29XpJ8~0gs?Od$ z%FjU@`@i{zQ9~r2PmlTt1Su}fu%DEGiV7!!>lECq)yz<53#vaO+8ue2^4w65s!QR%Aaao^LZtp020A%1n2p#4+n ziv`cpqkCO~kVJoet#Y8XkyfRY^?vV9#orx??}FkLU=>%TGj;xnsXp1(E2oJmuR7RQ zatMd+iBUo7vsZM53wLG>-j3S=9SigCSdUyy^9@vyr~$Bc$oGJ=LN0 zhiPt?K!*6ZQ?dG{M^`;-5p@ASUexp)h`n=*IpOma%l~`-#pUP-?3DD%`P-PUkoPr1 zFS#02l1TAr#jIXf{zTkLV)Ct$u@pJ9Ej|`Lv%rIC#@*8wdU&S(cvT}BPpij!38&S~ zO~3ZZFP{GKFSO0tXy_;MzjzuqC%XPndComTM67x13^jGth)j4mcQ99S`6je^JR+)f zKA&0f$hA~u&+JuN=)7j3on!DyBio7ca1SRm%dregN)XwgEGHssJF&o)TXW{hs0x(j5J|SBravsf zdzx^rU@y0Wk%Y-@1e)e#h5HPIrf4-|QG9z%imFydCsd-jZ%d_2=e0YdY5h`n9Md$g??Z2;uH=?=t7g$%iXOJpLI5 zK86+2ANd!;-wPm)kPJc%r`P?JEmuCWN}$nk5o*{g66!%#cMW-R{twZ_YFh3tnhe6h z5SKLfV~>$0vgG8yGh9!j`WZsyqT@lsu?=lisy07&H1P@EUEl5`OXa@8CJvz?6v+~) zFRvr<*q$M6Q-hpW(q|=X!uX_C@F4K@T`a$QndHfPzmxZRl50CpwraR=jq3W<&omP4%wx*?vZb`D&sQf@Dq7!3HFe!gM!(wI{cx`@x%^PK z&>}O_Qzr7tOLp(o=yW3nl%8Gb{Z*U`ES11SkLf30Y<{Rfh%PUeq>6ZAO0rL7j4L)#u4 z*wE*89xydss(8iyvp2hRbdPwsud&_pS36wQ8Ga!2OJ((hMWj_FT9nMkjdaQ$C2`am z&mtUGtLThP^G%H+R7$I1r+3&I%+ye*kGqP1Gv#ci!vKl+syi^g3z3-GBGuH1a?eZQ zxJv!n0eACXrLig&OQxE&6+ewv-RP~%YbyLLWrNKL%@wEDd2CF_?*3*eC|34KSL=jt zldfPI)Yfsuc%?$s1E!a@|^M z$%*&X-)tMP6;3Mdqg73|jjI)6mR{S9lVx5A+A9U7M;$?~FSHlhoJ(uwgNAJEph2ra z!3kBR(}e6ui0^b)vkEoguw0@^Wp{hq>b48=CWd^O?av_TY5hADxe3fC`KKQ$^D{i} z`e*=IH#K;GtmTt;ErKz9zt2Y>4gU_2{nikZ;i-Pb-}2O?^qz7S&aJ}8VAYL37?8aX z$CLGIj(vJh^3Fx8p$pYLQ!Vy=(0yW~$-vNPnco~j+`d`k+{&SP>y^d$Y04>!BahH{w_BN5rzQ^nCKh$1XtcC;<0V{bBf7waYA z6L$WiG&Br2H(sEuzw0*f%br43@!#KH8N0644cT^Q!G)S~^KDBLIh+ea9>Ea8=h7%7 z0XxokW$)a^+=2MFLj(39B6^PfF3-~kRpgHt*7rEhcrI0~iOKs(@}#09)$+M%2)G40 zl?8XhH?)zuPw?|}Q{ahHvfp6et=dx3(Af>-?FrT!gS9PJ!ceZANLN5#6@PgUPV5 z;A`j!k+fK-J69YIk1yPp@A%yXSQIrh4t{Tys}rf~tMBi<;KXw!J(9ANU1gc#kY2F& z09ZQaQ^9UJnd6KsDOWVu+dR-;SL~V}%Il&g0wx126SCdJonwNp|GnNguUs~t!{)NO zV2QH*uiv7h32mL)n&`Xpp3w%756$l&(d|`2Dvm4QfO7S>?&~$igG-=IS1E&=f zJ^ZXoe?uClE8E{;$novTds*E+W2hmVPsye;zM%*I5Rd%$&BkFdcFqEL+1Nyr=9SwV zw&>s!#WJgVk|V!cuvx*3ENY(c$8Wi8^rhaC$^*Z zd%XsYJ_9hSOPiLqInBj4*INNx)4HPjg5T4>aHb7wv}}+Bw6BL=#$GH9G9@p$ZSKQnwg-~_TVtN$&y)>Fx&7OG7|>A z7r{+p(Xr^B^M*Jzv#$ifZ4-Y@W$JbrYQoy*vVbg35oKbODPAUri&+%p}{VHH$y-CCtdIyf15}k~$lk)e||+QB(U$w4P{h zX{*#ME)0U4j*n0mNdMuA>|h}|cPpk`WOTp&qzIs?|8cKik&(zLYUTEs>8i@tB?X}9 z)gW=V!2f}ZKh{i6z_WEr+8X;?mQFvk8(SPMQ~&p-5K<*i=VQHVaoE_ zGS9q<_5EiN)cd_tD#>`pOL(-%J51>T3`87xd7*El($$ZU+5((`aM!wp*8o%w29cg` zrCBupI31ZJ-kOp?&oT#!@@TUtd`)hqR&hEI5z)3HiF>FF#)^0#s^(W+jT3!FhlICLvu%Nqy$kdivC`XhfX+&60Mzy}^|;pLmCcz0eSp34Nc=^0Gk@9(ntmW(s=Y=zgq%(C%`zizP}rb?ORf8)i6hWrDv zGrOk31L!B!haS2&<=IfptoX*K@X#)P^Kbf)FMHvIJy)BjyO_nfQJLDv&K`P6Xj7aj z;P&qt37iN0u8do+Id1>;hhvS?xn>>4?{ZD}{5B(dlbp}BAHn>;5x06rT2273NJsn3 zfN@M1jBws{Qn^SMcubCa{2EFz4wdB8KzGrzNBuj^3P;6o2=^MJ{`ZVas%t|Q-9gPr zq)>rvV0`_$4jfPg|ms0^}@ zw7}`L)>|f}g_OdzHfWM!_Thn#^iJyBlTux>)BTPfQ*4J2S9+4x72nk``sVx>6*DDJ z0ni=NJr?+TrMHLj&DG!UKT4;*df;J-g*&d5SZ8S^xeX7>%#?)X(h>vlvJ02gq=2Zn z%=~7+k#`9zU@}WLE5mdMXlx( zCIz^v_Ijd!xrxJD&y~}T1BTX=SVy{obM1!Ecd*IN1Cm>H0B4yie5IKy?$Zb$;Z?bA(OBn)G!}mmiQLt+F+{ zNo1p5{mNpwZfvJ&Y{lHa_M1xr%4aXy!~<(rxu#%U8|kE6Jv9!EJfZRT{0iftX4`DK zH*Ijf0)5oTawQfx|Gw9P&@>w?5r3ZcX70kf0l5HN@FovVkK(x8+xg%kfC!G6TMcfu zZubk;j-P#Hf4ntn4<&BY8|{(~_M)!dVs0PPEr-)5g+xR%2jBgz@twV3*WsMw+leH+ zYl~y5u*)&=0Qi2LA(Mj;ZkCj^HEptf_{hHZ2rIu}7_ItbM3*)D{mNH`(zD!>5ti`b zF+vq0;CpTqQHeuhV}#7w?&oR&Degji^!&>rcrBRaSme9?=)TC>dc}IBzwO7}iW3hU zxNAjWemaNeWT1@gJmmHw+bQPrdI=)Se_>)f>vaCh%ERI2>~}VcKG)l;Bb3;>mvXDd ziekuu39*I~!xYAhX&*jQ-ao-2uY1}I@c?rIg|D4#9=zS7%Z{N~d_1=DL~KE}kaKJ~ zSt02NpM0Y2{I71NHxQy9)e9j#OUjLoC>S<9SDK70#VJi*x!{x{uQFQJAqVXH>oQ?C zN2nl(&-k8EE(M+8ih8vjM|uv>$X31XjypYvcz0Waom${C$EjSgdj&j<-{seU!VDr^ zpX#&J0t3aJB_I*>94WCeNkEooy%sO$-fyJEHUQO*1~2S6IiH~l)bWeHT3EWfC z^{9_f3#`8%Z-n!t#x$RH^azk$2pxd@5flVriH#W z(rqPjBN$ZYr*_otmeH|!ptG)wP}oeP7-iXU$pc@n&@p+�EuV){`~4@J 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