From 94be17392c1faf54c101d8f98b93519c2cd9c921 Mon Sep 17 00:00:00 2001 From: Elena Crenguta Lindqvist Date: Tue, 11 Jun 2019 13:53:38 +0200 Subject: [PATCH 01/20] =?UTF-8?q?bl=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itnot/index.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/itnot/index.html b/itnot/index.html index 8f1310f..6f0eb21 100644 --- a/itnot/index.html +++ b/itnot/index.html @@ -503,7 +503,8 @@

TX send it immedietly back out on the port that it was received, for load balancer cases for example

ABORTED basically drop but what is extra is that you will get some log about it , useful for debugging for sysadmin or developer

REDIRECT to another port, to other CPUs, you can modify headers on the packet (TX and REDIRECT similar to the DPDK ones) -

no support for jumbo frames in XDP +

Limitation on support for jumbo frames in XDP , jumbo frames are supported, like 3kB but not 9kframes. Might be a problem for storage? +(reason why this is a problem "one frame cannot exceed a page" constraint) @@ -610,6 +611,7 @@
Thank you:
Florian Haas
Berendan Gregg +
Jesper Dangaard Brouer
Alexei Starovoitov From 5dc9a95e32ec1cb3381805eeb547c8bff948e8f4 Mon Sep 17 00:00:00 2001 From: Elena Crenguta Lindqvist Date: Tue, 11 Jun 2019 18:52:07 +0200 Subject: [PATCH 02/20] =?UTF-8?q?bl=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itnot/index.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/itnot/index.html b/itnot/index.html index 6f0eb21..33d7384 100644 --- a/itnot/index.html +++ b/itnot/index.html @@ -515,7 +515,7 @@ What the heck is eBPF ?

BPF stands for "Berkeley Packet Filter" it's a linux kernel technology that is used by e.g. tcpdump and other analysis tools.

BPF is used to extract millions of metrics from the kernel and applications for troubleshooting purposes, deep monitoring or troubleshooting/exploring running software. -

BPF is basically a superpower. +

BPF is basically a superpower! And here's the thing, Google spent hundread of millions USD to market k8s, no one is marketing the linux kernel, so cool stuff like this are not enough advertised.

BPF was initially used for tools like tcpdump but Alexei Starovoitov introduced eBPF (extended BPF) to be used for things like NATing, routing, doing what iptables does for example. @@ -575,6 +575,8 @@ Panasonic
Swisscom
Telefonica
+ 2020 Olympics with Docomo
+

@@ -585,7 +587,7 @@ Telstra - linux and python story
Panasonic - legacy/uefi
Telefonica - Orange France - HA story
-Docomor http://www.ntt.co.jp/news2019/1903e/190319a.html, https://www.ericsson.com/en/press-releases/2016/3/ericsson-cloud-platform-enables-successful-launch-of-multi-vendor-nfv-for-ntt-docomo +Docomo http://www.ntt.co.jp/news2019/1903e/190319a.html, https://www.ericsson.com/en/press-releases/2016/3/ericsson-cloud-platform-enables-successful-launch-of-multi-vendor-nfv-for-ntt-docomo From 9a9e1db822ba1faacf9569643f8c90ae309e7877 Mon Sep 17 00:00:00 2001 From: Elena Crenguta Lindqvist Date: Tue, 11 Jun 2019 19:00:28 +0200 Subject: [PATCH 03/20] =?UTF-8?q?bl=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itnot/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itnot/index.html b/itnot/index.html index 33d7384..2afdd9d 100644 --- a/itnot/index.html +++ b/itnot/index.html @@ -104,7 +104,7 @@
What is NFVi?
For many years at Ericsson, we made SW and HW very dependent on each other. Customers bought whole racks of custom HW and the Ericsson SW applications deployed and running on top of that HW.
NFVi is part of the NFV framework and it means, more or less, decoupling the SW from HW for network nodes using virtualization. -
It means you can run the telecom applications(the SW) on any HW (like Dell, HP, Qanta, SuperMicro, Fujitsu servers, whatnot), in VMs or containers. +
It means you can run the telecom applications(the SW) on any HW (like Dell, HP, Quanta, SuperMicro, Fujitsu servers, whatnot), in VMs or containers.
Basically, you can run it on Intel HW, 'cause that's so much better ... meltdown ... spectre ... zombieload

Traces of this decoupling of the network functions from proprietary hardware have been there for many years now. From 8d6975884612e965e32a6b162d8e76fcec080632 Mon Sep 17 00:00:00 2001 From: Elena Crenguta Lindqvist Date: Tue, 11 Jun 2019 19:30:24 +0200 Subject: [PATCH 04/20] =?UTF-8?q?bl=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itnot/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/itnot/index.html b/itnot/index.html index 2afdd9d..b1e1239 100644 --- a/itnot/index.html +++ b/itnot/index.html @@ -105,7 +105,7 @@
For many years at Ericsson, we made SW and HW very dependent on each other. Customers bought whole racks of custom HW and the Ericsson SW applications deployed and running on top of that HW.
NFVi is part of the NFV framework and it means, more or less, decoupling the SW from HW for network nodes using virtualization.
It means you can run the telecom applications(the SW) on any HW (like Dell, HP, Quanta, SuperMicro, Fujitsu servers, whatnot), in VMs or containers. -
Basically, you can run it on Intel HW, 'cause that's so much better ... meltdown ... spectre ... zombieload +
Basically, running telecom applications on Intel HW, 'cause that's so much better ... meltdown ... spectre ... zombieload

Traces of this decoupling of the network functions from proprietary hardware have been there for many years now.
Around 2003, I worked in an ISP. We used Cisco routers to do BGP with customers and the upstream provider. I was in awe when GNU Zebra came out and I could run BGP in a Linux box. @@ -612,7 +612,7 @@

Thank you:
Florian Haas -
Berendan Gregg +
Brendan Gregg
Jesper Dangaard Brouer
Alexei Starovoitov From 57dde93bea1ac628a285d1c24a595efc11eefb6f Mon Sep 17 00:00:00 2001 From: Elena Crenguta Lindqvist Date: Wed, 12 Jun 2019 10:44:03 +0200 Subject: [PATCH 05/20] =?UTF-8?q?bl=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itnot/index.html | 18 ++++++++---------- itnot/pics/bpf-hooks.png | Bin 0 -> 138835 bytes 2 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 itnot/pics/bpf-hooks.png diff --git a/itnot/index.html b/itnot/index.html index b1e1239..8a179a4 100644 --- a/itnot/index.html +++ b/itnot/index.html @@ -533,21 +533,19 @@
-

With eBPF you can basically modify the kernel behaviour

+

eBPF to modify the kernel behaviour

+ + + +
+

Shamefully stolen from Alexei

+
- -
-

BCC tools

- -
- -
smartNICs with Storage diff --git a/itnot/pics/bpf-hooks.png b/itnot/pics/bpf-hooks.png new file mode 100644 index 0000000000000000000000000000000000000000..360940cd447b594b384a0402a2c14887fc526dd1 GIT binary patch literal 138835 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

dwC#GJ<|B7B&WW0s6P|K!E0M%|<+k))^$ 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 XPNc+V`E(x+0mnNjMajyyhJpVJ0qgOn literal 0 HcmV?d00001 From dc9f8301d32207fd7cb8d0623e2b7bda3b068d2d Mon Sep 17 00:00:00 2001 From: Elena Crenguta Lindqvist Date: Wed, 12 Jun 2019 10:50:50 +0200 Subject: [PATCH 06/20] =?UTF-8?q?bl=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itnot/index.html | 2 +- itnot/pics/ecl.png | Bin 0 -> 99344 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 itnot/pics/ecl.png diff --git a/itnot/index.html b/itnot/index.html index 8a179a4..75eaa1b 100644 --- a/itnot/index.html +++ b/itnot/index.html @@ -40,7 +40,7 @@

- +
- +
- +
@@ -609,10 +614,10 @@

Thank you: -
Florian Haas -
Brendan Gregg -
Jesper Dangaard Brouer -
Alexei Starovoitov +
Florian Haas +
Brendan Gregg +
Jesper Dangaard Brouer +
Alexei Starovoitov
From 7ecd66fee6f076b406bd02689cb9b197233efe1c Mon Sep 17 00:00:00 2001 From: Elena Lindqvist Date: Fri, 25 Sep 2020 22:19:52 +0200 Subject: [PATCH 19/20] First Draft YKNJS --- yknjs/LICENSE | 428 + yknjs/README.md | 16 + yknjs/a | 0 yknjs/bin/.gitignore | 2 + yknjs/bin/README.md | 70 + yknjs/bin/asciinema.sh | 9 + yknjs/bin/demo.sh | 3 + yknjs/bin/screen.sh | 11 + yknjs/bin/shellinabox.sh | 18 + yknjs/compile-and-add-css.sh | 10 + yknjs/css/qrcode.css | 11 + yknjs/css/qrcode.scss | 13 + yknjs/css/reveal-override.css | 37 + yknjs/css/reveal-override.scss | 47 + yknjs/fonts/.placeholder | 0 yknjs/highlight.js/.editorconfig | 8 + yknjs/highlight.js/.gitattributes | 4 + yknjs/highlight.js/.gitignore | 9 + yknjs/highlight.js/.travis.yml | 30 + yknjs/highlight.js/AUTHORS.en.txt | 277 + yknjs/highlight.js/CHANGES.md | 1860 ++ yknjs/highlight.js/LICENSE | 24 + yknjs/highlight.js/README.md | 188 + yknjs/highlight.js/README.ru.md | 142 + yknjs/highlight.js/demo/demo.js | 119 + yknjs/highlight.js/demo/index.html | 55 + yknjs/highlight.js/demo/jquery-2.1.1.min.js | 4 + .../demo/perfect-scrollbar.min.css | 5 + .../demo/perfect-scrollbar.min.js | 4 + yknjs/highlight.js/demo/readme.md | 1 + yknjs/highlight.js/demo/style.css | 74 + yknjs/highlight.js/docs/Makefile | 153 + yknjs/highlight.js/docs/_static/.gitkeep | 0 yknjs/highlight.js/docs/_templates/.gitkeep | 0 yknjs/highlight.js/docs/api.rst | 120 + yknjs/highlight.js/docs/building-testing.rst | 88 + yknjs/highlight.js/docs/conf.py | 242 + .../docs/css-classes-reference.rst | 464 + yknjs/highlight.js/docs/index.rst | 44 + .../docs/language-contribution.rst | 77 + yknjs/highlight.js/docs/language-guide.rst | 264 + yknjs/highlight.js/docs/language-requests.rst | 17 + yknjs/highlight.js/docs/line-numbers.rst | 39 + yknjs/highlight.js/docs/maintainers-guide.rst | 34 + yknjs/highlight.js/docs/reference.rst | 360 + yknjs/highlight.js/docs/style-guide.rst | 106 + yknjs/highlight.js/package-lock.json | 4071 ++++ yknjs/highlight.js/package.json | 46 + yknjs/highlight.js/src/highlight.js | 889 + yknjs/highlight.js/src/languages/1c.js | 516 + yknjs/highlight.js/src/languages/abnf.js | 75 + yknjs/highlight.js/src/languages/accesslog.js | 43 + .../src/languages/actionscript.js | 79 + yknjs/highlight.js/src/languages/ada.js | 181 + .../highlight.js/src/languages/angelscript.js | 112 + yknjs/highlight.js/src/languages/apache.js | 54 + .../highlight.js/src/languages/applescript.js | 91 + yknjs/highlight.js/src/languages/arcade.js | 142 + yknjs/highlight.js/src/languages/arduino.js | 106 + yknjs/highlight.js/src/languages/armasm.js | 98 + yknjs/highlight.js/src/languages/asciidoc.js | 196 + yknjs/highlight.js/src/languages/aspectj.js | 149 + .../highlight.js/src/languages/autohotkey.js | 65 + yknjs/highlight.js/src/languages/autoit.js | 142 + yknjs/highlight.js/src/languages/avrasm.js | 67 + yknjs/highlight.js/src/languages/awk.js | 59 + yknjs/highlight.js/src/languages/axapta.js | 36 + yknjs/highlight.js/src/languages/bash.js | 81 + yknjs/highlight.js/src/languages/basic.js | 55 + yknjs/highlight.js/src/languages/bnf.js | 33 + yknjs/highlight.js/src/languages/brainfuck.js | 41 + yknjs/highlight.js/src/languages/cal.js | 85 + yknjs/highlight.js/src/languages/capnproto.js | 55 + yknjs/highlight.js/src/languages/ceylon.js | 70 + yknjs/highlight.js/src/languages/clean.js | 33 + .../src/languages/clojure-repl.js | 22 + yknjs/highlight.js/src/languages/clojure.js | 103 + yknjs/highlight.js/src/languages/cmake.js | 59 + .../src/languages/coffeescript.js | 153 + yknjs/highlight.js/src/languages/coq.js | 72 + yknjs/highlight.js/src/languages/cos.js | 128 + yknjs/highlight.js/src/languages/cpp.js | 192 + yknjs/highlight.js/src/languages/crmsh.js | 101 + yknjs/highlight.js/src/languages/crystal.js | 192 + yknjs/highlight.js/src/languages/cs.js | 191 + yknjs/highlight.js/src/languages/csp.js | 29 + yknjs/highlight.js/src/languages/css.js | 109 + yknjs/highlight.js/src/languages/d.js | 265 + yknjs/highlight.js/src/languages/dart.js | 118 + yknjs/highlight.js/src/languages/delphi.js | 72 + yknjs/highlight.js/src/languages/diff.js | 46 + yknjs/highlight.js/src/languages/django.js | 71 + yknjs/highlight.js/src/languages/dns.js | 34 + .../highlight.js/src/languages/dockerfile.js | 29 + yknjs/highlight.js/src/languages/dos.js | 57 + yknjs/highlight.js/src/languages/dsconfig.js | 52 + yknjs/highlight.js/src/languages/dts.js | 131 + yknjs/highlight.js/src/languages/dust.js | 39 + yknjs/highlight.js/src/languages/ebnf.js | 37 + yknjs/highlight.js/src/languages/elixir.js | 106 + yknjs/highlight.js/src/languages/elm.js | 95 + yknjs/highlight.js/src/languages/erb.js | 23 + .../highlight.js/src/languages/erlang-repl.js | 51 + yknjs/highlight.js/src/languages/erlang.js | 152 + yknjs/highlight.js/src/languages/excel.js | 53 + yknjs/highlight.js/src/languages/fix.js | 33 + yknjs/highlight.js/src/languages/flix.js | 50 + yknjs/highlight.js/src/languages/fortran.js | 76 + yknjs/highlight.js/src/languages/fsharp.js | 64 + yknjs/highlight.js/src/languages/gams.js | 162 + yknjs/highlight.js/src/languages/gauss.js | 296 + yknjs/highlight.js/src/languages/gcode.js | 72 + yknjs/highlight.js/src/languages/gherkin.js | 42 + yknjs/highlight.js/src/languages/glsl.js | 123 + yknjs/highlight.js/src/languages/gml.js | 879 + yknjs/highlight.js/src/languages/go.js | 61 + yknjs/highlight.js/src/languages/golo.js | 28 + yknjs/highlight.js/src/languages/gradle.js | 40 + yknjs/highlight.js/src/languages/groovy.js | 100 + yknjs/highlight.js/src/languages/haml.js | 114 + .../highlight.js/src/languages/handlebars.js | 41 + yknjs/highlight.js/src/languages/haskell.js | 128 + yknjs/highlight.js/src/languages/haxe.js | 117 + yknjs/highlight.js/src/languages/hsp.js | 52 + yknjs/highlight.js/src/languages/htmlbars.js | 78 + yknjs/highlight.js/src/languages/http.js | 47 + yknjs/highlight.js/src/languages/hy.js | 108 + yknjs/highlight.js/src/languages/inform7.js | 62 + yknjs/highlight.js/src/languages/ini.js | 71 + yknjs/highlight.js/src/languages/irpf90.js | 82 + yknjs/highlight.js/src/languages/isbl.js | 3179 +++ yknjs/highlight.js/src/languages/java.js | 113 + .../highlight.js/src/languages/javascript.js | 174 + yknjs/highlight.js/src/languages/jboss-cli.js | 53 + yknjs/highlight.js/src/languages/json.js | 42 + .../highlight.js/src/languages/julia-repl.js | 46 + yknjs/highlight.js/src/languages/julia.js | 167 + yknjs/highlight.js/src/languages/kotlin.js | 204 + yknjs/highlight.js/src/languages/lasso.js | 168 + yknjs/highlight.js/src/languages/ldif.js | 27 + yknjs/highlight.js/src/languages/leaf.js | 45 + yknjs/highlight.js/src/languages/less.js | 145 + yknjs/highlight.js/src/languages/lisp.js | 109 + .../src/languages/livecodeserver.js | 165 + .../highlight.js/src/languages/livescript.js | 157 + yknjs/highlight.js/src/languages/llvm.js | 95 + yknjs/highlight.js/src/languages/lsl.js | 89 + yknjs/highlight.js/src/languages/lua.js | 71 + yknjs/highlight.js/src/languages/makefile.js | 87 + yknjs/highlight.js/src/languages/markdown.js | 115 + .../highlight.js/src/languages/mathematica.js | 63 + yknjs/highlight.js/src/languages/matlab.js | 102 + yknjs/highlight.js/src/languages/maxima.js | 412 + yknjs/highlight.js/src/languages/mel.js | 231 + yknjs/highlight.js/src/languages/mercury.js | 87 + yknjs/highlight.js/src/languages/mipsasm.js | 92 + yknjs/highlight.js/src/languages/mizar.js | 24 + .../highlight.js/src/languages/mojolicious.js | 31 + yknjs/highlight.js/src/languages/monkey.js | 79 + .../highlight.js/src/languages/moonscript.js | 119 + yknjs/highlight.js/src/languages/n1ql.js | 75 + yknjs/highlight.js/src/languages/nginx.js | 99 + yknjs/highlight.js/src/languages/nimrod.js | 58 + yknjs/highlight.js/src/languages/nix.js | 55 + yknjs/highlight.js/src/languages/nsis.js | 112 + .../highlight.js/src/languages/objectivec.js | 97 + yknjs/highlight.js/src/languages/ocaml.js | 77 + yknjs/highlight.js/src/languages/openscad.js | 63 + yknjs/highlight.js/src/languages/oxygene.js | 75 + yknjs/highlight.js/src/languages/parser3.js | 54 + yknjs/highlight.js/src/languages/perl.js | 162 + yknjs/highlight.js/src/languages/pf.js | 58 + yknjs/highlight.js/src/languages/pgsql.js | 504 + yknjs/highlight.js/src/languages/php.js | 133 + yknjs/highlight.js/src/languages/plaintext.js | 12 + yknjs/highlight.js/src/languages/pony.js | 75 + .../highlight.js/src/languages/powershell.js | 86 + .../highlight.js/src/languages/processing.js | 53 + yknjs/highlight.js/src/languages/profile.js | 35 + yknjs/highlight.js/src/languages/prolog.js | 93 + .../highlight.js/src/languages/properties.js | 75 + yknjs/highlight.js/src/languages/protobuf.js | 42 + yknjs/highlight.js/src/languages/puppet.js | 120 + yknjs/highlight.js/src/languages/purebasic.js | 64 + yknjs/highlight.js/src/languages/python.js | 121 + yknjs/highlight.js/src/languages/q.js | 27 + yknjs/highlight.js/src/languages/qml.js | 177 + yknjs/highlight.js/src/languages/r.js | 75 + yknjs/highlight.js/src/languages/reasonml.js | 304 + yknjs/highlight.js/src/languages/rib.js | 33 + yknjs/highlight.js/src/languages/roboconf.js | 74 + yknjs/highlight.js/src/languages/routeros.js | 169 + yknjs/highlight.js/src/languages/rsl.js | 42 + yknjs/highlight.js/src/languages/ruby.js | 183 + .../src/languages/ruleslanguage.js | 67 + yknjs/highlight.js/src/languages/rust.js | 114 + yknjs/highlight.js/src/languages/sas.js | 131 + yknjs/highlight.js/src/languages/scala.js | 121 + yknjs/highlight.js/src/languages/scheme.js | 152 + yknjs/highlight.js/src/languages/scilab.js | 61 + yknjs/highlight.js/src/languages/scss.js | 102 + yknjs/highlight.js/src/languages/shell.js | 21 + yknjs/highlight.js/src/languages/smali.js | 61 + yknjs/highlight.js/src/languages/smalltalk.js | 54 + yknjs/highlight.js/src/languages/sml.js | 72 + yknjs/highlight.js/src/languages/sqf.js | 412 + yknjs/highlight.js/src/languages/sql.js | 167 + yknjs/highlight.js/src/languages/stan.js | 89 + yknjs/highlight.js/src/languages/stata.js | 45 + yknjs/highlight.js/src/languages/step21.js | 52 + yknjs/highlight.js/src/languages/stylus.js | 460 + yknjs/highlight.js/src/languages/subunit.js | 39 + yknjs/highlight.js/src/languages/swift.js | 137 + .../src/languages/taggerscript.js | 48 + yknjs/highlight.js/src/languages/tap.js | 42 + yknjs/highlight.js/src/languages/tcl.js | 64 + yknjs/highlight.js/src/languages/tex.js | 68 + yknjs/highlight.js/src/languages/thrift.js | 41 + yknjs/highlight.js/src/languages/tp.js | 90 + yknjs/highlight.js/src/languages/twig.js | 73 + .../highlight.js/src/languages/typescript.js | 173 + yknjs/highlight.js/src/languages/vala.js | 55 + yknjs/highlight.js/src/languages/vbnet.js | 60 + .../src/languages/vbscript-html.js | 19 + yknjs/highlight.js/src/languages/vbscript.js | 45 + yknjs/highlight.js/src/languages/verilog.js | 105 + yknjs/highlight.js/src/languages/vhdl.js | 67 + yknjs/highlight.js/src/languages/vim.js | 116 + yknjs/highlight.js/src/languages/x86asm.js | 142 + yknjs/highlight.js/src/languages/xl.js | 78 + yknjs/highlight.js/src/languages/xml.js | 112 + yknjs/highlight.js/src/languages/xquery.js | 178 + yknjs/highlight.js/src/languages/yaml.js | 98 + yknjs/highlight.js/src/languages/zephir.js | 111 + yknjs/highlight.js/src/styles/a11y-dark.css | 99 + yknjs/highlight.js/src/styles/a11y-light.css | 99 + yknjs/highlight.js/src/styles/agate.css | 108 + yknjs/highlight.js/src/styles/an-old-hope.css | 89 + .../highlight.js/src/styles/androidstudio.css | 66 + .../highlight.js/src/styles/arduino-light.css | 88 + yknjs/highlight.js/src/styles/arta.css | 73 + yknjs/highlight.js/src/styles/ascetic.css | 45 + .../src/styles/atelier-cave-dark.css | 83 + .../src/styles/atelier-cave-light.css | 85 + .../src/styles/atelier-dune-dark.css | 69 + .../src/styles/atelier-dune-light.css | 69 + .../src/styles/atelier-estuary-dark.css | 84 + .../src/styles/atelier-estuary-light.css | 84 + .../src/styles/atelier-forest-dark.css | 69 + .../src/styles/atelier-forest-light.css | 69 + .../src/styles/atelier-heath-dark.css | 69 + .../src/styles/atelier-heath-light.css | 69 + .../src/styles/atelier-lakeside-dark.css | 69 + .../src/styles/atelier-lakeside-light.css | 69 + .../src/styles/atelier-plateau-dark.css | 84 + .../src/styles/atelier-plateau-light.css | 84 + .../src/styles/atelier-savanna-dark.css | 84 + .../src/styles/atelier-savanna-light.css | 84 + .../src/styles/atelier-seaside-dark.css | 69 + .../src/styles/atelier-seaside-light.css | 69 + .../src/styles/atelier-sulphurpool-dark.css | 69 + .../src/styles/atelier-sulphurpool-light.css | 69 + .../src/styles/atom-one-dark-reasonable.css | 77 + .../highlight.js/src/styles/atom-one-dark.css | 96 + .../src/styles/atom-one-light.css | 96 + yknjs/highlight.js/src/styles/brown-paper.css | 64 + .../highlight.js/src/styles/brown-papersq.png | Bin 0 -> 18198 bytes .../highlight.js/src/styles/codepen-embed.css | 60 + .../highlight.js/src/styles/color-brewer.css | 71 + yknjs/highlight.js/src/styles/darcula.css | 77 + yknjs/highlight.js/src/styles/dark.css | 63 + yknjs/highlight.js/src/styles/darkula.css | 6 + yknjs/highlight.js/src/styles/default.css | 99 + yknjs/highlight.js/src/styles/docco.css | 97 + yknjs/highlight.js/src/styles/dracula.css | 76 + yknjs/highlight.js/src/styles/far.css | 71 + yknjs/highlight.js/src/styles/foundation.css | 88 + yknjs/highlight.js/src/styles/github-gist.css | 71 + yknjs/highlight.js/src/styles/github.css | 99 + yknjs/highlight.js/src/styles/gml.css | 78 + yknjs/highlight.js/src/styles/googlecode.css | 89 + yknjs/highlight.js/src/styles/grayscale.css | 101 + .../highlight.js/src/styles/gruvbox-dark.css | 108 + .../highlight.js/src/styles/gruvbox-light.css | 108 + yknjs/highlight.js/src/styles/hopscotch.css | 83 + yknjs/highlight.js/src/styles/hybrid.css | 102 + yknjs/highlight.js/src/styles/idea.css | 97 + yknjs/highlight.js/src/styles/ir-black.css | 73 + .../src/styles/isbl-editor-dark.css | 112 + .../src/styles/isbl-editor-light.css | 112 + yknjs/highlight.js/src/styles/kimbie.dark.css | 74 + .../highlight.js/src/styles/kimbie.light.css | 74 + yknjs/highlight.js/src/styles/lightfair.css | 87 + yknjs/highlight.js/src/styles/magula.css | 70 + yknjs/highlight.js/src/styles/mono-blue.css | 59 + .../src/styles/monokai-sublime.css | 83 + yknjs/highlight.js/src/styles/monokai.css | 70 + yknjs/highlight.js/src/styles/nord.css | 309 + yknjs/highlight.js/src/styles/obsidian.css | 88 + yknjs/highlight.js/src/styles/ocean.css | 74 + .../highlight.js/src/styles/paraiso-dark.css | 72 + .../highlight.js/src/styles/paraiso-light.css | 72 + yknjs/highlight.js/src/styles/pojoaque.css | 83 + yknjs/highlight.js/src/styles/pojoaque.jpg | Bin 0 -> 1186 bytes yknjs/highlight.js/src/styles/purebasic.css | 96 + .../src/styles/qtcreator_dark.css | 83 + .../src/styles/qtcreator_light.css | 83 + yknjs/highlight.js/src/styles/railscasts.css | 106 + yknjs/highlight.js/src/styles/rainbow.css | 85 + yknjs/highlight.js/src/styles/routeros.css | 108 + yknjs/highlight.js/src/styles/school-book.css | 72 + yknjs/highlight.js/src/styles/school-book.png | Bin 0 -> 486 bytes .../src/styles/shades-of-purple.css | 97 + .../src/styles/solarized-dark.css | 84 + .../src/styles/solarized-light.css | 84 + yknjs/highlight.js/src/styles/sunburst.css | 102 + .../src/styles/tomorrow-night-blue.css | 75 + .../src/styles/tomorrow-night-bright.css | 74 + .../src/styles/tomorrow-night-eighties.css | 74 + .../src/styles/tomorrow-night.css | 75 + yknjs/highlight.js/src/styles/tomorrow.css | 72 + yknjs/highlight.js/src/styles/vs.css | 68 + yknjs/highlight.js/src/styles/vs2015.css | 115 + yknjs/highlight.js/src/styles/xcode.css | 104 + yknjs/highlight.js/src/styles/xt256.css | 92 + yknjs/highlight.js/src/styles/zenburn.css | 80 + yknjs/highlight.js/test/api/autoDetection.js | 36 + yknjs/highlight.js/test/api/binaryNumber.js | 25 + yknjs/highlight.js/test/api/cNumber.js | 45 + yknjs/highlight.js/test/api/fixmarkup.js | 21 + yknjs/highlight.js/test/api/getLanguage.js | 43 + yknjs/highlight.js/test/api/highlight.js | 19 + yknjs/highlight.js/test/api/ident.js | 27 + yknjs/highlight.js/test/api/index.js | 14 + yknjs/highlight.js/test/api/number.js | 28 + yknjs/highlight.js/test/api/starters.js | 37 + .../highlight.js/test/api/underscoreIdent.js | 29 + yknjs/highlight.js/test/browser/index.js | 14 + yknjs/highlight.js/test/browser/plain.js | 31 + yknjs/highlight.js/test/browser/worker.js | 50 + yknjs/highlight.js/test/detect/1c/default.txt | 30 + .../highlight.js/test/detect/abnf/default.txt | 22 + .../test/detect/accesslog/default.txt | 1 + .../test/detect/actionscript/default.txt | 24 + .../highlight.js/test/detect/ada/default.txt | 17 + .../test/detect/angelscript/default.txt | 51 + .../test/detect/apache/default.txt | 19 + .../test/detect/applescript/default.txt | 14 + .../test/detect/arcade/default.txt | 14 + .../test/detect/arduino/default.txt | 24 + .../test/detect/armasm/default.txt | 36 + .../test/detect/asciidoc/default.txt | 65 + .../test/detect/aspectj/default.txt | 23 + .../test/detect/autohotkey/default.txt | 24 + .../test/detect/autoit/default.txt | 16 + .../test/detect/avrasm/default.txt | 19 + .../highlight.js/test/detect/awk/default.txt | 16 + .../test/detect/axapta/default.txt | 32 + .../highlight.js/test/detect/bash/default.txt | 15 + .../test/detect/basic/default.txt | 22 + .../highlight.js/test/detect/bnf/default.txt | 8 + .../test/detect/brainfuck/default.txt | 17 + .../highlight.js/test/detect/cal/default.txt | 33 + .../test/detect/capnproto/default.txt | 55 + .../test/detect/ceylon/default.txt | 8 + .../test/detect/clean/default.txt | 30 + .../test/detect/clojure-repl/default.txt | 7 + .../test/detect/clojure/default.txt | 11 + .../test/detect/cmake/default.txt | 19 + .../test/detect/coffeescript/default.txt | 13 + .../highlight.js/test/detect/coq/default.txt | 41 + .../highlight.js/test/detect/cos/default.txt | 21 + .../highlight.js/test/detect/cpp/comment.txt | 16 + .../highlight.js/test/detect/cpp/default.txt | 14 + .../test/detect/crmsh/default.txt | 48 + .../test/detect/crystal/default.txt | 29 + yknjs/highlight.js/test/detect/cs/default.txt | 16 + .../highlight.js/test/detect/csp/default.txt | 5 + .../highlight.js/test/detect/css/default.txt | 15 + yknjs/highlight.js/test/detect/d/default.txt | 44 + .../highlight.js/test/detect/dart/default.txt | 37 + .../test/detect/delphi/default.txt | 30 + .../highlight.js/test/detect/diff/default.txt | 30 + .../test/detect/django/default.txt | 15 + .../highlight.js/test/detect/dns/default.txt | 17 + .../test/detect/dockerfile/default.txt | 56 + .../highlight.js/test/detect/dos/default.txt | 24 + .../test/detect/dsconfig/default.txt | 22 + .../highlight.js/test/detect/dts/default.txt | 71 + .../highlight.js/test/detect/dust/default.txt | 7 + .../highlight.js/test/detect/ebnf/default.txt | 12 + .../test/detect/elixir/default.txt | 49 + .../highlight.js/test/detect/elm/default.txt | 18 + .../highlight.js/test/detect/erb/default.txt | 10 + .../test/detect/erlang-repl/default.txt | 27 + .../test/detect/erlang/default.txt | 60 + .../test/detect/excel/default.txt | 1 + .../highlight.js/test/detect/fix/default.txt | 4 + .../highlight.js/test/detect/flix/default.txt | 49 + .../test/detect/fortran/default.txt | 22 + .../test/detect/fsharp/default.txt | 48 + .../highlight.js/test/detect/gams/default.txt | 31 + .../test/detect/gauss/default.txt | 28 + .../test/detect/gcode/default.txt | 31 + .../test/detect/gherkin/default.txt | 25 + .../highlight.js/test/detect/glsl/default.txt | 37 + .../highlight.js/test/detect/gml/default.txt | 22 + yknjs/highlight.js/test/detect/go/default.txt | 12 + .../test/detect/go/swift-like.txt | 15 + .../highlight.js/test/detect/golo/default.txt | 15 + .../test/detect/gradle/default.txt | 62 + .../test/detect/groovy/default.txt | 56 + .../highlight.js/test/detect/haml/default.txt | 14 + .../test/detect/handlebars/default.txt | 6 + .../test/detect/haskell/default.txt | 38 + .../highlight.js/test/detect/haxe/default.txt | 142 + .../highlight.js/test/detect/hsp/default.txt | 23 + .../test/detect/htmlbars/default.txt | 9 + .../highlight.js/test/detect/http/default.txt | 13 + yknjs/highlight.js/test/detect/hy/default.txt | 37 + yknjs/highlight.js/test/detect/index.js | 37 + .../test/detect/inform7/default.txt | 24 + .../highlight.js/test/detect/ini/default.txt | 12 + .../test/detect/irpf90/default.txt | 37 + .../highlight.js/test/detect/isbl/default.txt | 27 + .../highlight.js/test/detect/java/default.txt | 16 + .../test/detect/javascript/default.txt | 15 + .../test/detect/javascript/sample1.txt | 20 + .../test/detect/javascript/short-plain.txt | 8 + .../test/detect/jboss-cli/default.txt | 24 + .../highlight.js/test/detect/json/default.txt | 12 + .../test/detect/julia-repl/default.txt | 36 + .../test/detect/julia/default.txt | 104 + .../test/detect/kotlin/default.txt | 12 + .../test/detect/lasso/default.txt | 48 + .../highlight.js/test/detect/ldif/default.txt | 24 + .../highlight.js/test/detect/leaf/default.txt | 21 + .../highlight.js/test/detect/less/default.txt | 27 + .../highlight.js/test/detect/lisp/default.txt | 22 + .../test/detect/livecodeserver/default.txt | 30 + .../test/detect/livescript/default.txt | 38 + .../highlight.js/test/detect/llvm/default.txt | 61 + .../highlight.js/test/detect/lsl/default.txt | 12 + .../highlight.js/test/detect/lua/default.txt | 32 + .../test/detect/makefile/default.txt | 13 + .../test/detect/markdown/default.txt | 23 + .../test/detect/mathematica/default.txt | 14 + .../test/detect/matlab/default.txt | 45 + .../test/detect/maxima/default.txt | 57 + .../highlight.js/test/detect/mel/default.txt | 25 + .../test/detect/mercury/default.txt | 24 + .../test/detect/mipsasm/default.txt | 22 + .../test/detect/mizar/default.txt | 86 + .../test/detect/mojolicious/default.txt | 20 + .../test/detect/monkey/default.txt | 37 + .../test/detect/moonscript/default.txt | 37 + .../highlight.js/test/detect/n1ql/default.txt | 19 + .../test/detect/nginx/default.txt | 47 + .../test/detect/nimrod/default.txt | 21 + .../highlight.js/test/detect/nix/default.txt | 24 + .../highlight.js/test/detect/nsis/default.txt | 37 + .../test/detect/objectivec/default.txt | 13 + .../test/detect/ocaml/default.txt | 23 + .../test/detect/openscad/default.txt | 15 + .../test/detect/oxygene/default.txt | 56 + .../test/detect/parser3/default.txt | 34 + .../highlight.js/test/detect/perl/default.txt | 41 + yknjs/highlight.js/test/detect/pf/default.txt | 43 + .../test/detect/pgsql/default.txt | 13 + .../highlight.js/test/detect/php/default.txt | 52 + .../test/detect/plaintext/default.txt | 6 + .../highlight.js/test/detect/pony/default.txt | 20 + .../test/detect/powershell/default.txt | 11 + .../test/detect/processing/default.txt | 17 + .../test/detect/profile/default.txt | 8 + .../test/detect/prolog/default.txt | 11 + .../test/detect/properties/default.txt | 11 + .../test/detect/protobuf/default.txt | 23 + .../test/detect/puppet/default.txt | 33 + .../test/detect/purebasic/default.txt | 29 + .../test/detect/python/default.txt | 12 + yknjs/highlight.js/test/detect/q/default.txt | 9 + .../highlight.js/test/detect/qml/default.txt | 49 + yknjs/highlight.js/test/detect/r/default.txt | 69 + .../test/detect/reasonml/default.txt | 47 + .../highlight.js/test/detect/rib/default.txt | 25 + .../test/detect/roboconf/default.txt | 54 + .../test/detect/routeros/default.txt | 17 + .../highlight.js/test/detect/rsl/default.txt | 15 + .../highlight.js/test/detect/ruby/default.txt | 13 + .../test/detect/ruby/double-colon.txt | 3 + .../test/detect/ruleslanguage/default.txt | 36 + .../highlight.js/test/detect/rust/default.txt | 16 + .../highlight.js/test/detect/sas/default.txt | 48 + .../test/detect/scala/default.txt | 58 + .../test/detect/scheme/default.txt | 28 + .../test/detect/scilab/default.txt | 14 + .../highlight.js/test/detect/scss/default.txt | 73 + .../test/detect/shell/default.txt | 11 + .../test/detect/smali/default.txt | 75 + .../test/detect/smalltalk/default.txt | 39 + .../highlight.js/test/detect/sml/default.txt | 26 + .../highlight.js/test/detect/sqf/default.txt | 16 + .../highlight.js/test/detect/sql/default.txt | 12 + .../highlight.js/test/detect/stan/default.txt | 39 + .../test/detect/stata/default.txt | 40 + .../test/detect/step21/default.txt | 33 + .../test/detect/stylus/default.txt | 25 + .../test/detect/subunit/default.txt | 18 + .../test/detect/swift/default.txt | 15 + .../test/detect/taggerscript/default.txt | 12 + .../highlight.js/test/detect/tap/default.txt | 24 + .../highlight.js/test/detect/tcl/default.txt | 26 + .../highlight.js/test/detect/tex/default.txt | 17 + .../test/detect/thrift/default.txt | 40 + yknjs/highlight.js/test/detect/tp/default.txt | 156 + .../highlight.js/test/detect/twig/default.txt | 21 + .../test/detect/typescript/default.txt | 14 + .../highlight.js/test/detect/vala/default.txt | 46 + .../test/detect/vbnet/default.txt | 42 + .../test/detect/vbscript-html/default.txt | 7 + .../test/detect/vbscript/default.txt | 29 + .../test/detect/verilog/default.txt | 58 + .../highlight.js/test/detect/vhdl/default.txt | 41 + .../highlight.js/test/detect/vim/default.txt | 17 + .../test/detect/x86asm/default.txt | 40 + yknjs/highlight.js/test/detect/xl/default.txt | 28 + .../highlight.js/test/detect/xml/default.txt | 13 + .../test/detect/xml/groovy-julia.txt | 5 + yknjs/highlight.js/test/detect/xml/js.txt | 1 + .../test/detect/xquery/default.txt | 30 + .../highlight.js/test/detect/yaml/default.txt | 39 + .../test/detect/zephir/default.txt | 55 + .../test/fixtures/expect/brInPre.txt | 1 + .../test/fixtures/expect/custommarkup.txt | 3 + .../test/fixtures/expect/customtabreplace.txt | 4 + .../expect/endsWithParentVariants.txt | 1 + .../test/fixtures/expect/explicit1.txt | 2 + .../test/fixtures/expect/explicit2.txt | 2 + .../test/fixtures/expect/languagealias.txt | 1 + .../test/fixtures/expect/sublanguages.txt | 4 + .../test/fixtures/expect/tabreplace.txt | 2 + .../test/fixtures/expect/useBr.txt | 1 + yknjs/highlight.js/test/fixtures/index.html | 146 + yknjs/highlight.js/test/fixtures/nested.js | 17 + yknjs/highlight.js/test/index.js | 24 + .../test/markup/accesslog/default.expect.txt | 1 + .../test/markup/accesslog/default.txt | 1 + .../actionscript/method-call.expect.txt | 1 + .../test/markup/actionscript/method-call.txt | 1 + .../test/markup/arcade/profile.expect.txt | 9 + .../test/markup/arcade/profile.txt | 9 + .../aspectj/intertype-constructor.expect.txt | 3 + .../markup/aspectj/intertype-constructor.txt | 3 + .../aspectj/intertype-method.expect.txt | 6 + .../test/markup/aspectj/intertype-method.txt | 6 + .../test/markup/bash/no-numbers.expect.txt | 3 + .../test/markup/bash/no-numbers.txt | 3 + .../markup/ceylon/nested-comments.expect.txt | 5 + .../test/markup/ceylon/nested-comments.txt | 5 + .../markup/clojure-repl/prompt.expect.txt | 2 + .../test/markup/clojure-repl/prompt.txt | 2 + .../test/markup/clojure/hint_col.expect.txt | 34 + .../test/markup/clojure/hint_col.txt | 34 + .../markup/clojure/symbols-numbers.expect.txt | 1 + .../test/markup/clojure/symbols-numbers.txt | 1 + .../markup/coffeescript/division.expect.txt | 8 + .../test/markup/coffeescript/division.txt | 8 + .../markup/coffeescript/function.expect.txt | 14 + .../test/markup/coffeescript/function.txt | 14 + .../test/markup/coffeescript/regex.expect.txt | 8 + .../test/markup/coffeescript/regex.txt | 8 + .../test/markup/cos/basic.expect.txt | 7 + yknjs/highlight.js/test/markup/cos/basic.txt | 7 + .../test/markup/cos/embedded.expect.txt | 5 + .../highlight.js/test/markup/cos/embedded.txt | 5 + .../markup/cpp/expression-keywords.expect.txt | 2 + .../test/markup/cpp/expression-keywords.txt | 2 + .../markup/cpp/function-params.expect.txt | 7 + .../test/markup/cpp/function-params.txt | 7 + .../test/markup/cpp/function-title.expect.txt | 9 + .../test/markup/cpp/function-title.txt | 9 + .../markup/cpp/number-literals.expect.txt | 6 + .../test/markup/cpp/number-literals.txt | 6 + .../markup/cpp/pointers-returns.expect.txt | 4 + .../test/markup/cpp/pointers-returns.txt | 4 + .../test/markup/cpp/preprocessor.expect.txt | 13 + .../test/markup/cpp/preprocessor.txt | 13 + .../markup/cpp/primitive-types.expect.txt | 3 + .../test/markup/cpp/primitive-types.txt | 3 + .../markup/cpp/string-literals.expect.txt | 56 + .../test/markup/cpp/string-literals.txt | 56 + .../test/markup/crystal/literals.expect.txt | 98 + .../test/markup/crystal/literals.txt | 98 + .../test/markup/crystal/macro.expect.txt | 9 + .../test/markup/crystal/macro.txt | 9 + .../test/markup/crystal/operators.expect.txt | 34 + .../test/markup/crystal/operators.txt | 33 + .../test/markup/crystal/regexes.expect.txt | 12 + .../test/markup/crystal/regexes.txt | 12 + .../crystal/toplevel-keywords.expect.txt | 4 + .../test/markup/crystal/toplevel-keywords.txt | 4 + .../markup/cs/dotted-namespace.expect.txt | 6 + .../test/markup/cs/dotted-namespace.txt | 6 + .../test/markup/cs/floats.expect.txt | 4 + yknjs/highlight.js/test/markup/cs/floats.txt | 4 + .../test/markup/cs/functions.expect.txt | 16 + .../highlight.js/test/markup/cs/functions.txt | 16 + .../markup/cs/string-interpolation.expect.txt | 9 + .../test/markup/cs/string-interpolation.txt | 9 + .../test/markup/cs/titles.expect.txt | 19 + yknjs/highlight.js/test/markup/cs/titles.txt | 19 + .../markup/css/pseudo-selector.expect.txt | 2 + .../test/markup/css/pseudo-selector.txt | 2 + .../test/markup/css/url.expect.txt | 6 + yknjs/highlight.js/test/markup/css/url.txt | 6 + .../dart/string-interpolation.expect.txt | 3 + .../test/markup/dart/string-interpolation.txt | 3 + .../delphi/compiler-directive.expect.txt | 4 + .../test/markup/delphi/compiler-directive.txt | 4 + .../test/markup/diff/comments.expect.txt | 10 + .../test/markup/diff/comments.txt | 10 + .../test/markup/dockerfile/default.expect.txt | 23 + .../test/markup/dockerfile/default.txt | 23 + .../test/markup/dos/comments.expect.txt | 3 + .../highlight.js/test/markup/dos/comments.txt | 3 + .../test/markup/dsconfig/default.expect.txt | 24 + .../test/markup/dsconfig/default.txt | 24 + .../markup/elixir/function-title.expect.txt | 15 + .../test/markup/elixir/function-title.txt | 15 + .../test/markup/excel/comments.expect.txt | 1 + .../test/markup/excel/comments.txt | 1 + .../test/markup/fortran/numbers.expect.txt | 15 + .../test/markup/fortran/numbers.txt | 15 + .../markup/fsharp/bang-keywords.expect.txt | 1 + .../test/markup/fsharp/bang-keywords.txt | 1 + .../markup/gauss/function_defs.expect.txt | 7 + .../test/markup/gauss/function_defs.txt | 7 + .../markup/gauss/function_refs.expect.txt | 5 + .../test/markup/gauss/function_refs.txt | 5 + .../test/markup/gauss/keywords.expect.txt | 7 + .../test/markup/gauss/keywords.txt | 7 + .../test/markup/go/numbers.expect.txt | 2 + yknjs/highlight.js/test/markup/go/numbers.txt | 2 + .../test/markup/golo/default.expect.txt | 15 + .../highlight.js/test/markup/golo/default.txt | 15 + .../test/markup/haskell/infix.expect.txt | 3 + .../test/markup/haskell/infix.txt | 3 + .../markup/haskell/nested-comments.expect.txt | 1 + .../test/markup/haskell/nested-comments.txt | 1 + .../test/markup/http/default.expect.txt | 7 + .../highlight.js/test/markup/http/default.txt | 6 + yknjs/highlight.js/test/markup/index.js | 39 + .../test/markup/java/gh1031.expect.txt | 7 + .../highlight.js/test/markup/java/gh1031.txt | 7 + .../test/markup/java/numbers.expect.txt | 9 + .../highlight.js/test/markup/java/numbers.txt | 9 + .../test/markup/java/titles.expect.txt | 10 + .../highlight.js/test/markup/java/titles.txt | 10 + .../javascript/arrow-function.expect.txt | 3 + .../test/markup/javascript/arrow-function.txt | 3 + .../test/markup/javascript/class.expect.txt | 11 + .../test/markup/javascript/class.txt | 11 + .../javascript/default-parameters.expect.txt | 1 + .../markup/javascript/default-parameters.txt | 1 + .../test/markup/javascript/jsx.expect.txt | 6 + .../test/markup/javascript/jsx.txt | 6 + .../markup/javascript/keywords.expect.txt | 13 + .../test/markup/javascript/keywords.txt | 13 + .../markup/javascript/method-call.expect.txt | 1 + .../test/markup/javascript/method-call.txt | 1 + .../test/markup/javascript/modules.expect.txt | 8 + .../test/markup/javascript/modules.txt | 8 + .../markup/javascript/object-attr.expect.txt | 6 + .../test/markup/javascript/object-attr.txt | 6 + .../test/markup/javascript/shebang.expect.txt | 3 + .../test/markup/javascript/shebang.txt | 3 + .../javascript/template-strings.expect.txt | 1 + .../markup/javascript/template-strings.txt | 1 + .../test/markup/kotlin/class.expect.txt | 16 + .../highlight.js/test/markup/kotlin/class.txt | 16 + .../test/markup/kotlin/function.expect.txt | 13 + .../test/markup/kotlin/function.txt | 13 + .../test/markup/lasso/delimiters.expect.txt | 7 + .../test/markup/lasso/delimiters.txt | 7 + .../test/markup/ldif/ldapmodify.expect.txt | 7 + .../test/markup/ldif/ldapmodify.txt | 7 + .../test/markup/ldif/schema.expect.txt | 15 + .../highlight.js/test/markup/ldif/schema.txt | 15 + .../test/markup/less/selectors.expect.txt | 8 + .../test/markup/less/selectors.txt | 8 + .../test/markup/lisp/mec.expect.txt | 4 + yknjs/highlight.js/test/markup/lisp/mec.txt | 4 + .../test/markup/markdown/code.expect.txt | 8 + .../test/markup/markdown/code.txt | 8 + .../markup/matlab/block_comment.expect.txt | 27 + .../test/markup/matlab/block_comment.txt | 27 + .../test/markup/matlab/transpose.expect.txt | 40 + .../test/markup/matlab/transpose.txt | 40 + .../test/markup/maxima/example.expect.txt | 42 + .../test/markup/maxima/example.txt | 42 + .../test/markup/maxima/numbers.expect.txt | 24 + .../test/markup/maxima/numbers.txt | 24 + .../test/markup/maxima/symbols.expect.txt | 18 + .../test/markup/maxima/symbols.txt | 18 + .../test/markup/ocaml/literals.expect.txt | 29 + .../test/markup/ocaml/literals.txt | 29 + .../test/markup/ocaml/types.expect.txt | 17 + .../highlight.js/test/markup/ocaml/types.txt | 17 + .../test/markup/pgsql/clauses.expect.txt | 67 + .../test/markup/pgsql/clauses.txt | 67 + .../test/markup/pgsql/clauses2.expect.txt | 160 + .../test/markup/pgsql/clauses2.txt | 160 + .../test/markup/pgsql/constraints.expect.txt | 21 + .../test/markup/pgsql/constraints.txt | 21 + .../test/markup/pgsql/options.expect.txt | 44 + .../test/markup/pgsql/options.txt | 44 + .../test/markup/pgsql/plpgsql.expect.txt | 61 + .../test/markup/pgsql/plpgsql.txt | 61 + .../test/markup/pgsql/sql-commands.expect.txt | 99 + .../test/markup/pgsql/sql-commands.txt | 99 + .../markup/pgsql/window-functions.expect.txt | 35 + .../test/markup/pgsql/window-functions.txt | 35 + .../test/markup/pgsql/xml.expect.txt | 47 + yknjs/highlight.js/test/markup/pgsql/xml.txt | 47 + .../test/markup/php/comments.expect.txt | 19 + .../highlight.js/test/markup/php/comments.txt | 19 + .../test/markup/php/heredoc.expect.txt | 14 + .../highlight.js/test/markup/php/heredoc.txt | 14 + .../test/markup/pony/control-flow.expect.txt | 21 + .../test/markup/pony/control-flow.txt | 21 + .../test/markup/pony/creator.expect.txt | 3 + .../highlight.js/test/markup/pony/creator.txt | 3 + .../markup/pony/iterface-trait.expect.txt | 9 + .../test/markup/pony/iterface-trait.txt | 9 + .../test/markup/pony/lambda.expect.txt | 1 + .../highlight.js/test/markup/pony/lambda.txt | 1 + .../test/markup/pony/match.expect.txt | 8 + yknjs/highlight.js/test/markup/pony/match.txt | 8 + .../test/markup/pony/method.expect.txt | 8 + .../highlight.js/test/markup/pony/method.txt | 8 + .../test/markup/pony/objects.expect.txt | 11 + .../highlight.js/test/markup/pony/objects.txt | 11 + .../test/markup/pony/prime.expect.txt | 2 + yknjs/highlight.js/test/markup/pony/prime.txt | 2 + .../test/markup/pony/triple-quote.expect.txt | 5 + .../test/markup/pony/triple-quote.txt | 5 + .../powershell/apos-herestring.expect.txt | 11 + .../markup/powershell/apos-herestring.txt | 11 + .../powershell/quote-herestring.expect.txt | 11 + .../markup/powershell/quote-herestring.txt | 11 + .../test/markup/properties/syntax.expect.txt | 14 + .../test/markup/properties/syntax.txt | 14 + .../protobuf/message-message.expect.txt | 7 + .../test/markup/protobuf/message-message.txt | 7 + .../markup/python/escaped-quotes.expect.txt | 43 + .../test/markup/python/escaped-quotes.txt | 43 + .../test/markup/python/f-strings.expect.txt | 10 + .../test/markup/python/f-strings.txt | 10 + .../markup/python/function-header.expect.txt | 2 + .../test/markup/python/function-header.txt | 2 + .../python/matrix-multiplication.expect.txt | 7 + .../markup/python/matrix-multiplication.txt | 7 + .../test/markup/reasonml/functions.expect.txt | 22 + .../test/markup/reasonml/functions.txt | 22 + .../test/markup/reasonml/literals.expect.txt | 41 + .../test/markup/reasonml/literals.txt | 41 + .../test/markup/reasonml/modules.expect.txt | 19 + .../test/markup/reasonml/modules.txt | 19 + .../reasonml/pattern-matching.expect.txt | 20 + .../test/markup/reasonml/pattern-matching.txt | 20 + .../test/markup/ruby/gemfile.expect.txt | 3 + .../highlight.js/test/markup/ruby/gemfile.txt | 3 + .../test/markup/ruby/heredoc.expect.txt | 8 + .../highlight.js/test/markup/ruby/heredoc.txt | 8 + .../test/markup/ruby/prompt.expect.txt | 23 + .../highlight.js/test/markup/ruby/prompt.txt | 23 + .../test/markup/ruby/regexes.expect.txt | 5 + .../highlight.js/test/markup/ruby/regexes.txt | 5 + .../test/markup/rust/comments.expect.txt | 3 + .../test/markup/rust/comments.txt | 3 + .../test/markup/rust/numbers.expect.txt | 13 + .../highlight.js/test/markup/rust/numbers.txt | 13 + .../test/markup/rust/strings.expect.txt | 14 + .../highlight.js/test/markup/rust/strings.txt | 14 + .../test/markup/rust/traits.expect.txt | 3 + .../highlight.js/test/markup/rust/traits.txt | 3 + .../test/markup/rust/types.expect.txt | 4 + yknjs/highlight.js/test/markup/rust/types.txt | 4 + .../test/markup/rust/variables.expect.txt | 3 + .../test/markup/rust/variables.txt | 3 + .../test/markup/scala/case-classes.expect.txt | 3 + .../test/markup/scala/case-classes.txt | 3 + .../test/markup/scheme/lambda.expect.txt | 1 + .../test/markup/scheme/lambda.txt | 1 + .../test/markup/scheme/quoted.expect.txt | 1 + .../test/markup/scheme/quoted.txt | 1 + .../test/markup/sql/interval.expect.txt | 17 + .../highlight.js/test/markup/sql/interval.txt | 17 + .../test/markup/sql/join.expect.txt | 17 + yknjs/highlight.js/test/markup/sql/join.txt | 17 + .../test/markup/sql/keywords.expect.txt | 1 + .../highlight.js/test/markup/sql/keywords.txt | 1 + .../test/markup/sql/lateral-view.expect.txt | 7 + .../test/markup/sql/lateral-view.txt | 7 + .../test/markup/sql/numeric-types.expect.txt | 1 + .../test/markup/sql/numeric-types.txt | 1 + .../test/markup/sql/set-operator.expect.txt | 1 + .../test/markup/sql/set-operator.txt | 1 + .../test/markup/sql/tablesample.expect.txt | 5 + .../test/markup/sql/tablesample.txt | 5 + .../markup/sql/values-statement.expect.txt | 7 + .../test/markup/sql/values-statement.txt | 7 + .../markup/sql/window-function.expect.txt | 23 + .../test/markup/sql/window-function.txt | 23 + .../subunit/subunit-errorline.expect.txt | 2 + .../test/markup/subunit/subunit-errorline.txt | 2 + .../subunit/subunit-failureline.expect.txt | 4 + .../markup/subunit/subunit-failureline.txt | 4 + .../subunit/subunit-progressline.expect.txt | 7 + .../markup/subunit/subunit-progressline.txt | 7 + .../subunit/subunit-skipline.expect.txt | 3 + .../test/markup/subunit/subunit-skipline.txt | 3 + .../subunit/subunit-successline.expect.txt | 8 + .../markup/subunit/subunit-successline.txt | 8 + .../markup/subunit/subunit-tagline.expect.txt | 5 + .../test/markup/subunit/subunit-tagline.txt | 5 + .../subunit/subunit-testline.expect.txt | 10 + .../test/markup/subunit/subunit-testline.txt | 10 + .../subunit/subunit-timeline.expect.txt | 3 + .../test/markup/subunit/subunit-timeline.txt | 3 + .../subunit/subunit-uxsuccessline.expect.txt | 3 + .../markup/subunit/subunit-uxsuccessline.txt | 3 + .../subunit/subunit-xfailline.expect.txt | 3 + .../test/markup/subunit/subunit-xfailline.txt | 3 + .../test/markup/swift/functions.expect.txt | 10 + .../test/markup/swift/functions.txt | 10 + .../markup/swift/multiline-string.expect.txt | 3 + .../test/markup/swift/multiline-string.txt | 3 + .../test/markup/tap/basic.expect.txt | 5 + yknjs/highlight.js/test/markup/tap/basic.txt | 5 + .../markup/tap/without-numbers.expect.txt | 6 + .../test/markup/tap/without-numbers.txt | 6 + .../test/markup/tap/yaml-block.expect.txt | 26 + .../test/markup/tap/yaml-block.txt | 26 + .../twig/filter_with_underscore.expect.txt | 1 + .../markup/twig/filter_with_underscore.txt | 1 + .../test/markup/twig/template_tags.expect.txt | 12 + .../test/markup/twig/template_tags.txt | 11 + .../test/markup/typescript/class.expect.txt | 11 + .../test/markup/typescript/class.txt | 11 + .../typescript/decorator-factories.expect.txt | 13 + .../markup/typescript/decorator-factories.txt | 13 + .../markup/typescript/functions.expect.txt | 11 + .../test/markup/typescript/functions.txt | 11 + .../test/markup/typescript/jsx.expect.txt | 41 + .../test/markup/typescript/jsx.txt | 41 + .../markup/typescript/module-id.expect.txt | 14 + .../test/markup/typescript/module-id.txt | 14 + .../test/markup/verilog/misc.expect.txt | 37 + .../highlight.js/test/markup/verilog/misc.txt | 37 + .../test/markup/verilog/numbers.expect.txt | 8 + .../test/markup/verilog/numbers.txt | 8 + .../markup/vim/strings-comments.expect.txt | 4 + .../test/markup/vim/strings-comments.txt | 4 + .../x86asm/labels-directives.expect.txt | 6 + .../test/markup/x86asm/labels-directives.txt | 6 + .../markup/xml/space-attributes.expect.txt | 3 + .../test/markup/xml/space-attributes.txt | 3 + .../markup/xml/unquoted-attributes.expect.txt | 9 + .../test/markup/xml/unquoted-attributes.txt | 9 + .../markup/xquery/computed_inbuilt.expect.txt | 9 + .../test/markup/xquery/computed_inbuilt.txt | 9 + .../markup/xquery/direct_method.expect.txt | 12 + .../test/markup/xquery/direct_method.txt | 12 + .../markup/xquery/function_body.expect.txt | 11 + .../test/markup/xquery/function_body.txt | 11 + .../xquery/prolog_declarations.expect.txt | 22 + .../markup/xquery/prolog_declarations.txt | 22 + .../test/markup/yaml/string.expect.txt | 7 + .../highlight.js/test/markup/yaml/string.txt | 7 + .../test/markup/yaml/tag.expect.txt | 4 + yknjs/highlight.js/test/markup/yaml/tag.txt | 4 + yknjs/highlight.js/test/mocha.opts | 6 + .../test/special/buildClassName.js | 39 + .../highlight.js/test/special/customMarkup.js | 43 + .../test/special/endsWithParentVariants.js | 19 + .../test/special/explicitLanguage.js | 44 + yknjs/highlight.js/test/special/index.js | 45 + .../test/special/languageAlias.js | 20 + .../highlight.js/test/special/noHighlight.js | 88 + .../highlight.js/test/special/subLanguages.js | 17 + yknjs/highlight.js/test/special/useBr.js | 30 + yknjs/highlight.js/test/tools.js | 40 + yknjs/highlight.js/test/utility.js | 29 + yknjs/highlight.js/tools/all.js | 34 + yknjs/highlight.js/tools/browser.js | 165 + yknjs/highlight.js/tools/build.js | 89 + yknjs/highlight.js/tools/cdn.js | 88 + yknjs/highlight.js/tools/codeformat.js | 47 + yknjs/highlight.js/tools/developer.html | 107 + yknjs/highlight.js/tools/keywordsformat.js | 18 + yknjs/highlight.js/tools/node.js | 141 + yknjs/highlight.js/tools/tasks.js | 248 + yknjs/highlight.js/tools/utility.js | 180 + yknjs/images/.placeholder | 0 yknjs/index.html | 59 + yknjs/markdown/.placeholder | 0 yknjs/markdown/00-intro.md | 11 + yknjs/qrcode-replace.js | 13 + yknjs/qrcodejs/.gitignore | 4 + yknjs/qrcodejs/LICENSE | 14 + yknjs/qrcodejs/README.md | 46 + yknjs/qrcodejs/bower.json | 18 + yknjs/qrcodejs/index-svg.html | 47 + yknjs/qrcodejs/index.html | 44 + yknjs/qrcodejs/index.svg | 37 + yknjs/qrcodejs/jquery.min.js | 2 + yknjs/qrcodejs/qrcode.js | 614 + yknjs/qrcodejs/qrcode.min.js | 1 + yknjs/reveal-config.js | 41 + yknjs/reveal.js-menu/CONTRIBUTING.md | 9 + yknjs/reveal.js-menu/LICENSE | 19 + yknjs/reveal.js-menu/README.md | 334 + yknjs/reveal.js-menu/bower.json | 10 + yknjs/reveal.js-menu/font-awesome/LICENSE.txt | 34 + yknjs/reveal.js-menu/font-awesome/css/all.css | 5 + .../font-awesome/css/brands.css | 5 + .../font-awesome/css/fontawesome.css | 5 + .../font-awesome/css/regular.css | 5 + .../reveal.js-menu/font-awesome/css/solid.css | 5 + .../font-awesome/css/svg-with-js.css | 5 + .../font-awesome/css/v4-shims.css | 2170 +++ .../font-awesome/css/v4-shims.min.css | 5 + .../font-awesome/webfonts/fa-brands-400.eot | Bin 0 -> 115052 bytes .../font-awesome/webfonts/fa-brands-400.svg | 1127 ++ .../font-awesome/webfonts/fa-brands-400.ttf | Bin 0 -> 114816 bytes .../font-awesome/webfonts/fa-brands-400.woff | Bin 0 -> 73920 bytes .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 63376 bytes .../font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 40744 bytes .../font-awesome/webfonts/fa-regular-400.svg | 467 + .../font-awesome/webfonts/fa-regular-400.ttf | Bin 0 -> 40516 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 18212 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 14952 bytes .../font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 160768 bytes .../font-awesome/webfonts/fa-solid-900.svg | 2231 +++ .../font-awesome/webfonts/fa-solid-900.ttf | Bin 0 -> 160548 bytes .../font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 76632 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 59572 bytes yknjs/reveal.js-menu/menu.css | 345 + yknjs/reveal.js-menu/menu.js | 955 + yknjs/reveal.js-menu/package.json | 22 + yknjs/reveal.js-plugins/.gitmodules | 3 + yknjs/reveal.js-plugins/LICENSE | 22 + yknjs/reveal.js-plugins/README.md | 44 + yknjs/reveal.js-plugins/animate/README.md | 228 + yknjs/reveal.js-plugins/animate/plugin.js | 446 + yknjs/reveal.js-plugins/animate/svg.min.js | 3 + yknjs/reveal.js-plugins/anything/README.md | 280 + yknjs/reveal.js-plugins/anything/plugin.js | 101 + .../audio-slideshow/README.md | 171 + .../audio-slideshow/RecordRTC.js | 5590 ++++++ .../audio-slideshow/plugin.js | 450 + .../audio-slideshow/recorder.js | 392 + yknjs/reveal.js-plugins/bower.json | 24 + yknjs/reveal.js-plugins/chalkboard/README.md | 140 + .../chalkboard/img/blackboard.png | Bin 0 -> 32733 bytes .../chalkboard/img/boardmarker-black.png | Bin 0 -> 2142 bytes .../chalkboard/img/boardmarker-blue.png | Bin 0 -> 2127 bytes .../chalkboard/img/boardmarker-green.png | Bin 0 -> 2106 bytes .../chalkboard/img/boardmarker-orange.png | Bin 0 -> 2240 bytes .../chalkboard/img/boardmarker-purple.png | Bin 0 -> 2044 bytes .../chalkboard/img/boardmarker-red.png | Bin 0 -> 2119 bytes .../chalkboard/img/boardmarker-yellow.png | Bin 0 -> 2105 bytes .../chalkboard/img/chalk-blue.png | Bin 0 -> 5150 bytes .../chalkboard/img/chalk-green.png | Bin 0 -> 4801 bytes .../chalkboard/img/chalk-orange.png | Bin 0 -> 5010 bytes .../chalkboard/img/chalk-purple.png | Bin 0 -> 5250 bytes .../chalkboard/img/chalk-red.png | Bin 0 -> 4786 bytes .../chalkboard/img/chalk-white.png | Bin 0 -> 5199 bytes .../chalkboard/img/chalk-yellow.png | Bin 0 -> 5097 bytes .../chalkboard/img/sponge.png | Bin 0 -> 3612 bytes .../chalkboard/img/whiteboard.png | Bin 0 -> 34129 bytes yknjs/reveal.js-plugins/chalkboard/plugin.js | 1617 ++ yknjs/reveal.js-plugins/chart/Chart.js | 16151 ++++++++++++++++ yknjs/reveal.js-plugins/chart/Chart.min.js | 7 + yknjs/reveal.js-plugins/chart/README.md | 172 + yknjs/reveal.js-plugins/chart/plugin.js | 179 + .../customcontrols/README.md | 68 + .../customcontrols/plugin.js | 56 + yknjs/reveal.js-plugins/embed-tweet/README.md | 35 + yknjs/reveal.js-plugins/embed-tweet/plugin.js | 63 + yknjs/reveal.js-plugins/fullscreen/README.md | 27 + yknjs/reveal.js-plugins/fullscreen/plugin.js | 46 + yknjs/reveal.js-plugins/package.json | 23 + yknjs/reveal.js/.gitignore | 13 + yknjs/reveal.js/.travis.yml | 5 + yknjs/reveal.js/CONTRIBUTING.md | 23 + yknjs/reveal.js/LICENSE | 19 + yknjs/reveal.js/README.md | 1388 ++ yknjs/reveal.js/bower.json | 24 + yknjs/reveal.js/css/print/paper.css | 203 + yknjs/reveal.js/css/print/pdf.css | 164 + yknjs/reveal.js/css/reset.css | 30 + yknjs/reveal.js/css/reveal.css | 1598 ++ yknjs/reveal.js/css/reveal.scss | 1768 ++ yknjs/reveal.js/css/theme/README.md | 21 + yknjs/reveal.js/css/theme/beige.css | 277 + yknjs/reveal.js/css/theme/black.css | 273 + yknjs/reveal.js/css/theme/blood.css | 296 + yknjs/reveal.js/css/theme/league.css | 279 + yknjs/reveal.js/css/theme/moon.css | 277 + yknjs/reveal.js/css/theme/night.css | 271 + yknjs/reveal.js/css/theme/serif.css | 273 + yknjs/reveal.js/css/theme/simple.css | 276 + yknjs/reveal.js/css/theme/sky.css | 280 + yknjs/reveal.js/css/theme/solarized.css | 277 + yknjs/reveal.js/css/theme/source/beige.scss | 39 + yknjs/reveal.js/css/theme/source/black.scss | 49 + yknjs/reveal.js/css/theme/source/blood.scss | 78 + yknjs/reveal.js/css/theme/source/league.scss | 34 + yknjs/reveal.js/css/theme/source/moon.scss | 57 + yknjs/reveal.js/css/theme/source/night.scss | 34 + yknjs/reveal.js/css/theme/source/serif.scss | 35 + yknjs/reveal.js/css/theme/source/simple.scss | 43 + yknjs/reveal.js/css/theme/source/sky.scss | 46 + .../reveal.js/css/theme/source/solarized.scss | 63 + yknjs/reveal.js/css/theme/source/white.scss | 49 + .../reveal.js/css/theme/template/mixins.scss | 29 + .../css/theme/template/settings.scss | 45 + yknjs/reveal.js/css/theme/template/theme.scss | 325 + yknjs/reveal.js/css/theme/white.css | 273 + yknjs/reveal.js/demo.html | 425 + yknjs/reveal.js/gruntfile.js | 192 + yknjs/reveal.js/index.html | 49 + yknjs/reveal.js/js/reveal.js | 6028 ++++++ yknjs/reveal.js/lib/css/monokai.css | 71 + yknjs/reveal.js/lib/css/zenburn.css | 80 + .../reveal.js/lib/font/league-gothic/LICENSE | 2 + .../lib/font/league-gothic/league-gothic.css | 10 + .../lib/font/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../lib/font/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../lib/font/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../lib/font/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../font/source-sans-pro/source-sans-pro.css | 39 + yknjs/reveal.js/lib/js/html5shiv.js | 7 + yknjs/reveal.js/lib/js/promise.js | 2 + yknjs/reveal.js/package-lock.json | 5891 ++++++ yknjs/reveal.js/package.json | 44 + yknjs/reveal.js/plugin/highlight/highlight.js | 168 + yknjs/reveal.js/plugin/markdown/example.html | 134 + yknjs/reveal.js/plugin/markdown/example.md | 36 + yknjs/reveal.js/plugin/markdown/markdown.js | 446 + yknjs/reveal.js/plugin/markdown/marked.js | 6 + yknjs/reveal.js/plugin/math/math.js | 92 + yknjs/reveal.js/plugin/multiplex/client.js | 13 + yknjs/reveal.js/plugin/multiplex/index.js | 64 + yknjs/reveal.js/plugin/multiplex/master.js | 34 + yknjs/reveal.js/plugin/multiplex/package.json | 19 + yknjs/reveal.js/plugin/notes-server/client.js | 65 + yknjs/reveal.js/plugin/notes-server/index.js | 69 + .../reveal.js/plugin/notes-server/notes.html | 585 + yknjs/reveal.js/plugin/notes/notes.html | 834 + yknjs/reveal.js/plugin/notes/notes.js | 178 + yknjs/reveal.js/plugin/print-pdf/print-pdf.js | 67 + yknjs/reveal.js/plugin/search/search.js | 206 + yknjs/reveal.js/plugin/zoom-js/zoom.js | 277 + .../test/assets/external-script-a.js | 1 + .../test/assets/external-script-b.js | 1 + .../test/assets/external-script-c.js | 1 + .../test/assets/external-script-d.js | 1 + .../test/examples/assets/beeping.txt | 2 + .../test/examples/assets/beeping.wav | Bin 0 -> 422472 bytes .../reveal.js/test/examples/assets/image1.png | Bin 0 -> 21991 bytes .../reveal.js/test/examples/assets/image2.png | Bin 0 -> 10237 bytes yknjs/reveal.js/test/examples/barebones.html | 41 + .../test/examples/embedded-media.html | 53 + yknjs/reveal.js/test/examples/math.html | 205 + .../test/examples/slide-backgrounds.html | 143 + .../test/examples/slide-transitions.html | 100 + yknjs/reveal.js/test/qunit-2.5.0.css | 436 + yknjs/reveal.js/test/qunit-2.5.0.js | 5188 +++++ yknjs/reveal.js/test/simple.md | 12 + .../test/test-dependencies-async.html | 78 + yknjs/reveal.js/test/test-dependencies.html | 54 + .../reveal.js/test/test-grid-navigation.html | 74 + yknjs/reveal.js/test/test-iframes.html | 108 + .../test-markdown-element-attributes.html | 132 + .../test/test-markdown-element-attributes.js | 44 + .../test/test-markdown-external.html | 37 + .../reveal.js/test/test-markdown-external.js | 20 + .../reveal.js/test/test-markdown-options.html | 40 + yknjs/reveal.js/test/test-markdown-options.js | 27 + .../test/test-markdown-slide-attributes.html | 127 + .../test/test-markdown-slide-attributes.js | 44 + yknjs/reveal.js/test/test-markdown.html | 51 + yknjs/reveal.js/test/test-markdown.js | 11 + yknjs/reveal.js/test/test-pdf.html | 82 + yknjs/reveal.js/test/test-pdf.js | 12 + yknjs/reveal.js/test/test-plugins.html | 105 + yknjs/reveal.js/test/test-state.html | 139 + yknjs/reveal.js/test/test.html | 85 + yknjs/reveal.js/test/test.js | 598 + 1115 files changed, 121268 insertions(+) create mode 100644 yknjs/LICENSE create mode 100644 yknjs/README.md create mode 100644 yknjs/a create mode 100644 yknjs/bin/.gitignore create mode 100644 yknjs/bin/README.md create mode 100755 yknjs/bin/asciinema.sh create mode 100755 yknjs/bin/demo.sh create mode 100755 yknjs/bin/screen.sh create mode 100755 yknjs/bin/shellinabox.sh create mode 100755 yknjs/compile-and-add-css.sh create mode 100644 yknjs/css/qrcode.css create mode 100644 yknjs/css/qrcode.scss create mode 100644 yknjs/css/reveal-override.css create mode 100644 yknjs/css/reveal-override.scss create mode 100644 yknjs/fonts/.placeholder create mode 100644 yknjs/highlight.js/.editorconfig create mode 100644 yknjs/highlight.js/.gitattributes create mode 100644 yknjs/highlight.js/.gitignore create mode 100644 yknjs/highlight.js/.travis.yml create mode 100644 yknjs/highlight.js/AUTHORS.en.txt create mode 100644 yknjs/highlight.js/CHANGES.md create mode 100644 yknjs/highlight.js/LICENSE create mode 100644 yknjs/highlight.js/README.md create mode 100644 yknjs/highlight.js/README.ru.md create mode 100644 yknjs/highlight.js/demo/demo.js create mode 100644 yknjs/highlight.js/demo/index.html create mode 100644 yknjs/highlight.js/demo/jquery-2.1.1.min.js create mode 100644 yknjs/highlight.js/demo/perfect-scrollbar.min.css create mode 100644 yknjs/highlight.js/demo/perfect-scrollbar.min.js create mode 100644 yknjs/highlight.js/demo/readme.md create mode 100644 yknjs/highlight.js/demo/style.css create mode 100644 yknjs/highlight.js/docs/Makefile create mode 100644 yknjs/highlight.js/docs/_static/.gitkeep create mode 100644 yknjs/highlight.js/docs/_templates/.gitkeep create mode 100644 yknjs/highlight.js/docs/api.rst create mode 100644 yknjs/highlight.js/docs/building-testing.rst create mode 100644 yknjs/highlight.js/docs/conf.py create mode 100644 yknjs/highlight.js/docs/css-classes-reference.rst create mode 100644 yknjs/highlight.js/docs/index.rst create mode 100644 yknjs/highlight.js/docs/language-contribution.rst create mode 100644 yknjs/highlight.js/docs/language-guide.rst create mode 100644 yknjs/highlight.js/docs/language-requests.rst create mode 100644 yknjs/highlight.js/docs/line-numbers.rst create mode 100644 yknjs/highlight.js/docs/maintainers-guide.rst create mode 100644 yknjs/highlight.js/docs/reference.rst create mode 100644 yknjs/highlight.js/docs/style-guide.rst create mode 100644 yknjs/highlight.js/package-lock.json create mode 100644 yknjs/highlight.js/package.json create mode 100644 yknjs/highlight.js/src/highlight.js create mode 100644 yknjs/highlight.js/src/languages/1c.js create mode 100644 yknjs/highlight.js/src/languages/abnf.js create mode 100644 yknjs/highlight.js/src/languages/accesslog.js create mode 100644 yknjs/highlight.js/src/languages/actionscript.js create mode 100644 yknjs/highlight.js/src/languages/ada.js create mode 100644 yknjs/highlight.js/src/languages/angelscript.js create mode 100644 yknjs/highlight.js/src/languages/apache.js create mode 100644 yknjs/highlight.js/src/languages/applescript.js create mode 100644 yknjs/highlight.js/src/languages/arcade.js create mode 100644 yknjs/highlight.js/src/languages/arduino.js create mode 100644 yknjs/highlight.js/src/languages/armasm.js create mode 100644 yknjs/highlight.js/src/languages/asciidoc.js create mode 100644 yknjs/highlight.js/src/languages/aspectj.js create mode 100644 yknjs/highlight.js/src/languages/autohotkey.js create mode 100644 yknjs/highlight.js/src/languages/autoit.js create mode 100644 yknjs/highlight.js/src/languages/avrasm.js create mode 100644 yknjs/highlight.js/src/languages/awk.js create mode 100644 yknjs/highlight.js/src/languages/axapta.js create mode 100644 yknjs/highlight.js/src/languages/bash.js create mode 100644 yknjs/highlight.js/src/languages/basic.js create mode 100644 yknjs/highlight.js/src/languages/bnf.js create mode 100644 yknjs/highlight.js/src/languages/brainfuck.js create mode 100644 yknjs/highlight.js/src/languages/cal.js create mode 100644 yknjs/highlight.js/src/languages/capnproto.js create mode 100644 yknjs/highlight.js/src/languages/ceylon.js create mode 100644 yknjs/highlight.js/src/languages/clean.js create mode 100644 yknjs/highlight.js/src/languages/clojure-repl.js create mode 100644 yknjs/highlight.js/src/languages/clojure.js create mode 100644 yknjs/highlight.js/src/languages/cmake.js create mode 100644 yknjs/highlight.js/src/languages/coffeescript.js create mode 100644 yknjs/highlight.js/src/languages/coq.js create mode 100644 yknjs/highlight.js/src/languages/cos.js create mode 100644 yknjs/highlight.js/src/languages/cpp.js create mode 100644 yknjs/highlight.js/src/languages/crmsh.js create mode 100644 yknjs/highlight.js/src/languages/crystal.js create mode 100644 yknjs/highlight.js/src/languages/cs.js create mode 100644 yknjs/highlight.js/src/languages/csp.js create mode 100644 yknjs/highlight.js/src/languages/css.js create mode 100644 yknjs/highlight.js/src/languages/d.js create mode 100644 yknjs/highlight.js/src/languages/dart.js create mode 100644 yknjs/highlight.js/src/languages/delphi.js create mode 100644 yknjs/highlight.js/src/languages/diff.js create mode 100644 yknjs/highlight.js/src/languages/django.js create mode 100644 yknjs/highlight.js/src/languages/dns.js create mode 100644 yknjs/highlight.js/src/languages/dockerfile.js create mode 100644 yknjs/highlight.js/src/languages/dos.js create mode 100644 yknjs/highlight.js/src/languages/dsconfig.js create mode 100644 yknjs/highlight.js/src/languages/dts.js create mode 100644 yknjs/highlight.js/src/languages/dust.js create mode 100644 yknjs/highlight.js/src/languages/ebnf.js create mode 100644 yknjs/highlight.js/src/languages/elixir.js create mode 100644 yknjs/highlight.js/src/languages/elm.js create mode 100644 yknjs/highlight.js/src/languages/erb.js create mode 100644 yknjs/highlight.js/src/languages/erlang-repl.js create mode 100644 yknjs/highlight.js/src/languages/erlang.js create mode 100644 yknjs/highlight.js/src/languages/excel.js create mode 100644 yknjs/highlight.js/src/languages/fix.js create mode 100644 yknjs/highlight.js/src/languages/flix.js create mode 100644 yknjs/highlight.js/src/languages/fortran.js create mode 100644 yknjs/highlight.js/src/languages/fsharp.js create mode 100644 yknjs/highlight.js/src/languages/gams.js create mode 100644 yknjs/highlight.js/src/languages/gauss.js create mode 100644 yknjs/highlight.js/src/languages/gcode.js create mode 100644 yknjs/highlight.js/src/languages/gherkin.js create mode 100644 yknjs/highlight.js/src/languages/glsl.js create mode 100644 yknjs/highlight.js/src/languages/gml.js create mode 100644 yknjs/highlight.js/src/languages/go.js create mode 100644 yknjs/highlight.js/src/languages/golo.js create mode 100644 yknjs/highlight.js/src/languages/gradle.js create mode 100644 yknjs/highlight.js/src/languages/groovy.js create mode 100644 yknjs/highlight.js/src/languages/haml.js create mode 100644 yknjs/highlight.js/src/languages/handlebars.js create mode 100644 yknjs/highlight.js/src/languages/haskell.js create mode 100644 yknjs/highlight.js/src/languages/haxe.js create mode 100644 yknjs/highlight.js/src/languages/hsp.js create mode 100644 yknjs/highlight.js/src/languages/htmlbars.js create mode 100644 yknjs/highlight.js/src/languages/http.js create mode 100644 yknjs/highlight.js/src/languages/hy.js create mode 100644 yknjs/highlight.js/src/languages/inform7.js create mode 100644 yknjs/highlight.js/src/languages/ini.js create mode 100644 yknjs/highlight.js/src/languages/irpf90.js create mode 100644 yknjs/highlight.js/src/languages/isbl.js create mode 100644 yknjs/highlight.js/src/languages/java.js create mode 100644 yknjs/highlight.js/src/languages/javascript.js create mode 100644 yknjs/highlight.js/src/languages/jboss-cli.js create mode 100644 yknjs/highlight.js/src/languages/json.js create mode 100644 yknjs/highlight.js/src/languages/julia-repl.js create mode 100644 yknjs/highlight.js/src/languages/julia.js create mode 100644 yknjs/highlight.js/src/languages/kotlin.js create mode 100644 yknjs/highlight.js/src/languages/lasso.js create mode 100644 yknjs/highlight.js/src/languages/ldif.js create mode 100644 yknjs/highlight.js/src/languages/leaf.js create mode 100644 yknjs/highlight.js/src/languages/less.js create mode 100644 yknjs/highlight.js/src/languages/lisp.js create mode 100644 yknjs/highlight.js/src/languages/livecodeserver.js create mode 100644 yknjs/highlight.js/src/languages/livescript.js create mode 100644 yknjs/highlight.js/src/languages/llvm.js create mode 100644 yknjs/highlight.js/src/languages/lsl.js create mode 100644 yknjs/highlight.js/src/languages/lua.js create mode 100644 yknjs/highlight.js/src/languages/makefile.js create mode 100644 yknjs/highlight.js/src/languages/markdown.js create mode 100644 yknjs/highlight.js/src/languages/mathematica.js create mode 100644 yknjs/highlight.js/src/languages/matlab.js create mode 100644 yknjs/highlight.js/src/languages/maxima.js create mode 100644 yknjs/highlight.js/src/languages/mel.js create mode 100644 yknjs/highlight.js/src/languages/mercury.js create mode 100644 yknjs/highlight.js/src/languages/mipsasm.js create mode 100644 yknjs/highlight.js/src/languages/mizar.js create mode 100644 yknjs/highlight.js/src/languages/mojolicious.js create mode 100644 yknjs/highlight.js/src/languages/monkey.js create mode 100644 yknjs/highlight.js/src/languages/moonscript.js create mode 100644 yknjs/highlight.js/src/languages/n1ql.js create mode 100644 yknjs/highlight.js/src/languages/nginx.js create mode 100644 yknjs/highlight.js/src/languages/nimrod.js create mode 100644 yknjs/highlight.js/src/languages/nix.js create mode 100644 yknjs/highlight.js/src/languages/nsis.js create mode 100644 yknjs/highlight.js/src/languages/objectivec.js create mode 100644 yknjs/highlight.js/src/languages/ocaml.js create mode 100644 yknjs/highlight.js/src/languages/openscad.js create mode 100644 yknjs/highlight.js/src/languages/oxygene.js create mode 100644 yknjs/highlight.js/src/languages/parser3.js create mode 100644 yknjs/highlight.js/src/languages/perl.js create mode 100644 yknjs/highlight.js/src/languages/pf.js create mode 100644 yknjs/highlight.js/src/languages/pgsql.js create mode 100644 yknjs/highlight.js/src/languages/php.js create mode 100644 yknjs/highlight.js/src/languages/plaintext.js create mode 100644 yknjs/highlight.js/src/languages/pony.js create mode 100644 yknjs/highlight.js/src/languages/powershell.js create mode 100644 yknjs/highlight.js/src/languages/processing.js create mode 100644 yknjs/highlight.js/src/languages/profile.js create mode 100644 yknjs/highlight.js/src/languages/prolog.js create mode 100644 yknjs/highlight.js/src/languages/properties.js create mode 100644 yknjs/highlight.js/src/languages/protobuf.js create mode 100644 yknjs/highlight.js/src/languages/puppet.js create mode 100644 yknjs/highlight.js/src/languages/purebasic.js create mode 100644 yknjs/highlight.js/src/languages/python.js create mode 100644 yknjs/highlight.js/src/languages/q.js create mode 100644 yknjs/highlight.js/src/languages/qml.js create mode 100644 yknjs/highlight.js/src/languages/r.js create mode 100644 yknjs/highlight.js/src/languages/reasonml.js create mode 100644 yknjs/highlight.js/src/languages/rib.js create mode 100644 yknjs/highlight.js/src/languages/roboconf.js create mode 100644 yknjs/highlight.js/src/languages/routeros.js create mode 100644 yknjs/highlight.js/src/languages/rsl.js create mode 100644 yknjs/highlight.js/src/languages/ruby.js create mode 100644 yknjs/highlight.js/src/languages/ruleslanguage.js create mode 100644 yknjs/highlight.js/src/languages/rust.js create mode 100644 yknjs/highlight.js/src/languages/sas.js create mode 100644 yknjs/highlight.js/src/languages/scala.js create mode 100644 yknjs/highlight.js/src/languages/scheme.js create mode 100644 yknjs/highlight.js/src/languages/scilab.js create mode 100644 yknjs/highlight.js/src/languages/scss.js create mode 100644 yknjs/highlight.js/src/languages/shell.js create mode 100644 yknjs/highlight.js/src/languages/smali.js create mode 100644 yknjs/highlight.js/src/languages/smalltalk.js create mode 100644 yknjs/highlight.js/src/languages/sml.js create mode 100644 yknjs/highlight.js/src/languages/sqf.js create mode 100644 yknjs/highlight.js/src/languages/sql.js create mode 100644 yknjs/highlight.js/src/languages/stan.js create mode 100644 yknjs/highlight.js/src/languages/stata.js create mode 100644 yknjs/highlight.js/src/languages/step21.js create mode 100644 yknjs/highlight.js/src/languages/stylus.js create mode 100644 yknjs/highlight.js/src/languages/subunit.js create mode 100644 yknjs/highlight.js/src/languages/swift.js create mode 100644 yknjs/highlight.js/src/languages/taggerscript.js create mode 100644 yknjs/highlight.js/src/languages/tap.js create mode 100644 yknjs/highlight.js/src/languages/tcl.js create mode 100644 yknjs/highlight.js/src/languages/tex.js create mode 100644 yknjs/highlight.js/src/languages/thrift.js create mode 100644 yknjs/highlight.js/src/languages/tp.js create mode 100644 yknjs/highlight.js/src/languages/twig.js create mode 100644 yknjs/highlight.js/src/languages/typescript.js create mode 100644 yknjs/highlight.js/src/languages/vala.js create mode 100644 yknjs/highlight.js/src/languages/vbnet.js create mode 100644 yknjs/highlight.js/src/languages/vbscript-html.js create mode 100644 yknjs/highlight.js/src/languages/vbscript.js create mode 100644 yknjs/highlight.js/src/languages/verilog.js create mode 100644 yknjs/highlight.js/src/languages/vhdl.js create mode 100644 yknjs/highlight.js/src/languages/vim.js create mode 100644 yknjs/highlight.js/src/languages/x86asm.js create mode 100644 yknjs/highlight.js/src/languages/xl.js create mode 100644 yknjs/highlight.js/src/languages/xml.js create mode 100644 yknjs/highlight.js/src/languages/xquery.js create mode 100644 yknjs/highlight.js/src/languages/yaml.js create mode 100644 yknjs/highlight.js/src/languages/zephir.js create mode 100644 yknjs/highlight.js/src/styles/a11y-dark.css create mode 100644 yknjs/highlight.js/src/styles/a11y-light.css create mode 100644 yknjs/highlight.js/src/styles/agate.css create mode 100644 yknjs/highlight.js/src/styles/an-old-hope.css create mode 100644 yknjs/highlight.js/src/styles/androidstudio.css create mode 100644 yknjs/highlight.js/src/styles/arduino-light.css create mode 100644 yknjs/highlight.js/src/styles/arta.css create mode 100644 yknjs/highlight.js/src/styles/ascetic.css create mode 100644 yknjs/highlight.js/src/styles/atelier-cave-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-cave-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-dune-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-dune-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-estuary-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-estuary-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-forest-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-forest-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-heath-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-heath-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-lakeside-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-lakeside-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-plateau-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-plateau-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-savanna-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-savanna-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-seaside-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-seaside-light.css create mode 100644 yknjs/highlight.js/src/styles/atelier-sulphurpool-dark.css create mode 100644 yknjs/highlight.js/src/styles/atelier-sulphurpool-light.css create mode 100644 yknjs/highlight.js/src/styles/atom-one-dark-reasonable.css create mode 100644 yknjs/highlight.js/src/styles/atom-one-dark.css create mode 100644 yknjs/highlight.js/src/styles/atom-one-light.css create mode 100644 yknjs/highlight.js/src/styles/brown-paper.css create mode 100644 yknjs/highlight.js/src/styles/brown-papersq.png create mode 100644 yknjs/highlight.js/src/styles/codepen-embed.css create mode 100644 yknjs/highlight.js/src/styles/color-brewer.css create mode 100644 yknjs/highlight.js/src/styles/darcula.css create mode 100644 yknjs/highlight.js/src/styles/dark.css create mode 100644 yknjs/highlight.js/src/styles/darkula.css create mode 100644 yknjs/highlight.js/src/styles/default.css create mode 100644 yknjs/highlight.js/src/styles/docco.css create mode 100644 yknjs/highlight.js/src/styles/dracula.css create mode 100644 yknjs/highlight.js/src/styles/far.css create mode 100644 yknjs/highlight.js/src/styles/foundation.css create mode 100644 yknjs/highlight.js/src/styles/github-gist.css create mode 100644 yknjs/highlight.js/src/styles/github.css create mode 100644 yknjs/highlight.js/src/styles/gml.css create mode 100644 yknjs/highlight.js/src/styles/googlecode.css create mode 100644 yknjs/highlight.js/src/styles/grayscale.css create mode 100644 yknjs/highlight.js/src/styles/gruvbox-dark.css create mode 100644 yknjs/highlight.js/src/styles/gruvbox-light.css create mode 100644 yknjs/highlight.js/src/styles/hopscotch.css create mode 100644 yknjs/highlight.js/src/styles/hybrid.css create mode 100644 yknjs/highlight.js/src/styles/idea.css create mode 100644 yknjs/highlight.js/src/styles/ir-black.css create mode 100644 yknjs/highlight.js/src/styles/isbl-editor-dark.css create mode 100644 yknjs/highlight.js/src/styles/isbl-editor-light.css create mode 100644 yknjs/highlight.js/src/styles/kimbie.dark.css create mode 100644 yknjs/highlight.js/src/styles/kimbie.light.css create mode 100644 yknjs/highlight.js/src/styles/lightfair.css create mode 100644 yknjs/highlight.js/src/styles/magula.css create mode 100644 yknjs/highlight.js/src/styles/mono-blue.css create mode 100644 yknjs/highlight.js/src/styles/monokai-sublime.css create mode 100644 yknjs/highlight.js/src/styles/monokai.css create mode 100644 yknjs/highlight.js/src/styles/nord.css create mode 100644 yknjs/highlight.js/src/styles/obsidian.css create mode 100644 yknjs/highlight.js/src/styles/ocean.css create mode 100644 yknjs/highlight.js/src/styles/paraiso-dark.css create mode 100644 yknjs/highlight.js/src/styles/paraiso-light.css create mode 100644 yknjs/highlight.js/src/styles/pojoaque.css create mode 100644 yknjs/highlight.js/src/styles/pojoaque.jpg create mode 100644 yknjs/highlight.js/src/styles/purebasic.css create mode 100644 yknjs/highlight.js/src/styles/qtcreator_dark.css create mode 100644 yknjs/highlight.js/src/styles/qtcreator_light.css create mode 100644 yknjs/highlight.js/src/styles/railscasts.css create mode 100644 yknjs/highlight.js/src/styles/rainbow.css create mode 100644 yknjs/highlight.js/src/styles/routeros.css create mode 100644 yknjs/highlight.js/src/styles/school-book.css create mode 100644 yknjs/highlight.js/src/styles/school-book.png create mode 100644 yknjs/highlight.js/src/styles/shades-of-purple.css create mode 100644 yknjs/highlight.js/src/styles/solarized-dark.css create mode 100644 yknjs/highlight.js/src/styles/solarized-light.css create mode 100644 yknjs/highlight.js/src/styles/sunburst.css create mode 100644 yknjs/highlight.js/src/styles/tomorrow-night-blue.css create mode 100644 yknjs/highlight.js/src/styles/tomorrow-night-bright.css create mode 100644 yknjs/highlight.js/src/styles/tomorrow-night-eighties.css create mode 100644 yknjs/highlight.js/src/styles/tomorrow-night.css create mode 100644 yknjs/highlight.js/src/styles/tomorrow.css create mode 100644 yknjs/highlight.js/src/styles/vs.css create mode 100644 yknjs/highlight.js/src/styles/vs2015.css create mode 100644 yknjs/highlight.js/src/styles/xcode.css create mode 100644 yknjs/highlight.js/src/styles/xt256.css create mode 100644 yknjs/highlight.js/src/styles/zenburn.css create mode 100644 yknjs/highlight.js/test/api/autoDetection.js create mode 100644 yknjs/highlight.js/test/api/binaryNumber.js create mode 100644 yknjs/highlight.js/test/api/cNumber.js create mode 100644 yknjs/highlight.js/test/api/fixmarkup.js create mode 100644 yknjs/highlight.js/test/api/getLanguage.js create mode 100644 yknjs/highlight.js/test/api/highlight.js create mode 100644 yknjs/highlight.js/test/api/ident.js create mode 100644 yknjs/highlight.js/test/api/index.js create mode 100644 yknjs/highlight.js/test/api/number.js create mode 100644 yknjs/highlight.js/test/api/starters.js create mode 100644 yknjs/highlight.js/test/api/underscoreIdent.js create mode 100644 yknjs/highlight.js/test/browser/index.js create mode 100644 yknjs/highlight.js/test/browser/plain.js create mode 100644 yknjs/highlight.js/test/browser/worker.js create mode 100644 yknjs/highlight.js/test/detect/1c/default.txt create mode 100644 yknjs/highlight.js/test/detect/abnf/default.txt create mode 100644 yknjs/highlight.js/test/detect/accesslog/default.txt create mode 100644 yknjs/highlight.js/test/detect/actionscript/default.txt create mode 100644 yknjs/highlight.js/test/detect/ada/default.txt create mode 100644 yknjs/highlight.js/test/detect/angelscript/default.txt create mode 100644 yknjs/highlight.js/test/detect/apache/default.txt create mode 100644 yknjs/highlight.js/test/detect/applescript/default.txt create mode 100644 yknjs/highlight.js/test/detect/arcade/default.txt create mode 100644 yknjs/highlight.js/test/detect/arduino/default.txt create mode 100644 yknjs/highlight.js/test/detect/armasm/default.txt create mode 100644 yknjs/highlight.js/test/detect/asciidoc/default.txt create mode 100644 yknjs/highlight.js/test/detect/aspectj/default.txt create mode 100644 yknjs/highlight.js/test/detect/autohotkey/default.txt create mode 100644 yknjs/highlight.js/test/detect/autoit/default.txt create mode 100644 yknjs/highlight.js/test/detect/avrasm/default.txt create mode 100644 yknjs/highlight.js/test/detect/awk/default.txt create mode 100644 yknjs/highlight.js/test/detect/axapta/default.txt create mode 100644 yknjs/highlight.js/test/detect/bash/default.txt create mode 100644 yknjs/highlight.js/test/detect/basic/default.txt create mode 100644 yknjs/highlight.js/test/detect/bnf/default.txt create mode 100644 yknjs/highlight.js/test/detect/brainfuck/default.txt create mode 100644 yknjs/highlight.js/test/detect/cal/default.txt create mode 100644 yknjs/highlight.js/test/detect/capnproto/default.txt create mode 100644 yknjs/highlight.js/test/detect/ceylon/default.txt create mode 100644 yknjs/highlight.js/test/detect/clean/default.txt create mode 100644 yknjs/highlight.js/test/detect/clojure-repl/default.txt create mode 100644 yknjs/highlight.js/test/detect/clojure/default.txt create mode 100644 yknjs/highlight.js/test/detect/cmake/default.txt create mode 100644 yknjs/highlight.js/test/detect/coffeescript/default.txt create mode 100644 yknjs/highlight.js/test/detect/coq/default.txt create mode 100644 yknjs/highlight.js/test/detect/cos/default.txt create mode 100644 yknjs/highlight.js/test/detect/cpp/comment.txt create mode 100644 yknjs/highlight.js/test/detect/cpp/default.txt create mode 100644 yknjs/highlight.js/test/detect/crmsh/default.txt create mode 100644 yknjs/highlight.js/test/detect/crystal/default.txt create mode 100644 yknjs/highlight.js/test/detect/cs/default.txt create mode 100644 yknjs/highlight.js/test/detect/csp/default.txt create mode 100644 yknjs/highlight.js/test/detect/css/default.txt create mode 100644 yknjs/highlight.js/test/detect/d/default.txt create mode 100644 yknjs/highlight.js/test/detect/dart/default.txt create mode 100644 yknjs/highlight.js/test/detect/delphi/default.txt create mode 100644 yknjs/highlight.js/test/detect/diff/default.txt create mode 100644 yknjs/highlight.js/test/detect/django/default.txt create mode 100644 yknjs/highlight.js/test/detect/dns/default.txt create mode 100644 yknjs/highlight.js/test/detect/dockerfile/default.txt create mode 100644 yknjs/highlight.js/test/detect/dos/default.txt create mode 100644 yknjs/highlight.js/test/detect/dsconfig/default.txt create mode 100644 yknjs/highlight.js/test/detect/dts/default.txt create mode 100644 yknjs/highlight.js/test/detect/dust/default.txt create mode 100644 yknjs/highlight.js/test/detect/ebnf/default.txt create mode 100644 yknjs/highlight.js/test/detect/elixir/default.txt create mode 100644 yknjs/highlight.js/test/detect/elm/default.txt create mode 100644 yknjs/highlight.js/test/detect/erb/default.txt create mode 100644 yknjs/highlight.js/test/detect/erlang-repl/default.txt create mode 100644 yknjs/highlight.js/test/detect/erlang/default.txt create mode 100644 yknjs/highlight.js/test/detect/excel/default.txt create mode 100644 yknjs/highlight.js/test/detect/fix/default.txt create mode 100644 yknjs/highlight.js/test/detect/flix/default.txt create mode 100644 yknjs/highlight.js/test/detect/fortran/default.txt create mode 100644 yknjs/highlight.js/test/detect/fsharp/default.txt create mode 100644 yknjs/highlight.js/test/detect/gams/default.txt create mode 100644 yknjs/highlight.js/test/detect/gauss/default.txt create mode 100644 yknjs/highlight.js/test/detect/gcode/default.txt create mode 100644 yknjs/highlight.js/test/detect/gherkin/default.txt create mode 100644 yknjs/highlight.js/test/detect/glsl/default.txt create mode 100644 yknjs/highlight.js/test/detect/gml/default.txt create mode 100644 yknjs/highlight.js/test/detect/go/default.txt create mode 100644 yknjs/highlight.js/test/detect/go/swift-like.txt create mode 100644 yknjs/highlight.js/test/detect/golo/default.txt create mode 100644 yknjs/highlight.js/test/detect/gradle/default.txt create mode 100644 yknjs/highlight.js/test/detect/groovy/default.txt create mode 100644 yknjs/highlight.js/test/detect/haml/default.txt create mode 100644 yknjs/highlight.js/test/detect/handlebars/default.txt create mode 100644 yknjs/highlight.js/test/detect/haskell/default.txt create mode 100644 yknjs/highlight.js/test/detect/haxe/default.txt create mode 100644 yknjs/highlight.js/test/detect/hsp/default.txt create mode 100644 yknjs/highlight.js/test/detect/htmlbars/default.txt create mode 100644 yknjs/highlight.js/test/detect/http/default.txt create mode 100644 yknjs/highlight.js/test/detect/hy/default.txt create mode 100644 yknjs/highlight.js/test/detect/index.js create mode 100644 yknjs/highlight.js/test/detect/inform7/default.txt create mode 100644 yknjs/highlight.js/test/detect/ini/default.txt create mode 100644 yknjs/highlight.js/test/detect/irpf90/default.txt create mode 100644 yknjs/highlight.js/test/detect/isbl/default.txt create mode 100644 yknjs/highlight.js/test/detect/java/default.txt create mode 100644 yknjs/highlight.js/test/detect/javascript/default.txt create mode 100644 yknjs/highlight.js/test/detect/javascript/sample1.txt create mode 100644 yknjs/highlight.js/test/detect/javascript/short-plain.txt create mode 100644 yknjs/highlight.js/test/detect/jboss-cli/default.txt create mode 100644 yknjs/highlight.js/test/detect/json/default.txt create mode 100644 yknjs/highlight.js/test/detect/julia-repl/default.txt create mode 100644 yknjs/highlight.js/test/detect/julia/default.txt create mode 100644 yknjs/highlight.js/test/detect/kotlin/default.txt create mode 100644 yknjs/highlight.js/test/detect/lasso/default.txt create mode 100644 yknjs/highlight.js/test/detect/ldif/default.txt create mode 100644 yknjs/highlight.js/test/detect/leaf/default.txt create mode 100644 yknjs/highlight.js/test/detect/less/default.txt create mode 100644 yknjs/highlight.js/test/detect/lisp/default.txt create mode 100644 yknjs/highlight.js/test/detect/livecodeserver/default.txt create mode 100644 yknjs/highlight.js/test/detect/livescript/default.txt create mode 100644 yknjs/highlight.js/test/detect/llvm/default.txt create mode 100644 yknjs/highlight.js/test/detect/lsl/default.txt create mode 100644 yknjs/highlight.js/test/detect/lua/default.txt create mode 100644 yknjs/highlight.js/test/detect/makefile/default.txt create mode 100644 yknjs/highlight.js/test/detect/markdown/default.txt create mode 100644 yknjs/highlight.js/test/detect/mathematica/default.txt create mode 100644 yknjs/highlight.js/test/detect/matlab/default.txt create mode 100644 yknjs/highlight.js/test/detect/maxima/default.txt create mode 100644 yknjs/highlight.js/test/detect/mel/default.txt create mode 100644 yknjs/highlight.js/test/detect/mercury/default.txt create mode 100644 yknjs/highlight.js/test/detect/mipsasm/default.txt create mode 100644 yknjs/highlight.js/test/detect/mizar/default.txt create mode 100644 yknjs/highlight.js/test/detect/mojolicious/default.txt create mode 100644 yknjs/highlight.js/test/detect/monkey/default.txt create mode 100644 yknjs/highlight.js/test/detect/moonscript/default.txt create mode 100644 yknjs/highlight.js/test/detect/n1ql/default.txt create mode 100644 yknjs/highlight.js/test/detect/nginx/default.txt create mode 100644 yknjs/highlight.js/test/detect/nimrod/default.txt create mode 100644 yknjs/highlight.js/test/detect/nix/default.txt create mode 100644 yknjs/highlight.js/test/detect/nsis/default.txt create mode 100644 yknjs/highlight.js/test/detect/objectivec/default.txt create mode 100644 yknjs/highlight.js/test/detect/ocaml/default.txt create mode 100644 yknjs/highlight.js/test/detect/openscad/default.txt create mode 100644 yknjs/highlight.js/test/detect/oxygene/default.txt create mode 100644 yknjs/highlight.js/test/detect/parser3/default.txt create mode 100644 yknjs/highlight.js/test/detect/perl/default.txt create mode 100644 yknjs/highlight.js/test/detect/pf/default.txt create mode 100644 yknjs/highlight.js/test/detect/pgsql/default.txt create mode 100644 yknjs/highlight.js/test/detect/php/default.txt create mode 100644 yknjs/highlight.js/test/detect/plaintext/default.txt create mode 100644 yknjs/highlight.js/test/detect/pony/default.txt create mode 100644 yknjs/highlight.js/test/detect/powershell/default.txt create mode 100644 yknjs/highlight.js/test/detect/processing/default.txt create mode 100644 yknjs/highlight.js/test/detect/profile/default.txt create mode 100644 yknjs/highlight.js/test/detect/prolog/default.txt create mode 100644 yknjs/highlight.js/test/detect/properties/default.txt create mode 100644 yknjs/highlight.js/test/detect/protobuf/default.txt create mode 100644 yknjs/highlight.js/test/detect/puppet/default.txt create mode 100644 yknjs/highlight.js/test/detect/purebasic/default.txt create mode 100644 yknjs/highlight.js/test/detect/python/default.txt create mode 100644 yknjs/highlight.js/test/detect/q/default.txt create mode 100644 yknjs/highlight.js/test/detect/qml/default.txt create mode 100644 yknjs/highlight.js/test/detect/r/default.txt create mode 100644 yknjs/highlight.js/test/detect/reasonml/default.txt create mode 100644 yknjs/highlight.js/test/detect/rib/default.txt create mode 100644 yknjs/highlight.js/test/detect/roboconf/default.txt create mode 100644 yknjs/highlight.js/test/detect/routeros/default.txt create mode 100644 yknjs/highlight.js/test/detect/rsl/default.txt create mode 100644 yknjs/highlight.js/test/detect/ruby/default.txt create mode 100644 yknjs/highlight.js/test/detect/ruby/double-colon.txt create mode 100644 yknjs/highlight.js/test/detect/ruleslanguage/default.txt create mode 100644 yknjs/highlight.js/test/detect/rust/default.txt create mode 100644 yknjs/highlight.js/test/detect/sas/default.txt create mode 100644 yknjs/highlight.js/test/detect/scala/default.txt create mode 100644 yknjs/highlight.js/test/detect/scheme/default.txt create mode 100644 yknjs/highlight.js/test/detect/scilab/default.txt create mode 100644 yknjs/highlight.js/test/detect/scss/default.txt create mode 100644 yknjs/highlight.js/test/detect/shell/default.txt create mode 100644 yknjs/highlight.js/test/detect/smali/default.txt create mode 100644 yknjs/highlight.js/test/detect/smalltalk/default.txt create mode 100644 yknjs/highlight.js/test/detect/sml/default.txt create mode 100644 yknjs/highlight.js/test/detect/sqf/default.txt create mode 100644 yknjs/highlight.js/test/detect/sql/default.txt create mode 100644 yknjs/highlight.js/test/detect/stan/default.txt create mode 100644 yknjs/highlight.js/test/detect/stata/default.txt create mode 100644 yknjs/highlight.js/test/detect/step21/default.txt create mode 100644 yknjs/highlight.js/test/detect/stylus/default.txt create mode 100644 yknjs/highlight.js/test/detect/subunit/default.txt create mode 100644 yknjs/highlight.js/test/detect/swift/default.txt create mode 100644 yknjs/highlight.js/test/detect/taggerscript/default.txt create mode 100644 yknjs/highlight.js/test/detect/tap/default.txt create mode 100644 yknjs/highlight.js/test/detect/tcl/default.txt create mode 100644 yknjs/highlight.js/test/detect/tex/default.txt create mode 100644 yknjs/highlight.js/test/detect/thrift/default.txt create mode 100644 yknjs/highlight.js/test/detect/tp/default.txt create mode 100644 yknjs/highlight.js/test/detect/twig/default.txt create mode 100644 yknjs/highlight.js/test/detect/typescript/default.txt create mode 100644 yknjs/highlight.js/test/detect/vala/default.txt create mode 100644 yknjs/highlight.js/test/detect/vbnet/default.txt create mode 100644 yknjs/highlight.js/test/detect/vbscript-html/default.txt create mode 100644 yknjs/highlight.js/test/detect/vbscript/default.txt create mode 100644 yknjs/highlight.js/test/detect/verilog/default.txt create mode 100644 yknjs/highlight.js/test/detect/vhdl/default.txt create mode 100644 yknjs/highlight.js/test/detect/vim/default.txt create mode 100644 yknjs/highlight.js/test/detect/x86asm/default.txt create mode 100644 yknjs/highlight.js/test/detect/xl/default.txt create mode 100644 yknjs/highlight.js/test/detect/xml/default.txt create mode 100644 yknjs/highlight.js/test/detect/xml/groovy-julia.txt create mode 100644 yknjs/highlight.js/test/detect/xml/js.txt create mode 100644 yknjs/highlight.js/test/detect/xquery/default.txt create mode 100644 yknjs/highlight.js/test/detect/yaml/default.txt create mode 100644 yknjs/highlight.js/test/detect/zephir/default.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/brInPre.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/custommarkup.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/customtabreplace.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/endsWithParentVariants.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/explicit1.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/explicit2.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/languagealias.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/sublanguages.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/tabreplace.txt create mode 100644 yknjs/highlight.js/test/fixtures/expect/useBr.txt create mode 100644 yknjs/highlight.js/test/fixtures/index.html create mode 100644 yknjs/highlight.js/test/fixtures/nested.js create mode 100644 yknjs/highlight.js/test/index.js create mode 100644 yknjs/highlight.js/test/markup/accesslog/default.expect.txt create mode 100644 yknjs/highlight.js/test/markup/accesslog/default.txt create mode 100644 yknjs/highlight.js/test/markup/actionscript/method-call.expect.txt create mode 100644 yknjs/highlight.js/test/markup/actionscript/method-call.txt create mode 100644 yknjs/highlight.js/test/markup/arcade/profile.expect.txt create mode 100644 yknjs/highlight.js/test/markup/arcade/profile.txt create mode 100644 yknjs/highlight.js/test/markup/aspectj/intertype-constructor.expect.txt create mode 100644 yknjs/highlight.js/test/markup/aspectj/intertype-constructor.txt create mode 100644 yknjs/highlight.js/test/markup/aspectj/intertype-method.expect.txt create mode 100644 yknjs/highlight.js/test/markup/aspectj/intertype-method.txt create mode 100644 yknjs/highlight.js/test/markup/bash/no-numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/bash/no-numbers.txt create mode 100644 yknjs/highlight.js/test/markup/ceylon/nested-comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ceylon/nested-comments.txt create mode 100644 yknjs/highlight.js/test/markup/clojure-repl/prompt.expect.txt create mode 100644 yknjs/highlight.js/test/markup/clojure-repl/prompt.txt create mode 100644 yknjs/highlight.js/test/markup/clojure/hint_col.expect.txt create mode 100644 yknjs/highlight.js/test/markup/clojure/hint_col.txt create mode 100644 yknjs/highlight.js/test/markup/clojure/symbols-numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/clojure/symbols-numbers.txt create mode 100644 yknjs/highlight.js/test/markup/coffeescript/division.expect.txt create mode 100644 yknjs/highlight.js/test/markup/coffeescript/division.txt create mode 100644 yknjs/highlight.js/test/markup/coffeescript/function.expect.txt create mode 100644 yknjs/highlight.js/test/markup/coffeescript/function.txt create mode 100644 yknjs/highlight.js/test/markup/coffeescript/regex.expect.txt create mode 100644 yknjs/highlight.js/test/markup/coffeescript/regex.txt create mode 100644 yknjs/highlight.js/test/markup/cos/basic.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cos/basic.txt create mode 100644 yknjs/highlight.js/test/markup/cos/embedded.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cos/embedded.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/expression-keywords.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/expression-keywords.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/function-params.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/function-params.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/function-title.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/function-title.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/number-literals.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/number-literals.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/pointers-returns.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/pointers-returns.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/preprocessor.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/preprocessor.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/primitive-types.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/primitive-types.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/string-literals.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cpp/string-literals.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/literals.expect.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/literals.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/macro.expect.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/macro.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/operators.expect.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/operators.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/regexes.expect.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/regexes.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/toplevel-keywords.expect.txt create mode 100644 yknjs/highlight.js/test/markup/crystal/toplevel-keywords.txt create mode 100644 yknjs/highlight.js/test/markup/cs/dotted-namespace.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cs/dotted-namespace.txt create mode 100644 yknjs/highlight.js/test/markup/cs/floats.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cs/floats.txt create mode 100644 yknjs/highlight.js/test/markup/cs/functions.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cs/functions.txt create mode 100644 yknjs/highlight.js/test/markup/cs/string-interpolation.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cs/string-interpolation.txt create mode 100644 yknjs/highlight.js/test/markup/cs/titles.expect.txt create mode 100644 yknjs/highlight.js/test/markup/cs/titles.txt create mode 100644 yknjs/highlight.js/test/markup/css/pseudo-selector.expect.txt create mode 100644 yknjs/highlight.js/test/markup/css/pseudo-selector.txt create mode 100644 yknjs/highlight.js/test/markup/css/url.expect.txt create mode 100644 yknjs/highlight.js/test/markup/css/url.txt create mode 100644 yknjs/highlight.js/test/markup/dart/string-interpolation.expect.txt create mode 100644 yknjs/highlight.js/test/markup/dart/string-interpolation.txt create mode 100644 yknjs/highlight.js/test/markup/delphi/compiler-directive.expect.txt create mode 100644 yknjs/highlight.js/test/markup/delphi/compiler-directive.txt create mode 100644 yknjs/highlight.js/test/markup/diff/comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/diff/comments.txt create mode 100644 yknjs/highlight.js/test/markup/dockerfile/default.expect.txt create mode 100644 yknjs/highlight.js/test/markup/dockerfile/default.txt create mode 100644 yknjs/highlight.js/test/markup/dos/comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/dos/comments.txt create mode 100644 yknjs/highlight.js/test/markup/dsconfig/default.expect.txt create mode 100644 yknjs/highlight.js/test/markup/dsconfig/default.txt create mode 100644 yknjs/highlight.js/test/markup/elixir/function-title.expect.txt create mode 100644 yknjs/highlight.js/test/markup/elixir/function-title.txt create mode 100644 yknjs/highlight.js/test/markup/excel/comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/excel/comments.txt create mode 100644 yknjs/highlight.js/test/markup/fortran/numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/fortran/numbers.txt create mode 100644 yknjs/highlight.js/test/markup/fsharp/bang-keywords.expect.txt create mode 100644 yknjs/highlight.js/test/markup/fsharp/bang-keywords.txt create mode 100644 yknjs/highlight.js/test/markup/gauss/function_defs.expect.txt create mode 100644 yknjs/highlight.js/test/markup/gauss/function_defs.txt create mode 100644 yknjs/highlight.js/test/markup/gauss/function_refs.expect.txt create mode 100644 yknjs/highlight.js/test/markup/gauss/function_refs.txt create mode 100644 yknjs/highlight.js/test/markup/gauss/keywords.expect.txt create mode 100644 yknjs/highlight.js/test/markup/gauss/keywords.txt create mode 100644 yknjs/highlight.js/test/markup/go/numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/go/numbers.txt create mode 100644 yknjs/highlight.js/test/markup/golo/default.expect.txt create mode 100644 yknjs/highlight.js/test/markup/golo/default.txt create mode 100644 yknjs/highlight.js/test/markup/haskell/infix.expect.txt create mode 100644 yknjs/highlight.js/test/markup/haskell/infix.txt create mode 100644 yknjs/highlight.js/test/markup/haskell/nested-comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/haskell/nested-comments.txt create mode 100644 yknjs/highlight.js/test/markup/http/default.expect.txt create mode 100644 yknjs/highlight.js/test/markup/http/default.txt create mode 100644 yknjs/highlight.js/test/markup/index.js create mode 100644 yknjs/highlight.js/test/markup/java/gh1031.expect.txt create mode 100644 yknjs/highlight.js/test/markup/java/gh1031.txt create mode 100644 yknjs/highlight.js/test/markup/java/numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/java/numbers.txt create mode 100644 yknjs/highlight.js/test/markup/java/titles.expect.txt create mode 100644 yknjs/highlight.js/test/markup/java/titles.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/arrow-function.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/arrow-function.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/class.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/class.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/default-parameters.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/default-parameters.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/jsx.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/jsx.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/keywords.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/keywords.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/method-call.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/method-call.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/modules.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/modules.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/object-attr.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/object-attr.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/shebang.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/shebang.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/template-strings.expect.txt create mode 100644 yknjs/highlight.js/test/markup/javascript/template-strings.txt create mode 100644 yknjs/highlight.js/test/markup/kotlin/class.expect.txt create mode 100644 yknjs/highlight.js/test/markup/kotlin/class.txt create mode 100644 yknjs/highlight.js/test/markup/kotlin/function.expect.txt create mode 100644 yknjs/highlight.js/test/markup/kotlin/function.txt create mode 100644 yknjs/highlight.js/test/markup/lasso/delimiters.expect.txt create mode 100644 yknjs/highlight.js/test/markup/lasso/delimiters.txt create mode 100644 yknjs/highlight.js/test/markup/ldif/ldapmodify.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ldif/ldapmodify.txt create mode 100644 yknjs/highlight.js/test/markup/ldif/schema.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ldif/schema.txt create mode 100644 yknjs/highlight.js/test/markup/less/selectors.expect.txt create mode 100644 yknjs/highlight.js/test/markup/less/selectors.txt create mode 100644 yknjs/highlight.js/test/markup/lisp/mec.expect.txt create mode 100644 yknjs/highlight.js/test/markup/lisp/mec.txt create mode 100644 yknjs/highlight.js/test/markup/markdown/code.expect.txt create mode 100644 yknjs/highlight.js/test/markup/markdown/code.txt create mode 100644 yknjs/highlight.js/test/markup/matlab/block_comment.expect.txt create mode 100644 yknjs/highlight.js/test/markup/matlab/block_comment.txt create mode 100644 yknjs/highlight.js/test/markup/matlab/transpose.expect.txt create mode 100644 yknjs/highlight.js/test/markup/matlab/transpose.txt create mode 100644 yknjs/highlight.js/test/markup/maxima/example.expect.txt create mode 100644 yknjs/highlight.js/test/markup/maxima/example.txt create mode 100644 yknjs/highlight.js/test/markup/maxima/numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/maxima/numbers.txt create mode 100644 yknjs/highlight.js/test/markup/maxima/symbols.expect.txt create mode 100644 yknjs/highlight.js/test/markup/maxima/symbols.txt create mode 100644 yknjs/highlight.js/test/markup/ocaml/literals.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ocaml/literals.txt create mode 100644 yknjs/highlight.js/test/markup/ocaml/types.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ocaml/types.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/clauses.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/clauses.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/clauses2.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/clauses2.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/constraints.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/constraints.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/options.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/options.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/plpgsql.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/plpgsql.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/sql-commands.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/sql-commands.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/window-functions.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/window-functions.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/xml.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pgsql/xml.txt create mode 100644 yknjs/highlight.js/test/markup/php/comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/php/comments.txt create mode 100644 yknjs/highlight.js/test/markup/php/heredoc.expect.txt create mode 100644 yknjs/highlight.js/test/markup/php/heredoc.txt create mode 100644 yknjs/highlight.js/test/markup/pony/control-flow.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/control-flow.txt create mode 100644 yknjs/highlight.js/test/markup/pony/creator.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/creator.txt create mode 100644 yknjs/highlight.js/test/markup/pony/iterface-trait.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/iterface-trait.txt create mode 100644 yknjs/highlight.js/test/markup/pony/lambda.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/lambda.txt create mode 100644 yknjs/highlight.js/test/markup/pony/match.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/match.txt create mode 100644 yknjs/highlight.js/test/markup/pony/method.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/method.txt create mode 100644 yknjs/highlight.js/test/markup/pony/objects.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/objects.txt create mode 100644 yknjs/highlight.js/test/markup/pony/prime.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/prime.txt create mode 100644 yknjs/highlight.js/test/markup/pony/triple-quote.expect.txt create mode 100644 yknjs/highlight.js/test/markup/pony/triple-quote.txt create mode 100644 yknjs/highlight.js/test/markup/powershell/apos-herestring.expect.txt create mode 100644 yknjs/highlight.js/test/markup/powershell/apos-herestring.txt create mode 100644 yknjs/highlight.js/test/markup/powershell/quote-herestring.expect.txt create mode 100644 yknjs/highlight.js/test/markup/powershell/quote-herestring.txt create mode 100644 yknjs/highlight.js/test/markup/properties/syntax.expect.txt create mode 100644 yknjs/highlight.js/test/markup/properties/syntax.txt create mode 100644 yknjs/highlight.js/test/markup/protobuf/message-message.expect.txt create mode 100644 yknjs/highlight.js/test/markup/protobuf/message-message.txt create mode 100644 yknjs/highlight.js/test/markup/python/escaped-quotes.expect.txt create mode 100644 yknjs/highlight.js/test/markup/python/escaped-quotes.txt create mode 100644 yknjs/highlight.js/test/markup/python/f-strings.expect.txt create mode 100644 yknjs/highlight.js/test/markup/python/f-strings.txt create mode 100644 yknjs/highlight.js/test/markup/python/function-header.expect.txt create mode 100644 yknjs/highlight.js/test/markup/python/function-header.txt create mode 100644 yknjs/highlight.js/test/markup/python/matrix-multiplication.expect.txt create mode 100644 yknjs/highlight.js/test/markup/python/matrix-multiplication.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/functions.expect.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/functions.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/literals.expect.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/literals.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/modules.expect.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/modules.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/pattern-matching.expect.txt create mode 100644 yknjs/highlight.js/test/markup/reasonml/pattern-matching.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/gemfile.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/gemfile.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/heredoc.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/heredoc.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/prompt.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/prompt.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/regexes.expect.txt create mode 100644 yknjs/highlight.js/test/markup/ruby/regexes.txt create mode 100644 yknjs/highlight.js/test/markup/rust/comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/rust/comments.txt create mode 100644 yknjs/highlight.js/test/markup/rust/numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/rust/numbers.txt create mode 100644 yknjs/highlight.js/test/markup/rust/strings.expect.txt create mode 100644 yknjs/highlight.js/test/markup/rust/strings.txt create mode 100644 yknjs/highlight.js/test/markup/rust/traits.expect.txt create mode 100644 yknjs/highlight.js/test/markup/rust/traits.txt create mode 100644 yknjs/highlight.js/test/markup/rust/types.expect.txt create mode 100644 yknjs/highlight.js/test/markup/rust/types.txt create mode 100644 yknjs/highlight.js/test/markup/rust/variables.expect.txt create mode 100644 yknjs/highlight.js/test/markup/rust/variables.txt create mode 100644 yknjs/highlight.js/test/markup/scala/case-classes.expect.txt create mode 100644 yknjs/highlight.js/test/markup/scala/case-classes.txt create mode 100644 yknjs/highlight.js/test/markup/scheme/lambda.expect.txt create mode 100644 yknjs/highlight.js/test/markup/scheme/lambda.txt create mode 100644 yknjs/highlight.js/test/markup/scheme/quoted.expect.txt create mode 100644 yknjs/highlight.js/test/markup/scheme/quoted.txt create mode 100644 yknjs/highlight.js/test/markup/sql/interval.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/interval.txt create mode 100644 yknjs/highlight.js/test/markup/sql/join.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/join.txt create mode 100644 yknjs/highlight.js/test/markup/sql/keywords.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/keywords.txt create mode 100644 yknjs/highlight.js/test/markup/sql/lateral-view.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/lateral-view.txt create mode 100644 yknjs/highlight.js/test/markup/sql/numeric-types.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/numeric-types.txt create mode 100644 yknjs/highlight.js/test/markup/sql/set-operator.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/set-operator.txt create mode 100644 yknjs/highlight.js/test/markup/sql/tablesample.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/tablesample.txt create mode 100644 yknjs/highlight.js/test/markup/sql/values-statement.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/values-statement.txt create mode 100644 yknjs/highlight.js/test/markup/sql/window-function.expect.txt create mode 100644 yknjs/highlight.js/test/markup/sql/window-function.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-errorline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-errorline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-failureline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-failureline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-progressline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-progressline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-skipline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-skipline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-successline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-successline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-tagline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-tagline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-testline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-testline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-timeline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-timeline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-xfailline.expect.txt create mode 100644 yknjs/highlight.js/test/markup/subunit/subunit-xfailline.txt create mode 100644 yknjs/highlight.js/test/markup/swift/functions.expect.txt create mode 100644 yknjs/highlight.js/test/markup/swift/functions.txt create mode 100644 yknjs/highlight.js/test/markup/swift/multiline-string.expect.txt create mode 100644 yknjs/highlight.js/test/markup/swift/multiline-string.txt create mode 100644 yknjs/highlight.js/test/markup/tap/basic.expect.txt create mode 100644 yknjs/highlight.js/test/markup/tap/basic.txt create mode 100644 yknjs/highlight.js/test/markup/tap/without-numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/tap/without-numbers.txt create mode 100644 yknjs/highlight.js/test/markup/tap/yaml-block.expect.txt create mode 100644 yknjs/highlight.js/test/markup/tap/yaml-block.txt create mode 100644 yknjs/highlight.js/test/markup/twig/filter_with_underscore.expect.txt create mode 100644 yknjs/highlight.js/test/markup/twig/filter_with_underscore.txt create mode 100644 yknjs/highlight.js/test/markup/twig/template_tags.expect.txt create mode 100644 yknjs/highlight.js/test/markup/twig/template_tags.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/class.expect.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/class.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/decorator-factories.expect.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/decorator-factories.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/functions.expect.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/functions.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/jsx.expect.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/jsx.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/module-id.expect.txt create mode 100644 yknjs/highlight.js/test/markup/typescript/module-id.txt create mode 100644 yknjs/highlight.js/test/markup/verilog/misc.expect.txt create mode 100644 yknjs/highlight.js/test/markup/verilog/misc.txt create mode 100644 yknjs/highlight.js/test/markup/verilog/numbers.expect.txt create mode 100644 yknjs/highlight.js/test/markup/verilog/numbers.txt create mode 100644 yknjs/highlight.js/test/markup/vim/strings-comments.expect.txt create mode 100644 yknjs/highlight.js/test/markup/vim/strings-comments.txt create mode 100644 yknjs/highlight.js/test/markup/x86asm/labels-directives.expect.txt create mode 100644 yknjs/highlight.js/test/markup/x86asm/labels-directives.txt create mode 100644 yknjs/highlight.js/test/markup/xml/space-attributes.expect.txt create mode 100644 yknjs/highlight.js/test/markup/xml/space-attributes.txt create mode 100644 yknjs/highlight.js/test/markup/xml/unquoted-attributes.expect.txt create mode 100644 yknjs/highlight.js/test/markup/xml/unquoted-attributes.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/computed_inbuilt.expect.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/computed_inbuilt.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/direct_method.expect.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/direct_method.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/function_body.expect.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/function_body.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/prolog_declarations.expect.txt create mode 100644 yknjs/highlight.js/test/markup/xquery/prolog_declarations.txt create mode 100644 yknjs/highlight.js/test/markup/yaml/string.expect.txt create mode 100644 yknjs/highlight.js/test/markup/yaml/string.txt create mode 100644 yknjs/highlight.js/test/markup/yaml/tag.expect.txt create mode 100644 yknjs/highlight.js/test/markup/yaml/tag.txt create mode 100644 yknjs/highlight.js/test/mocha.opts create mode 100644 yknjs/highlight.js/test/special/buildClassName.js create mode 100644 yknjs/highlight.js/test/special/customMarkup.js create mode 100644 yknjs/highlight.js/test/special/endsWithParentVariants.js create mode 100644 yknjs/highlight.js/test/special/explicitLanguage.js create mode 100644 yknjs/highlight.js/test/special/index.js create mode 100644 yknjs/highlight.js/test/special/languageAlias.js create mode 100644 yknjs/highlight.js/test/special/noHighlight.js create mode 100644 yknjs/highlight.js/test/special/subLanguages.js create mode 100644 yknjs/highlight.js/test/special/useBr.js create mode 100644 yknjs/highlight.js/test/tools.js create mode 100644 yknjs/highlight.js/test/utility.js create mode 100644 yknjs/highlight.js/tools/all.js create mode 100644 yknjs/highlight.js/tools/browser.js create mode 100644 yknjs/highlight.js/tools/build.js create mode 100644 yknjs/highlight.js/tools/cdn.js create mode 100644 yknjs/highlight.js/tools/codeformat.js create mode 100644 yknjs/highlight.js/tools/developer.html create mode 100644 yknjs/highlight.js/tools/keywordsformat.js create mode 100644 yknjs/highlight.js/tools/node.js create mode 100644 yknjs/highlight.js/tools/tasks.js create mode 100644 yknjs/highlight.js/tools/utility.js create mode 100644 yknjs/images/.placeholder create mode 100644 yknjs/index.html create mode 100644 yknjs/markdown/.placeholder create mode 100644 yknjs/markdown/00-intro.md create mode 100644 yknjs/qrcode-replace.js create mode 100644 yknjs/qrcodejs/.gitignore create mode 100644 yknjs/qrcodejs/LICENSE create mode 100644 yknjs/qrcodejs/README.md create mode 100644 yknjs/qrcodejs/bower.json create mode 100644 yknjs/qrcodejs/index-svg.html create mode 100644 yknjs/qrcodejs/index.html create mode 100644 yknjs/qrcodejs/index.svg create mode 100644 yknjs/qrcodejs/jquery.min.js create mode 100644 yknjs/qrcodejs/qrcode.js create mode 100644 yknjs/qrcodejs/qrcode.min.js create mode 100644 yknjs/reveal-config.js create mode 100644 yknjs/reveal.js-menu/CONTRIBUTING.md create mode 100644 yknjs/reveal.js-menu/LICENSE create mode 100644 yknjs/reveal.js-menu/README.md create mode 100644 yknjs/reveal.js-menu/bower.json create mode 100644 yknjs/reveal.js-menu/font-awesome/LICENSE.txt create mode 100644 yknjs/reveal.js-menu/font-awesome/css/all.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/brands.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/fontawesome.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/regular.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/solid.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/svg-with-js.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/v4-shims.css create mode 100644 yknjs/reveal.js-menu/font-awesome/css/v4-shims.min.css create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.eot create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.svg create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.ttf create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.woff create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.woff2 create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.eot create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.svg create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.ttf create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.woff create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.woff2 create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.eot create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.svg create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.ttf create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.woff create mode 100644 yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.woff2 create mode 100644 yknjs/reveal.js-menu/menu.css create mode 100644 yknjs/reveal.js-menu/menu.js create mode 100644 yknjs/reveal.js-menu/package.json create mode 100644 yknjs/reveal.js-plugins/.gitmodules create mode 100644 yknjs/reveal.js-plugins/LICENSE create mode 100644 yknjs/reveal.js-plugins/README.md create mode 100644 yknjs/reveal.js-plugins/animate/README.md create mode 100644 yknjs/reveal.js-plugins/animate/plugin.js create mode 100644 yknjs/reveal.js-plugins/animate/svg.min.js create mode 100644 yknjs/reveal.js-plugins/anything/README.md create mode 100644 yknjs/reveal.js-plugins/anything/plugin.js create mode 100644 yknjs/reveal.js-plugins/audio-slideshow/README.md create mode 100644 yknjs/reveal.js-plugins/audio-slideshow/RecordRTC.js create mode 100644 yknjs/reveal.js-plugins/audio-slideshow/plugin.js create mode 100644 yknjs/reveal.js-plugins/audio-slideshow/recorder.js create mode 100644 yknjs/reveal.js-plugins/bower.json create mode 100644 yknjs/reveal.js-plugins/chalkboard/README.md create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/blackboard.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-black.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-blue.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-green.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-orange.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-purple.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-red.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/boardmarker-yellow.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-blue.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-green.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-orange.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-purple.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-red.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-white.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/chalk-yellow.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/sponge.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/img/whiteboard.png create mode 100644 yknjs/reveal.js-plugins/chalkboard/plugin.js create mode 100644 yknjs/reveal.js-plugins/chart/Chart.js create mode 100644 yknjs/reveal.js-plugins/chart/Chart.min.js create mode 100644 yknjs/reveal.js-plugins/chart/README.md create mode 100644 yknjs/reveal.js-plugins/chart/plugin.js create mode 100644 yknjs/reveal.js-plugins/customcontrols/README.md create mode 100644 yknjs/reveal.js-plugins/customcontrols/plugin.js create mode 100644 yknjs/reveal.js-plugins/embed-tweet/README.md create mode 100644 yknjs/reveal.js-plugins/embed-tweet/plugin.js create mode 100644 yknjs/reveal.js-plugins/fullscreen/README.md create mode 100644 yknjs/reveal.js-plugins/fullscreen/plugin.js create mode 100644 yknjs/reveal.js-plugins/package.json create mode 100644 yknjs/reveal.js/.gitignore create mode 100644 yknjs/reveal.js/.travis.yml create mode 100644 yknjs/reveal.js/CONTRIBUTING.md create mode 100644 yknjs/reveal.js/LICENSE create mode 100644 yknjs/reveal.js/README.md create mode 100644 yknjs/reveal.js/bower.json create mode 100644 yknjs/reveal.js/css/print/paper.css create mode 100644 yknjs/reveal.js/css/print/pdf.css create mode 100644 yknjs/reveal.js/css/reset.css create mode 100644 yknjs/reveal.js/css/reveal.css create mode 100644 yknjs/reveal.js/css/reveal.scss create mode 100644 yknjs/reveal.js/css/theme/README.md create mode 100644 yknjs/reveal.js/css/theme/beige.css create mode 100644 yknjs/reveal.js/css/theme/black.css create mode 100644 yknjs/reveal.js/css/theme/blood.css create mode 100644 yknjs/reveal.js/css/theme/league.css create mode 100644 yknjs/reveal.js/css/theme/moon.css create mode 100644 yknjs/reveal.js/css/theme/night.css create mode 100644 yknjs/reveal.js/css/theme/serif.css create mode 100644 yknjs/reveal.js/css/theme/simple.css create mode 100644 yknjs/reveal.js/css/theme/sky.css create mode 100644 yknjs/reveal.js/css/theme/solarized.css create mode 100644 yknjs/reveal.js/css/theme/source/beige.scss create mode 100644 yknjs/reveal.js/css/theme/source/black.scss create mode 100644 yknjs/reveal.js/css/theme/source/blood.scss create mode 100644 yknjs/reveal.js/css/theme/source/league.scss create mode 100644 yknjs/reveal.js/css/theme/source/moon.scss create mode 100644 yknjs/reveal.js/css/theme/source/night.scss create mode 100644 yknjs/reveal.js/css/theme/source/serif.scss create mode 100644 yknjs/reveal.js/css/theme/source/simple.scss create mode 100644 yknjs/reveal.js/css/theme/source/sky.scss create mode 100644 yknjs/reveal.js/css/theme/source/solarized.scss create mode 100644 yknjs/reveal.js/css/theme/source/white.scss create mode 100644 yknjs/reveal.js/css/theme/template/mixins.scss create mode 100644 yknjs/reveal.js/css/theme/template/settings.scss create mode 100644 yknjs/reveal.js/css/theme/template/theme.scss create mode 100644 yknjs/reveal.js/css/theme/white.css create mode 100644 yknjs/reveal.js/demo.html create mode 100644 yknjs/reveal.js/gruntfile.js create mode 100644 yknjs/reveal.js/index.html create mode 100644 yknjs/reveal.js/js/reveal.js create mode 100644 yknjs/reveal.js/lib/css/monokai.css create mode 100644 yknjs/reveal.js/lib/css/zenburn.css create mode 100644 yknjs/reveal.js/lib/font/league-gothic/LICENSE create mode 100644 yknjs/reveal.js/lib/font/league-gothic/league-gothic.css create mode 100755 yknjs/reveal.js/lib/font/league-gothic/league-gothic.eot create mode 100755 yknjs/reveal.js/lib/font/league-gothic/league-gothic.ttf create mode 100755 yknjs/reveal.js/lib/font/league-gothic/league-gothic.woff create mode 100644 yknjs/reveal.js/lib/font/source-sans-pro/LICENSE create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eot create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttf create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woff create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eot create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttf create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woff create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woff create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100755 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 yknjs/reveal.js/lib/font/source-sans-pro/source-sans-pro.css create mode 100644 yknjs/reveal.js/lib/js/html5shiv.js create mode 100644 yknjs/reveal.js/lib/js/promise.js create mode 100644 yknjs/reveal.js/package-lock.json create mode 100644 yknjs/reveal.js/package.json create mode 100644 yknjs/reveal.js/plugin/highlight/highlight.js create mode 100644 yknjs/reveal.js/plugin/markdown/example.html create mode 100644 yknjs/reveal.js/plugin/markdown/example.md create mode 100755 yknjs/reveal.js/plugin/markdown/markdown.js create mode 100644 yknjs/reveal.js/plugin/markdown/marked.js create mode 100755 yknjs/reveal.js/plugin/math/math.js create mode 100644 yknjs/reveal.js/plugin/multiplex/client.js create mode 100644 yknjs/reveal.js/plugin/multiplex/index.js create mode 100644 yknjs/reveal.js/plugin/multiplex/master.js create mode 100644 yknjs/reveal.js/plugin/multiplex/package.json create mode 100644 yknjs/reveal.js/plugin/notes-server/client.js create mode 100644 yknjs/reveal.js/plugin/notes-server/index.js create mode 100644 yknjs/reveal.js/plugin/notes-server/notes.html create mode 100644 yknjs/reveal.js/plugin/notes/notes.html create mode 100644 yknjs/reveal.js/plugin/notes/notes.js create mode 100644 yknjs/reveal.js/plugin/print-pdf/print-pdf.js create mode 100644 yknjs/reveal.js/plugin/search/search.js create mode 100644 yknjs/reveal.js/plugin/zoom-js/zoom.js create mode 100644 yknjs/reveal.js/test/assets/external-script-a.js create mode 100644 yknjs/reveal.js/test/assets/external-script-b.js create mode 100644 yknjs/reveal.js/test/assets/external-script-c.js create mode 100644 yknjs/reveal.js/test/assets/external-script-d.js create mode 100644 yknjs/reveal.js/test/examples/assets/beeping.txt create mode 100644 yknjs/reveal.js/test/examples/assets/beeping.wav create mode 100644 yknjs/reveal.js/test/examples/assets/image1.png create mode 100644 yknjs/reveal.js/test/examples/assets/image2.png create mode 100644 yknjs/reveal.js/test/examples/barebones.html create mode 100644 yknjs/reveal.js/test/examples/embedded-media.html create mode 100644 yknjs/reveal.js/test/examples/math.html create mode 100644 yknjs/reveal.js/test/examples/slide-backgrounds.html create mode 100644 yknjs/reveal.js/test/examples/slide-transitions.html create mode 100644 yknjs/reveal.js/test/qunit-2.5.0.css create mode 100644 yknjs/reveal.js/test/qunit-2.5.0.js create mode 100644 yknjs/reveal.js/test/simple.md create mode 100644 yknjs/reveal.js/test/test-dependencies-async.html create mode 100644 yknjs/reveal.js/test/test-dependencies.html create mode 100644 yknjs/reveal.js/test/test-grid-navigation.html create mode 100644 yknjs/reveal.js/test/test-iframes.html create mode 100644 yknjs/reveal.js/test/test-markdown-element-attributes.html create mode 100644 yknjs/reveal.js/test/test-markdown-element-attributes.js create mode 100644 yknjs/reveal.js/test/test-markdown-external.html create mode 100644 yknjs/reveal.js/test/test-markdown-external.js create mode 100644 yknjs/reveal.js/test/test-markdown-options.html create mode 100644 yknjs/reveal.js/test/test-markdown-options.js create mode 100644 yknjs/reveal.js/test/test-markdown-slide-attributes.html create mode 100644 yknjs/reveal.js/test/test-markdown-slide-attributes.js create mode 100644 yknjs/reveal.js/test/test-markdown.html create mode 100644 yknjs/reveal.js/test/test-markdown.js create mode 100644 yknjs/reveal.js/test/test-pdf.html create mode 100644 yknjs/reveal.js/test/test-pdf.js create mode 100644 yknjs/reveal.js/test/test-plugins.html create mode 100644 yknjs/reveal.js/test/test-state.html create mode 100644 yknjs/reveal.js/test/test.html create mode 100644 yknjs/reveal.js/test/test.js diff --git a/yknjs/LICENSE b/yknjs/LICENSE new file mode 100644 index 0000000..a73481c --- /dev/null +++ b/yknjs/LICENSE @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/yknjs/README.md b/yknjs/README.md new file mode 100644 index 0000000..1e7bf1a --- /dev/null +++ b/yknjs/README.md @@ -0,0 +1,16 @@ +# Presentation Title +You know nothing, Jon Snow! OpenStack troubleshooting from a beginner's perspective. + +How to tackle troubleshooting an OpenStack problem, from defining the problem, finding and testing a solution, to documenting the solution and sharing it with the world. + +* * * + +Presented by Elena Lindqvist at 2020 Open Infrastructure Summit, Oct 19-23, 2020 + +Rendered slides from this presentation are at . + +* * * + +Made with [Cookiecutter](https://cookiecutter.readthedocs.io/) from gh:fghaas/cookiecutter-presentation. + +License: CC-BY-SA diff --git a/yknjs/a b/yknjs/a new file mode 100644 index 0000000..e69de29 diff --git a/yknjs/bin/.gitignore b/yknjs/bin/.gitignore new file mode 100644 index 0000000..ba3310e --- /dev/null +++ b/yknjs/bin/.gitignore @@ -0,0 +1,2 @@ +script +script.timing diff --git a/yknjs/bin/README.md b/yknjs/bin/README.md new file mode 100644 index 0000000..73a52a8 --- /dev/null +++ b/yknjs/bin/README.md @@ -0,0 +1,70 @@ +# `bin` + +This directory contains scripts that sometimes come in handy doing +presentations. + +## `screen.sh` + +This is a wrapper around the Linux `script` command that invokes +`screen -xR` (which spawns a new `screen`, or connects to an existing +`screen` session if one is running). + +This script requires the `script` and `mktemp` commands, which should +be available for any contemporary distribution as installable packages +— if they're not already installed by default. + +## `shellinabox.sh` + +This is another wrapper script that also starts `screen`, attaching to +the same session as previously created by the `screen.sh` script, and +exposes the terminal as a small embedded web server at +. You are then able to add this terminal to +your screen, for the purpose of doing a live demo or anything else you +might need a terminal for. To do so, simply include an inline frame in +one of your slides, like so: + +```html + +``` + +Alternatively, you can also include the terminal as a slide +background, which has the added advantage that you can easily +configure it to fill the full available screen. + +```html + +``` + +## `demo.sh` + +If you're using the `data-background-iframe` option in your slides, +you will not be able to type into your screen session from within the +presentation. However, with the `demo.sh` script you can still include +a terminal demo easily: + +- Ahead of your presentation, start `screen.sh` and `shellinabox.sh`. + +- In addition, start `demo.sh`. This will simply create yet another + connection to the same `screen` session. + +- Start your presentation. Hit `s` for the speaker console, then pull + your main window to your projector screen — be sure to put + your browser into full-screen mode —, and leave the speaker + console (and your terminal application) on your laptop display. + +- When you get to your demo slide, use `Alt-Tab` to switch to the + terminal, and type from there. Your typing will be displayed nicely, + and in full width, on the projector screen. + +- When your demo is complete, use `Alt-Tab` again to switch back to + the speaker console, and continue advancing through your slides. + + +## `asciinema.sh` + +If you are making your slides available after your presentation, you +may want to include a screencast of your demo. To turn your recorded +`script` into an asciicast, simply run `asciinema.sh`. It uses +`scriptreplay` to play back your demo, and then uploads it to +[asciinema.org](http://www.asciinema.org). + diff --git a/yknjs/bin/asciinema.sh b/yknjs/bin/asciinema.sh new file mode 100755 index 0000000..458ecd5 --- /dev/null +++ b/yknjs/bin/asciinema.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +SCRIPT="script" +TIMING="$SCRIPT.timing" +LC_ALL=en_US.UTF-8 + +asciinema rec -c "scriptreplay -t $TIMING $SCRIPT" diff --git a/yknjs/bin/demo.sh b/yknjs/bin/demo.sh new file mode 100755 index 0000000..2164fab --- /dev/null +++ b/yknjs/bin/demo.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +"screen -xR" diff --git a/yknjs/bin/screen.sh b/yknjs/bin/screen.sh new file mode 100755 index 0000000..1d37d47 --- /dev/null +++ b/yknjs/bin/screen.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +SCRIPT="script" +TIMING="$SCRIPT.timing" + +if [ -e $SCRIPT -o -e $TIMING ]; then + echo "Please remove or rename $SCRIPT and $TIMING before continuing." >&2 + exit 1 +fi + +script -c "screen -xR" -t${TIMING} $SCRIPT diff --git a/yknjs/bin/shellinabox.sh b/yknjs/bin/shellinabox.sh new file mode 100755 index 0000000..d90940e --- /dev/null +++ b/yknjs/bin/shellinabox.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +dir=`dirname $0` +pidfile="$dir/shellinaboxd.screen.pid" + +# This assumes that screen is installed, and that the invoking user +# is a member of a group whose name is identical to the username. +shellinaboxd \ + --background=$pidfile \ + --localhost-only \ + --no-beep \ + --disable-ssl \ + --css=$dir/../css/shellinabox.css \ + --service /:$USER:$USER:HOME:"screen -xR" + +echo "shellinaboxd started in background. Shutdown with \"kill -TERM `cat $pidfile`\"." >&2 diff --git a/yknjs/compile-and-add-css.sh b/yknjs/compile-and-add-css.sh new file mode 100755 index 0000000..b96d613 --- /dev/null +++ b/yknjs/compile-and-add-css.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Compile Sass and add generated CSS +SASS=`which pysassc || which sassc || which sass` +for scss in css/*.scss; do + css=${scss/.scss/.css} + $SASS -t expanded $scss $css + git add $css +done +git commit -m "Add compiled CSS" diff --git a/yknjs/css/qrcode.css b/yknjs/css/qrcode.css new file mode 100644 index 0000000..b317c3c --- /dev/null +++ b/yknjs/css/qrcode.css @@ -0,0 +1,11 @@ +.qrcode img { + /* Override "block" display which qrcode.js sets by default, to allow + proper centering */ + display: inline !important; + height: 70% !important; + width: auto !important; + margin-left: auto; + margin-right: auto; + background-color: white !important; + padding: 1em; +} diff --git a/yknjs/css/qrcode.scss b/yknjs/css/qrcode.scss new file mode 100644 index 0000000..debf1b7 --- /dev/null +++ b/yknjs/css/qrcode.scss @@ -0,0 +1,13 @@ +.qrcode { + img { + /* Override "block" display which qrcode.js sets by default, to allow + proper centering */ + display: inline !important; + height: 70% !important; + width: auto !important; + margin-left: auto; + margin-right: auto; + background-color: white !important; + padding: 1em; + } +} diff --git a/yknjs/css/reveal-override.css b/yknjs/css/reveal-override.css new file mode 100644 index 0000000..3b1b298 --- /dev/null +++ b/yknjs/css/reveal-override.css @@ -0,0 +1,37 @@ +/* This file is linked from index.html, and should include any CSS + overrides that you want to apply to your selected reveal.js + "white" theme. +*/ +body:after { + content: '@elenalindq'; + opacity: 0.5; + font-size: 200%; + font-family: "Source Sans Pro", sans-serif; + position: fixed; + bottom: 2em; + right: 2em; +} + +.reveal .hidden { + display: none; +} + +.reveal .overview .hidden { + display: inherit; +} + +.reveal td, .reveal th { + font-size: 200%; +} + +.reveal iframe, .reveal img { + border: none; +} + +.reveal .fragment .visible { + opacity: 0.4 !important; +} + +.reveal .fragment .current-fragment { + opacity: 1 !important; +} diff --git a/yknjs/css/reveal-override.scss b/yknjs/css/reveal-override.scss new file mode 100644 index 0000000..c089e3e --- /dev/null +++ b/yknjs/css/reveal-override.scss @@ -0,0 +1,47 @@ +/* This file is linked from index.html, and should include any CSS + overrides that you want to apply to your selected reveal.js + "white" theme. +*/ +body { + + &:after { + content: '@elenalindq'; + opacity: 0.5; + font-size: 200%; + font-family: "Source Sans Pro", sans-serif; + position: fixed; + bottom: 2em; + right: 2em; + } + +} + +.reveal { + .hidden { + display: none; + } + + .overview { + .hidden { + display: inherit; + } + } + + td, th { + font-size: 200%; + } + + iframe, img { + border: none; + } + + .fragment { + .visible { + opacity: 0.4 !important; + } + + .current-fragment { + opacity: 1 !important; + } + } +} diff --git a/yknjs/fonts/.placeholder b/yknjs/fonts/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/yknjs/highlight.js/.editorconfig b/yknjs/highlight.js/.editorconfig new file mode 100644 index 0000000..821eb72 --- /dev/null +++ b/yknjs/highlight.js/.editorconfig @@ -0,0 +1,8 @@ +[*] +end_of_line = lf +insert_final_newline = true + +[*.{js,css}] +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/yknjs/highlight.js/.gitattributes b/yknjs/highlight.js/.gitattributes new file mode 100644 index 0000000..5c7d623 --- /dev/null +++ b/yknjs/highlight.js/.gitattributes @@ -0,0 +1,4 @@ +# The build script and some tests use `\n` as markers, so we need to make sure +# that all javascript files are checked out using UNIX line endings (not `\r\n`) +*.js eol=lf +*.txt eol=lf \ No newline at end of file diff --git a/yknjs/highlight.js/.gitignore b/yknjs/highlight.js/.gitignore new file mode 100644 index 0000000..9fef4d6 --- /dev/null +++ b/yknjs/highlight.js/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +build +docs/_build +.idea/ +__pycache__ +*.swp +node_modules +.project +yarn.lock diff --git a/yknjs/highlight.js/.travis.yml b/yknjs/highlight.js/.travis.yml new file mode 100644 index 0000000..7ef674f --- /dev/null +++ b/yknjs/highlight.js/.travis.yml @@ -0,0 +1,30 @@ +language: node_js +node_js: + - "lts/*" + - "node" +env: + - + - BROWSER=1 + - BROWSER=1 NOCOMPRESS=1 +script: + - | + export BUILD_PARAMS="" + + if [ "x$BROWSER" = "x1" ]; then + export BUILD_PARAMS="$BUILD_PARAMS -t browser" + else + export BUILD_PARAMS="$BUILD_PARAMS -t node" + fi + + if [ "x$NOCOMPRESS" = "x1" ]; then + export BUILD_PARAMS="$BUILD_PARAMS -n" + fi + + node tools/build.js $BUILD_PARAMS + + if [ "x$BROWSER" = "x1" ]; then + npm run test-browser + else + npm run test + fi +sudo: false # Use container-based architecture diff --git a/yknjs/highlight.js/AUTHORS.en.txt b/yknjs/highlight.js/AUTHORS.en.txt new file mode 100644 index 0000000..4a1d218 --- /dev/null +++ b/yknjs/highlight.js/AUTHORS.en.txt @@ -0,0 +1,277 @@ +Syntax highlighting with language autodetection. + +URL: https://highlightjs.org/ + +Current core developers (alphabetical): + +- Gidi Meir Morris +- Jan T. Sott +- Li Xuanji +- Marcos Cáceres +- Sang Dang + +Former maintainers: + +- Ivan Sagalaev (original author) +- Jeremy Hull +- Oleg Efimov + +Contributors: + +- Peter Leonov +- Victor Karamzin +- Vsevolod Solovyov +- Anton Kovalyov +- Nikita Ledyaev +- Konstantin Evdokimenko +- Dmitri Roudakov +- Yuri Ivanov +- Vladimir Ermakov +- Vladimir Gubarkov +- Brian Beck +- MajestiC +- Vasily Polovnyov +- Vladimir Epifanov +- Alexander Makarov +- Vah +- Shuen-Huei Guan +- Jason Diamond +- Michal Gabrukiewicz +- Ruslan Keba +- Sergey Baranov +- Zaripov Yura +- Oleg Volchkov +- Vasily Mikhailitchenko +- Jan Berkel +- Vladimir Moskva +- Loren Segal +- Andrew Fedorov +- Igor Kalnitsky +- Valerii Hiora +- Nikolay Zakharov +- Dmitry Kovega +- Sergey Ignatov +- Antono Vasiljev +- Stephan Kountso +- pumbur +- John Crepezzi +- Andrey Vlasovskikh +- Alexander Myadzel +- Evgeny Stepanischev +- Dmytrii Nagirniak +- Luigi Maselli +- Denis Bardadym +- Aahan Krish +- Ilya Baryshev +- Aleksandar Ruzicic +- Joe Cheng +- Angel G. Olloqui +- Jason Tate +- Sergey Tikhomirov +- Marc Fornos +- Yoshihide Jimbo +- Casey Duncan +- Eugene Nizhibitsky +- Alberto Gimeno +- Kirk Kimmel +- Nathan Grigg +- Dr. Drang +- Robin Ward +- Dmitry Medvinsky +- Jason Jacobson +- Jonas Follesø +- Dan Allen +- noformnocontent +- Damien White +- Alexander Marenin +- Cédric Néhémie +- Simon Madine +- Benjamin Pannell +- Eric Knibbe +- Poren Chiang +- Kelley van Evert +- Kurt Emch +- Mehdi Dogguy +- Nicolas Braud-Santoni +- Ralf Bitter +- Sylvestre Ledru +- Troy Kershaw +- Zena Treep +- Daniel Kvasnicka +- Carlo Kok +- Bram de Haan +- Seongwon Lee +- Zaven Muradyan +- Brent Bradbury +- Martin Dilling-Hansen +- Ilya Vassilevsky +- Josh Adams +- Dan Tao +- Jeff Escalante +- Jun Yang +- Nikolay Lisienko +- Heiko August +- Domen Kožar +- Travis Odom +- innocenat +- Arthur Bikmullin +- Pascal Hurni +- Roman Shmatov +- Nic West +- Panu Horsmalahti +- Flaviu Tamas +- Damian Mee +- Christopher Kaster +- Chris Eidhof +- Nate Cook +- Matt Diephouse +- Erik Osheim +- Guillaume Laforge +- Lucas Mazza +- Maxim Dikun +- Henrik Feldt +- Anton Kochkov +- Michael Allen +- JP Verkamp +- Adam Joseph Cook +- Sergey Vidyuk +- Radek Liska +- Jose Molina Colmenero +- Max Mikhailov +- Bryant Williams +- Erik Paluka +- Luke Holder +- David Mohundro +- Nicholas Blumhardt +- Christophe de Dinechin +- Taneli Vatanen +- Jen Evers-Corvina +- Kassio Borges +- Cedric Sohrauer +- Mickaël Delahaye +- Hakan Özler +- Trey Shugart +- Vincent Zurczak +- Adam Joseph Cook +- Edwin Dalorzo +- mucaho +- Dennis Titze +- Jon Evans +- Brian Quistorff +- Jonathan Suever +- Alexis Hénaut +- Chris Kiehl +- Peter Piwowarski +- Kenta Sato +- Anthony Scemama +- Taufik Nurrohman +- Pedro Oliveira +- Gu Yiling +- Thomas Applencourt +- Andrew Farmer +- Sergey Mashkov +- Raivo Laanemets +- Kenneth Fuglsang +- David Anson +- Louis Barranqueiro +- Tim Schumacher +- Lucas Werkmeister +- Dan Panzarella +- Bruno Dias +- Jay Strybis +- Guillaume Gomez +- Janis Voigtländer +- Dirk Kirsten +- MY Sun +- Vadimtro +- Benjamin Auder +- Dotan Dimet +- Manh Tuan +- Philippe Charrière +- Stefan Bechert +- Samuel Reed +- Yury Selivanov +- Tsuyusato Kitsune +- Mick MacCallum +- Kristoffer Gronlund +- Søren Enevoldsen +- Daniel Rosenwasser +- Ladislav Prskavec +- Jan Kühle +- Stefan Wienert +- Nikita Savchenko +- Stefania Mellai +- Nebuleon Fumika +- prince +- Brendan Rocks +- Raphaël Assénat +- Matt Evans +- Martin Braun +- Boris Cherny +- John Foster +- Robert Dodier +- Anthony Dugois +- Qeole +- Denis Ciccale +- Michael Johnston +- Taras +- Philipp Wolfer +- Mikko Kouhia +- Billy Quith +- Herbert Shin +- Tristano Ajmone +- Taisuke Fujimoto +- Boone Severson +- Victor Zhou +- Lars Schulna +- Jacob Childress +- Gavin Siu +- Builder's Brewery +- Sergey Bronnikov +- Joe Eli McIlvain +- Stephan Boyer +- Alex McKibben +- Daniel Gamage +- Matthew Daly +- Magnus Madsen +- Camil Staps +- Alexander Lichter +- Nicolas Le Gall +- Kenton Hamaluik +- Marvin Saignat +- Michael Rodler +- Sergey Sobko +- Hale Chan +- Kasper Andersen +- Philipp A. +- Guannan Wei +- Sam Wu +- Ike Ku +- Andres Täht +- Rene Saarsoo +- Jordi Petit +- Raphaël Parrëe +- Joël Porquet +- Alex Arslan +- Stanislav Belov +- Ivan Dementev +- Nicolas LLOBERA +- Morten Piibeleht +- Martin Clausen +- Arctic Ice Studio +- Google Inc. (David Benjamin) +- Ahmad Awais +- Duncan Paterson +- Tristian Kelly +- Melissa Geels +- Dmitriy Tarasov +- Egor Rogov +- Meseta +- Harmon +- Eric Bailey +- Gustavo Costa +- Antoine Boisier-Michaud +- Alejandro Isaza +- Laurent Voullemier +- Sean T. Allen +- Greg Cline diff --git a/yknjs/highlight.js/CHANGES.md b/yknjs/highlight.js/CHANGES.md new file mode 100644 index 0000000..ca4b82b --- /dev/null +++ b/yknjs/highlight.js/CHANGES.md @@ -0,0 +1,1860 @@ +## Master + +New languages: + +New styles: + +Improvements: + +## Version 9.15.6 +New languages: + none. +New styles: + none. +Improvements: + - Move dependencies to be devDependencies. + - Fixed security issues in dev dependencies. + +## Version 9.15.5 +New languages: + none. +New styles: + none. +Improvements: + 🔥 Hot fix: updated build tool. + +## Version 9.15.4 +New languages: + none. +New styles: + none. +Improvements: + 🔥 Hot fix: reverted hljs cli build tool, as it was causing issues with install. + +## Version 9.15.3 +New languages: + none. +New styles: + none. +Improvements: + 🔥 Hot fix: reverted hljs cli build tool, as it was causing issues with install. + +## Version 9.15.2 +New languages: + none. +New styles: + none. +Improvements: + 🔥 Hot fix that was preventing highlight.js from installing. + +## Version 9.15.1 + +New languages: + none. + +New styles: + none. + +Improvements: + +- Pony: Fixed keywords without spaces at line ends, highlighting of `iso` in class definitions, and function heads without bodies in traits and interfaces. Removed FUNCTION and CLASS modes until they are found to be needed and to provide some of the fixes. + - Support external language files in minified version of highlight.js (#1888) + +## Version 9.15 + +New languages: + none. + +New styles: + none. + +Improvements: + - new cli tool `hljs` - allows easier [building from command line](docs/building-testing.rst#building-a-bundle-from-the-command-line). + - cpp: Fully support C++11 raw strings. (#1897) + - Python: Treat False None and True as literals (#1920) + +## Version 9.14.2 + +New languages: + none. +New styles: + none. +Improvements: +- *Gauss* fixed to stop global namespace pollution [Scott Hyndman][]. +- fix(Tcl): removed apostrophe string delimiters (don't exist) + +[Scott Hyndman]: https://github.com/shyndman + +## Version 9.14.1 + +New languages: + none. +New styles: + none. +Improvements: +- Pony: language improvements (#1958) + +## Version 9.14.0 + +New languages: + none. +New styles: + none. +Improvements: +- Pony: add missing "object" highlighting (#1932) +- Added *XQuery* built-in functions, prolog declarations, as well as parsing of function bodies, computed and direct constructors, by [Duncan Paterson][] +- fix(dart): Corrects highlighting with string interpolation. (#1946) +- fix(swift): be eager on optional-using types (!/?) (#1919) +- fix(tex): Changed cyrillic to unicode (IE11 throw SCRIPT5021) (#1601) +- fix(JavaScript): Recognize get/set accessor keywords (#1940) +- Fixed Dockerfile definition when using highlight continuation parameter, by [Laurent Voullemier][] +- Added tests & new `annotation` and `verbatim` keywords to *Crystal*, by [Benoit de Chezelles][] +- Added missing dockerfile markup tests, by [Laurent Voullemier][] + Allow empty prompt text in clojure-repl, by [Egor Rogov][] +- Fixed several issues with *Crystal* language definition, by [Johannes Müller][] +- Added `C#` as an alias for *CSharp* language, by [Ahmed Atito][] +- Added generic user-defined proc support, new compiler define, refactor to re-use rules, and add tests to *GAUSS*, by [Matthew Evans][] +- Improve *Crystal* language to highlight regexes after some keywords, by [Tsuyusato Kitsune][] +- Fix filterByQualifiers: fileInfo can be null +- Fixed String interpolation in Dart, by [Scott Hyndman][]. + +[Laurent Voullemier]: https://github.com/l-vo +[Benoit de Chezelles]: https://github.com/bew +[Johannes Müller]: https://github.com/straight-shoota +[Ahmed Atito]: https://github.com/atitoa93 +[Matthew Evans]: https://github.com/matthewevans +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Scott Hyndman]: https://github.com/shyndman +[Duncan Paterson]: https://github.com/duncdrum + +## Version 9.13.1 + +Improvements: + +- *C#* function declarations no longer include trailing whitespace, by [JeremyTCD][] +- Added new and missing keywords to *AngelScript*, by [Melissa Geels][] +- *TypeScript* decorator factories highlighting fix, by [Antoine Boisier-Michaud][] +- Added support for multiline strings to *Swift*, by [Alejandro Isaza][] +- Fixed issue that was causing some minifiers to fail. +- Fixed `autoDetection` to accept language aliases. + +[JeremyTCD]: https://github.com/JeremyTCD +[Melissa Geels]: https://github.com/codecat +[Antoine Boisier-Michaud]: https://github.com/Aboisier +[Alejandro Isaza]: https://github.com/alejandro-isaza + +## Version 9.13.0 + +New languages: + +- *ArcGIS Arcade* by [John Foster][] +- *AngelScript* by [Melissa Geels][] +- *GML* by [meseta][] +- *isbl* built-in language DIRECTUM and Conterra by [Dmitriy Tarasov][]. +- *PostgreSQL* SQL dialect and PL/pgSQL language by [Egor Rogov][]. +- *ReasonML* by [Gidi Meir Morris][] +- *SAS* by [Mauricio Caceres Bravo][] +- *Plaintext* by [Egor Rogov][] +- *.properties* by [bostko][] and [Egor Rogov][] + +New styles: + +- *a11y-dark theme* by [Eric Bailey][] +- *a11y-light theme* by [Eric Bailey][] +- *An Old Hope* by [Gustavo Costa][] +- *Atom One Dark Reasonable* by [Gidi Meir Morris][] +- *isbl editor dark* by [Dmitriy Tarasov][] +- *isbl editor light* by [Dmitriy Tarasov][] +- *Lightfair* by [Tristian Kelly][] +- [*Nord*][nord-highlightjs] by [Arctic Ice Studio][] +- *[🦄 Shades of Purple](https://github.com/ahmadawais/Shades-of-Purple-HighlightJS)* by [Ahmad Awais][] + +Improvements: + +- New attribute `endSameAsBegin` for nested constructs with variable names + by [Egor Rogov][]. +- *Python* highlighting of escaped quotes fixed by [Harmon][] +- *PHP*: Added alias for php7, by [Vijaya Chandran Mani][] +- *C++* string handling, by [David Benjamin][] +- *Swift* Add `@objcMembers` to `@attributes`, by [Berk Çebi][] +- Infrastructural changes by [Marcos Cáceres][] +- Fixed metachars highighting for *NSIS* by [Jan T. Sott][] +- *Yaml* highlight local tags as types by [Léo Lam][] +- Improved highlighting for *Elixir* by [Piotr Kaminski][] +- New attribute `disableAutodetect` for preventing autodetection by [Egor Rogov][] +- *Matlab*: transpose operators and double quote strings, by [JohnC32][] and [Egor Rogov][] +- Various documentation typos and improvemets by [Jimmy Wärting][], [Lutz Büch][], [bcleland][] +- *Cmake* updated with new keywords and commands by [Deniz Bahadir][] + +[Ahmad Awais]: https://github.com/ahmadawais +[Arctic Ice Studio]: https://github.com/arcticicestudio +[Dmitriy Tarasov]: https://github.com/MedvedTMN +[Egor Rogov]: https://github.com/egor-rogov +[Eric Bailey]: https://github.com/ericwbailey +[Gidi Meir Morris]: https://github.com/gmmorris +[Gustavo Costa]: https://github.com/gusbemacbe +[Harmon]: https://github.com/Harmon758 +[Melissa Geels]: https://github.com/codecat +[meseta]: https://github.com/meseta +[nord-highlightjs]: https://github.com/arcticicestudio/nord-highlightjs +[Tristian Kelly]: https://github.com/TristianK3604 +[Vijaya Chandran Mani]: https://github.com/vijaycs85 +[John Foster]: https://github.com/jf990 +[David Benjamin]: https://github.com/davidben +[Berk Çebi]: https://github.com/berkcebi +[Mauricio Caceres Bravo]: https://github.com/mcaceresb +[bostko]: https://github.com/bostko +[Deniz Bahadir]: https://github.com/Bagira80 +[bcleland]: https://github.com/bcleland +[JohnC32]: https://github.com/JohnC32 +[Lutz Büch]: https://github.com/lutz-100worte +[Piotr Kaminski]: https://github.com/pkaminski +[Léo Lam]: https://github.com/leoetlino +[Jan T. Sott]: https://github.com/idleberg +[Jimmy Wärting]: https://github.com/jimmywarting +[Marcos Cáceres]: https://github.com/marcoscaceres + +## Version 9.12.0 + +New language: + +- *MikroTik* RouterOS Scripting language by [Ivan Dementev][]. + +New style: + +- *VisualStudio 2015 Dark* by [Nicolas LLOBERA][] + +Improvements: +- *Crystal* updated with new keywords and syntaxes by [Tsuyusato Kitsune][]. +- *Julia* updated to the modern definitions by [Alex Arslan][]. +- *julia-repl* added by [Morten Piibeleht][]. +- [Stanislav Belov][] wrote a new definition for *1C*, replacing the one that + has not been updated for more than 8 years. The new version supports syntax + for versions 7.7 and 8. +- [Nicolas LLOBERA][] improved C# definition fixing edge cases with function + titles detection and added highlighting of `[Attributes]`. +- [nnnik][] provided a few correctness fixes for *Autohotkey*. +- [Martin Clausen][] made annotation collections in *Clojure* to look + consistently with other kinds. +- [Alejandro Alonso][] updated *Swift* keywords. + +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Alex Arslan]: https://github.com/ararslan +[Morten Piibeleht]: https://github.com/mortenpi +[Stanislav Belov]: https://github.com/4ppl +[Ivan Dementev]: https://github.com/DiVAN1x +[Nicolas LLOBERA]: https://github.com/Nicolas01 +[nnnik]: https://github.com/nnnik +[Martin Clausen]: https://github.com/maacl +[Alejandro Alonso]: https://github.com/Azoy + +## Version 9.11.0 + +New languages: + +- *Shell* by [Tsuyusato Kitsune][] +- *jboss-cli* by [Raphaël Parrëe][] + +Improvements: + +- [Joël Porquet] has [greatly improved the definition of *makefile*][5b3e0e6]. +- *C++* class titles are now highlighted as in other languages with classes. +- [Jordi Petit][] added rarely used `or`, `and` and `not` keywords to *C++*. +- [Pieter Vantorre][] fixed highlighting of negative floating point values. + + +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Jordi Petit]: https://github.com/jordi-petit +[Raphaël Parrëe]: https://github.com/rparree +[Pieter Vantorre]: https://github.com/NuclearCookie +[5b3e0e6]: https://github.com/isagalaev/highlight.js/commit/5b3e0e68bfaae282faff6697d6a490567fa9d44b + + +## Version 9.10.0 + +Apologies for missing the previous release cycle. Some thing just can't be +automated… Anyway, we're back! + +New languages: + +- *Hy* by [Sergey Sobko][] +- *Leaf* by [Hale Chan][] +- *N1QL* by [Andres Täht][] and [Rene Saarsoo][] + +Improvements: + +- *Rust* got updated with new keywords by [Kasper Andersen][] and then + significantly modernized even more by [Eduard-Mihai Burtescu][] (yes, @eddyb, + Rust core team member!) +- *Python* updated with f-literals by [Philipp A][]. +- *YAML* updated with unquoted strings support. +- *Gauss* updated with new keywords by [Matt Evans][]. +- *Lua* updated with new keywords by [Joe Blow][]. +- *Kotlin* updated with new keywords by [Philipp Hauer][]. +- *TypeScript* got highlighting of function params and updated keywords by + [Ike Ku][]. +- *Scheme* now correctly handles \`-quoted lists thanks to [Guannan Wei]. +- [Sam Wu][] fixed handling of `<<` in *C++* defines. + +[Philipp A]: https://github.com/flying-sheep +[Philipp Hauer]: https://github.com/phauer +[Sergey Sobko]: https://github.com/profitware +[Hale Chan]: https://github.com/halechan +[Matt Evans]: https://github.com/matthewevans +[Joe Blow]: https://github.com/mossarelli +[Kasper Andersen]: https://github.com/kasma1990 +[Eduard-Mihai Burtescu]: https://github.com/eddyb +[Andres Täht]: https://github.com/andrestaht +[Rene Saarsoo]: https://github.com/nene +[Philipp Hauer]: https://github.com/phauer +[Ike Ku]: https://github.com/dempfi +[Guannan Wei]: https://github.com/Kraks +[Sam Wu]: https://github.com/samsam2310 + + +## Version 9.9.0 + +New languages + +- *LLVM* by [Michael Rodler][] + +Improvements: + +- *TypeScript* updated with annotations and param lists inside constructors, by + [Raphael Parree][]. +- *CoffeeScript* updated with new keywords and fixed to recognize JavaScript + in \`\`\`, thanks to thanks to [Geoffrey Booth][]. +- Compiler directives in *Delphi* are now correctly highlighted as "meta". + +[Raphael Parree]: https://github.com/rparree +[Michael Rodler]: https://github.com/f0rki +[Geoffrey Booth]: https://github.com/GeoffreyBooth + + +## Version 9.8.0 "New York" + +This version is the second one that deserved a name. Because I'm in New York, +and the release isn't missing the deadline only because it's still Tuesday on +West Coast. + +New languages: + +- *Clean* by [Camil Staps][] +- *Flix* by [Magnus Madsen][] + +Improvements: + +- [Kenton Hamaluik][] did a comprehensive update for *Haxe*. +- New commands for *PowerShell* from [Nicolas Le Gall][]. +- [Jan T. Sott][] updated *NSIS*. +- *Java* and *Swift* support unicode characters in identifiers thanks to + [Alexander Lichter][]. + +[Camil Staps]: https://github.com/camilstaps +[Magnus Madsen]: https://github.com/magnus-madsen +[Kenton Hamaluik]: https://github.com/FuzzyWuzzie +[Nicolas Le Gall]: https://github.com/darkitty +[Jan T. Sott]: https://github.com/idleberg +[Alexander Lichter]: https://github.com/manniL + + +## Version 9.7.0 + +A comprehensive bugfix release. This is one of the best things about +highlight.js: even boring things keep getting better (even if slow). + +- VHDL updated with PSL keywords and uses more consistent styling. +- Nested C-style comments no longer break highlighting in many languages. +- JavaScript updated with `=>` functions, highlighted object attributes and + parsing within template string substitution blocks (`${...}`). +- Fixed another corner case with self-closing `` in JSX. +- Added `HEALTHCHECK` directive in Docker. +- Delphi updated with new Free Pascal keywords. +- Fixed digit separator parsing in C++. +- C# updated with new keywords and fixed to allow multiple identifiers within + generics `<...>`. +- Fixed another slow regex in Less. + + +## Version 9.6.0 + +New languages: + +- *ABNF* and *EBNF* by [Alex McKibben][] +- *Awk* by [Matthew Daly][] +- *SubUnit* by [Sergey Bronnikov][] + +New styles: + +- *Atom One* in both Dark and Light variants by [Daniel Gamage][] + +Plus, a few smaller updates for *Lasso*, *Elixir*, *C++* and *SQL*. + +[Alex McKibben]: https://github.com/mckibbenta +[Daniel Gamage]: https://github.com/danielgamage +[Matthew Daly]: https://github.com/matthewbdaly +[Sergey Bronnikov]: https://github.com/ligurio + + +## Version 9.5.0 + +New languages: + +- *Excel* by [Victor Zhou][] +- *Linden Scripting Language* by [Builder's Brewery][] +- *TAP* (Test Anything Protocol) by [Sergey Bronnikov][] +- *Pony* by [Joe Eli McIlvain][] +- *Coq* by [Stephan Boyer][] +- *dsconfig* and *LDIF* by [Jacob Childress][] + +New styles: + +- *Ocean Dark* by [Gavin Siu][] + +Notable changes: + +- [Minh Nguyễn][] added more built-ins to Objective C. +- [Jeremy Hull][] fixed corner cases in C++ preprocessor directives and Diff + comments. +- [Victor Zhou][] added support for digit separators in C++ numbers. + +[Gavin Siu]: https://github.com/gavsiu +[Builder's Brewery]: https://github.com/buildersbrewery +[Victor Zhou]: https://github.com/OiCMudkips +[Sergey Bronnikov]: https://github.com/ligurio +[Joe Eli McIlvain]: https://github.com/jemc +[Stephan Boyer]: https://github.com/boyers +[Jacob Childress]: https://github.com/braveulysses +[Minh Nguyễn]: https://github.com/1ec5 +[Jeremy Hull]: https://github.com/sourrust + + +## Version 9.4.0 + +New languages: + +- *PureBASIC* by [Tristano Ajmone][] +- *BNF* by [Oleg Efimov][] +- *Ada* by [Lars Schulna][] + +New styles: + +- *PureBASIC* by [Tristano Ajmone][] + +Improvements to existing languages and styles: + +- We now highlight function declarations in Go. +- [Taisuke Fujimoto][] contributed very convoluted rules for raw and + interpolated strings in C#. +- [Boone Severson][] updated Verilog to comply with IEEE 1800-2012 + SystemVerilog. +- [Victor Zhou][] improved rules for comments and strings in PowerShell files. +- [Janis Voigtländer][] updated the definition of Elm to version 0.17 of the + languages. Elm is now featured on the front page of . +- Special variable `$this` is highlighted as a keyword in PHP. +- `usize` and `isize` are now highlighted in Rust. +- Fixed labels and directives in x86 assembler. + +[Tristano Ajmone]: https://github.com/tajmone +[Taisuke Fujimoto]: https://github.com/temp-impl +[Oleg Efimov]: https://github.com/Sannis +[Boone Severson]: https://github.com/BooneJS +[Victor Zhou]: https://github.com/OiCMudkips +[Lars Schulna]: https://github.com/captain-hanuta +[Janis Voigtländer]: https://github.com/jvoigtlaender + + +## Version 9.3.0 + +New languages: + +- *Tagger Script* by [Philipp Wolfer][] +- *MoonScript* by [Billy Quith][] + +New styles: + +- *xt256* by [Herbert Shin][] + +Improvements to existing languages and styles: + +- More robust handling of unquoted HTML tag attributes +- Relevance tuning for QML which was unnecessary eager at seizing other + languages' code +- Improve GAMS language parsing +- Fixed a bunch of bugs around selectors in Less +- Kotlin's got a new definition for annotations, updated keywords and other + minor improvements +- Added `move` to Rust keywords +- Markdown now recognizes \`\`\`-fenced code blocks +- Improved detection of function declarations in C++ and C# + +[Philipp Wolfer]: https://github.com/phw +[Billy Quith]: https://github.com/billyquith +[Herbert Shin]: https://github.com/initbar + + +## Version 9.2.0 + +New languages: + +- *QML* by [John Foster][] +- *HTMLBars* by [Michael Johnston][] +- *CSP* by [Taras][] +- *Maxima* by [Robert Dodier][] + +New styles: + +- *Gruvbox* by [Qeole][] +- *Dracula* by [Denis Ciccale][] + +Improvements to existing languages and styles: + +- We now correctly handle JSX with arbitrary node tree depth. +- Argument list for `(lambda)` in Scheme is no longer highlighted as a function + call. +- Stylus syntax doesn't break on valid CSS. +- More correct handling of comments and strings and other improvements for + VimScript. +- More subtle work on the default style. +- We now use anonymous modules for AMD. +- `macro_rules!` is now recognized as a built-in in Rust. + +[John Foster]: https://github.com/jf990 +[Qeole]: https://github.com/Qeole +[Denis Ciccale]: https://github.com/dciccale +[Michael Johnston]: https://github.com/lastobelus +[Taras]: https://github.com/oxdef +[Robert Dodier]: https://github.com/robert-dodier + + +## Version 9.1.0 + +New languages: + +- *Stan* by [Brendan Rocks][] +- *BASIC* by [Raphaël Assénat][] +- *GAUSS* by [Matt Evans][] +- *DTS* by [Martin Braun][] +- *Arduino* by [Stefania Mellai][] + +New Styles: + +- *Arduino Light* by [Stefania Mellai][] + +Improvements to existing languages and styles: + +- Handle return type annotations in Python +- Allow shebang headers in Javascript +- Support strings in Rust meta +- Recognize `struct` as a class-level definition in Rust +- Recognize b-prefixed chars and strings in Rust +- Better numbers handling in Verilog + +[Brendan Rocks]: http://brendanrocks.com +[Raphaël Assénat]: https://github.com/raphnet +[Matt Evans]: https://github.com/matthewevans +[Martin Braun]: https://github.com/mbr0wn +[Stefania Mellai]: https://github.com/smellai + + +## Version 9.0.0 + +The new major version brings a reworked styling system. Highlight.js now defines +a limited set of highlightable classes giving a consistent result across all the +styles and languages. You can read a more detailed explanation and background in +the [tracking issue][#348] that started this long process back in May. + +This change is backwards incompatible for those who uses highlight.js with a +custom stylesheet. The [new style guide][sg] explains how to write styles +in this new world. + +Bundled themes have also suffered a significant amount of improvements and may +look different in places, but all the things now consistent and make more sense. +Among others, the Default style has got a refresh and will probably be tweaked +some more in next releases. Please do give your feedback in our +[issue tracker][issues]. + +New languages in this release: + +- *Caché Object Script* by [Nikita Savchenko][] +- *YAML* by [Stefan Wienert][] +- *MIPS Assembler* by [Nebuleon Fumika][] +- *HSP* by [prince][] + +Improvements to existing languages and styles: + +- ECMAScript 6 modules import now do not require closing semicolon. +- ECMAScript 6 classes constructors now highlighted. +- Template string support for Typescript, as for ECMAScript 6. +- Scala case classes params highlight fixed. +- Built-in names introduced in Julia v0.4 added by [Kenta Sato][]. +- Refreshed Default style. + +Other notable changes: + +- [Web workers support][webworkers] added bu [Jan Kühle][]. +- We now have tests for compressed browser builds as well. +- The building tool chain has been switched to node.js 4.x. and is now + shamelessly uses ES6 features all over the place, courtesy of [Jeremy Hull][]. +- License added to non-compressed browser build. + +[Jan Kühle]: https://github.com/frigus02 +[Stefan Wienert]: https://github.com/zealot128 +[Kenta Sato]: https://github.com/bicycle1885 +[Nikita Savchenko]: https://github.com/ZitRos +[webworkers]: https://github.com/isagalaev/highlight.js#web-workers +[Jeremy Hull]: https://github.com/sourrust +[#348]: https://github.com/isagalaev/highlight.js/issues/348 +[sg]: http://highlightjs.readthedocs.org/en/latest/style-guide.html +[issues]: https://github.com/isagalaev/highlight.js/issues +[Nebuleon Fumika]: https://github.com/Nebuleon +[prince]: https://github.com/prince-0203 + + +## Version 8.9.1 + +Some last-minute changes reverted due to strange bug with minified browser build: + +- Scala case classes params highlight fixed +- ECMAScript 6 modules import now do not require closing semicolon +- ECMAScript 6 classes constructors now highlighted +- Template string support for Typescript, as for ECMAScript 6 +- License added to not minified browser build + + +## Version 8.9.0 + +New languages: + +- *crmsh* by [Kristoffer Gronlund][] +- *SQF* by [Soren Enevoldsen][] + +[Kristoffer Gronlund]: https://github.com/krig +[Soren Enevoldsen]: https://github.com/senevoldsen90 + +Notable fixes and improvements to existing languages: + +- Added `abstract` and `namespace` keywords to TypeScript by [Daniel Rosenwasser][] +- Added `label` support to Dockerfile by [Ladislav Prskavec][] +- Crystal highlighting improved by [Tsuyusato Kitsune][] +- Missing Swift keywords added by [Nate Cook][] +- Improve detection of C block comments +- ~~Scala case classes params highlight fixed~~ +- ~~ECMAScript 6 modules import now do not require closing semicolon~~ +- ~~ECMAScript 6 classes constructors now highlighted~~ +- ~~Template string support for Typescript, as for ECMAScript 6~~ + +Other notable changes: + +- ~~License added to not minified browser build~~ + +[Kristoffer Gronlund]: https://github.com/krig +[Søren Enevoldsen]: https://github.com/senevoldsen90 +[Daniel Rosenwasser]: https://github.com/DanielRosenwasser +[Ladislav Prskavec]: https://github.com/abtris +[Tsuyusato Kitsune]: https://github.com/MakeNowJust +[Nate Cook]: https://github.com/natecook1000 + + +## Version 8.8.0 + +New languages: + +- *Golo* by [Philippe Charrière][] +- *GAMS* by [Stefan Bechert][] +- *IRPF90* by [Anthony Scemama][] +- *Access logs* by [Oleg Efimov][] +- *Crystal* by [Tsuyusato Kitsune][] + +Notable fixes and improvements to existing languages: + +- JavaScript highlighting no longer fails with ES6 default parameters +- Added keywords `async` and `await` to Python +- PHP heredoc support improved +- Allow preprocessor directives within C++ functions + +Other notable changes: + +- Change versions to X.Y.Z SemVer-compatible format +- Added ability to build all targets at once + +[Philippe Charrière]: https://github.com/k33g +[Stefan Bechert]: https://github.com/b-pos465 +[Anthony Scemama]: https://github.com/scemama +[Oleg Efimov]: https://github.com/Sannis +[Tsuyusato Kitsune]: https://github.com/MakeNowJust + + +## Version 8.7 + +New languages: + +- *Zephir* by [Oleg Efimov][] +- *Elm* by [Janis Voigtländer][] +- *XQuery* by [Dirk Kirsten][] +- *Mojolicious* by [Dotan Dimet][] +- *AutoIt* by Manh Tuan from [J2TeaM][] +- *Toml* (ini extension) by [Guillaume Gomez][] + +New styles: + +- *Hopscotch* by [Jan T. Sott][] +- *Grayscale* by [MY Sun][] + +Notable fixes and improvements to existing languages: + +- Fix encoding of images when copied over in certain builds +- Fix incorrect highlighting of the word "bug" in comments +- Treat decorators different from matrix multiplication in Python +- Fix traits inheritance highlighting in Rust +- Fix incorrect document +- Oracle keywords added to SQL language definition by [Vadimtro][] +- Postgres keywords added to SQL language definition by [Benjamin Auder][] +- Fix registers in x86asm being highlighted as a hex number +- Fix highlighting for numbers with a leading decimal point +- Correctly highlight numbers and strings inside of C/C++ macros +- C/C++ functions now support pointer, reference, and move returns + +[Oleg Efimov]: https://github.com/Sannis +[Guillaume Gomez]: https://github.com/GuillaumeGomez +[Janis Voigtländer]: https://github.com/jvoigtlaender +[Jan T. Sott]: https://github.com/idleberg +[Dirk Kirsten]: https://github.com/dirkk +[MY Sun]: https://github.com/simonmysun +[Vadimtro]: https://github.com/Vadimtro +[Benjamin Auder]: https://github.com/ghost +[Dotan Dimet]: https://github.com/dotandimet +[J2TeaM]: https://github.com/J2TeaM + + +## Version 8.6 + +New languages: + +- *C/AL* by [Kenneth Fuglsang][] +- *DNS zone file* by [Tim Schumacher][] +- *Ceylon* by [Lucas Werkmeister][] +- *OpenSCAD* by [Dan Panzarella][] +- *Inform7* by [Bruno Dias][] +- *armasm* by [Dan Panzarella][] +- *TP* by [Jay Strybis][] + +New styles: + +- *Atelier Cave*, *Atelier Estuary*, + *Atelier Plateau* and *Atelier Savanna* by [Bram de Haan][] +- *Github Gist* by [Louis Barranqueiro][] + +Notable fixes and improvements to existing languages: + +- Multi-line raw strings from C++11 are now supported +- Fix class names with dashes in HAML +- The `async` keyword from ES6/7 is now supported +- TypeScript functions handle type and parameter complexity better +- We unified phpdoc/javadoc/yardoc etc modes across all languages +- CSS .class selectors relevance was dropped to prevent wrong language detection +- Images is now included to CDN build +- Release process is now automated + +[Bram de Haan]: https://github.com/atelierbram +[Kenneth Fuglsang]: https://github.com/kfuglsang +[Louis Barranqueiro]: https://github.com/LouisBarranqueiro +[Tim Schumacher]: https://github.com/enko +[Lucas Werkmeister]: https://github.com/lucaswerkmeister +[Dan Panzarella]: https://github.com/pzl +[Bruno Dias]: https://github.com/sequitur +[Jay Strybis]: https://github.com/unreal + + +## Version 8.5 + +New languages: + +- *pf.conf* by [Peter Piwowarski][] +- *Julia* by [Kenta Sato][] +- *Prolog* by [Raivo Laanemets][] +- *Docker* by [Alexis Hénaut][] +- *Fortran* by [Anthony Scemama][] and [Thomas Applencourt][] +- *Kotlin* by [Sergey Mashkov][] + +New styles: + +- *Agate* by [Taufik Nurrohman][] +- *Darcula* by [JetBrains][] +- *Atelier Sulphurpool* by [Bram de Haan][] +- *Android Studio* by [Pedro Oliveira][] + +Notable fixes and improvements to existing languages: + +- ES6 features in JavaScript are better supported now by [Gu Yiling][]. +- Swift now recognizes body-less method definitions. +- Single expression functions `def foo, do: ... ` now work in Elixir. +- More uniform detection of built-in classes in Objective C. +- Fixes for number literals and processor directives in Rust. +- HTML ` + ``` + +- `tabReplace` and `useBR` that were used in different places are also unified + into the global options object and are to be set using `configure(options)`. + This function is documented in our [API docs][]. Also note that these + parameters are gone from `highlightBlock` and `fixMarkup` which are now also + rely on `configure`. + +- We removed public-facing (though undocumented) object `hljs.LANGUAGES` which + was used to register languages with the library in favor of two new methods: + `registerLanguage` and `getLanguage`. Both are documented in our [API docs][]. + +- Result returned from `highlight` and `highlightAuto` no longer contains two + separate attributes contributing to relevance score, `relevance` and + `keyword_count`. They are now unified in `relevance`. + +Another technically compatible change that nonetheless might need attention: + +- The structure of the NPM package was refactored, so if you had installed it + locally, you'll have to update your paths. The usual `require('highlight.js')` + works as before. This is contributed by [Dmitry Smolin][]. + +New features: + +- Languages now can be recognized by multiple names like "js" for JavaScript or + "html" for, well, HTML (which earlier insisted on calling it "xml"). These + aliases can be specified in the class attribute of the code container in your + HTML as well as in various API calls. For now there are only a few very common + aliases but we'll expand it in the future. All of them are listed in the + [class reference][cr]. + +- Language detection can now be restricted to a subset of languages relevant in + a given context — a web page or even a single highlighting call. This is + especially useful for node.js build that includes all the known languages. + Another example is a StackOverflow-style site where users specify languages + as tags rather than in the markdown-formatted code snippets. This is + documented in the [API reference][] (see methods `highlightAuto` and + `configure`). + +- Language definition syntax streamlined with [variants][] and + [beginKeywords][]. + +New languages and styles: + +- *Oxygene* by [Carlo Kok][] +- *Mathematica* by [Daniel Kvasnička][] +- *Autohotkey* by [Seongwon Lee][] +- *Atelier* family of styles in 10 variants by [Bram de Haan][] +- *Paraíso* styles by [Jan T. Sott][] + +Miscellaneous improvements: + +- Highlighting `=>` prompts in Clojure. +- [Jeremy Hull][] fixed a lot of styles for consistency. +- Finally, highlighting PHP and HTML [mixed in peculiar ways][php-html]. +- Objective C and C# now properly highlight titles in method definition. +- Big overhaul of relevance counting for a number of languages. Please do report + bugs about mis-detection of non-trivial code snippets! + +[API reference]: http://highlightjs.readthedocs.org/en/latest/api.html + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html +[api docs]: http://highlightjs.readthedocs.org/en/latest/api.html +[variants]: https://groups.google.com/d/topic/highlightjs/VoGC9-1p5vk/discussion +[beginKeywords]: https://github.com/isagalaev/highlight.js/commit/6c7fdea002eb3949577a85b3f7930137c7c3038d +[php-html]: https://twitter.com/highlightjs/status/408890903017689088 + +[Carlo Kok]: https://github.com/carlokok +[Bram de Haan]: https://github.com/atelierbram +[Daniel Kvasnička]: https://github.com/dkvasnicka +[Dmitry Smolin]: https://github.com/dimsmol +[Jeremy Hull]: https://github.com/sourrust +[Seongwon Lee]: https://github.com/dlimpid +[Jan T. Sott]: https://github.com/idleberg + + +## Version 7.5 + +A catch-up release dealing with some of the accumulated contributions. This one +is probably will be the last before the 8.0 which will be slightly backwards +incompatible regarding some advanced use-cases. + +One outstanding change in this version is the addition of 6 languages to the +[hosted script][d]: Markdown, ObjectiveC, CoffeeScript, Apache, Nginx and +Makefile. It now weighs about 6K more but we're going to keep it under 30K. + +New languages: + +- OCaml by [Mehdi Dogguy][mehdid] and [Nicolas Braud-Santoni][nbraud] +- [LiveCode Server][lcs] by [Ralf Bitter][revig] +- Scilab by [Sylvestre Ledru][sylvestre] +- basic support for Makefile by [Ivan Sagalaev][isagalaev] + +Improvements: + +- Ruby's got support for characters like `?A`, `?1`, `?\012` etc. and `%r{..}` + regexps. +- Clojure now allows a function call in the beginning of s-expressions + `(($filter "myCount") (arr 1 2 3 4 5))`. +- Haskell's got new keywords and now recognizes more things like pragmas, + preprocessors, modules, containers, FFIs etc. Thanks to [Zena Treep][treep] + for the implementation and to [Jeremy Hull][sourrust] for guiding it. +- Miscellaneous fixes in PHP, Brainfuck, SCSS, Asciidoc, CMake, Python and F#. + +[mehdid]: https://github.com/mehdid +[nbraud]: https://github.com/nbraud +[revig]: https://github.com/revig +[lcs]: http://livecode.com/developers/guides/server/ +[sylvestre]: https://github.com/sylvestre +[isagalaev]: https://github.com/isagalaev +[treep]: https://github.com/treep +[sourrust]: https://github.com/sourrust +[d]: http://highlightjs.org/download/ + + +## New core developers + +The latest long period of almost complete inactivity in the project coincided +with growing interest to it led to a decision that now seems completely obvious: +we need more core developers. + +So without further ado let me welcome to the core team two long-time +contributors: [Jeremy Hull][] and [Oleg +Efimov][]. + +Hope now we'll be able to work through stuff faster! + +P.S. The historical commit is [here][1] for the record. + +[Jeremy Hull]: https://github.com/sourrust +[Oleg Efimov]: https://github.com/sannis +[1]: https://github.com/isagalaev/highlight.js/commit/f3056941bda56d2b72276b97bc0dd5f230f2473f + + +## Version 7.4 + +This long overdue version is a snapshot of the current source tree with all the +changes that happened during the past year. Sorry for taking so long! + +Along with the changes in code highlight.js has finally got its new home at +, moving from its cradle on Software Maniacs which it +outgrew a long time ago. Be sure to report any bugs about the site to +. + +On to what's new… + +New languages: + +- Handlebars templates by [Robin Ward][] +- Oracle Rules Language by [Jason Jacobson][] +- F# by [Joans Follesø][] +- AsciiDoc and Haml by [Dan Allen][] +- Lasso by [Eric Knibbe][] +- SCSS by [Kurt Emch][] +- VB.NET by [Poren Chiang][] +- Mizar by [Kelley van Evert][] + +[Robin Ward]: https://github.com/eviltrout +[Jason Jacobson]: https://github.com/jayce7 +[Joans Follesø]: https://github.com/follesoe +[Dan Allen]: https://github.com/mojavelinux +[Eric Knibbe]: https://github.com/EricFromCanada +[Kurt Emch]: https://github.com/kemch +[Poren Chiang]: https://github.com/rschiang +[Kelley van Evert]: https://github.com/kelleyvanevert + +New style themes: + +- Monokai Sublime by [noformnocontent][] +- Railscasts by [Damien White][] +- Obsidian by [Alexander Marenin][] +- Docco by [Simon Madine][] +- Mono Blue by [Ivan Sagalaev][] (uses a single color hue for everything) +- Foundation by [Dan Allen][] + +[noformnocontent]: http://nn.mit-license.org/ +[Damien White]: https://github.com/visoft +[Alexander Marenin]: https://github.com/ioncreature +[Simon Madine]: https://github.com/thingsinjars +[Ivan Sagalaev]: https://github.com/isagalaev + +Other notable changes: + +- Corrected many corner cases in CSS. +- Dropped Python 2 version of the build tool. +- Implemented building for the AMD format. +- Updated Rust keywords (thanks to [Dmitry Medvinsky][]). +- Literal regexes can now be used in language definitions. +- CoffeeScript highlighting is now significantly more robust and rich due to + input from [Cédric Néhémie][]. + +[Dmitry Medvinsky]: https://github.com/dmedvinsky +[Cédric Néhémie]: https://github.com/abe33 + + +## Version 7.3 + +- Since this version highlight.js no longer works in IE version 8 and older. + It's made it possible to reduce the library size and dramatically improve code + readability and made it easier to maintain. Time to go forward! + +- New languages: AppleScript (by [Nathan Grigg][ng] and [Dr. Drang][dd]) and + Brainfuck (by [Evgeny Stepanischev][bolk]). + +- Improvements to existing languages: + + - interpreter prompt in Python (`>>>` and `...`) + - @-properties and classes in CoffeeScript + - E4X in JavaScript (by [Oleg Efimov][oe]) + - new keywords in Perl (by [Kirk Kimmel][kk]) + - big Ruby syntax update (by [Vasily Polovnyov][vast]) + - small fixes in Bash + +- Also Oleg Efimov did a great job of moving all the docs for language and style + developers and contributors from the old wiki under the source code in the + "docs" directory. Now these docs are nicely presented at + . + +[ng]: https://github.com/nathan11g +[dd]: https://github.com/drdrang +[bolk]: https://github.com/bolknote +[oe]: https://github.com/Sannis +[kk]: https://github.com/kimmel +[vast]: https://github.com/vast + + +## Version 7.2 + +A regular bug-fix release without any significant new features. Enjoy! + + +## Version 7.1 + +A Summer crop: + +- [Marc Fornos][mf] made the definition for Clojure along with the matching + style Rainbow (which, of course, works for other languages too). +- CoffeeScript support continues to improve getting support for regular + expressions. +- Yoshihide Jimbo ported to highlight.js [five Tomorrow styles][tm] from the + [project by Chris Kempson][tm0]. +- Thanks to [Casey Duncun][cd] the library can now be built in the popular + [AMD format][amd]. +- And last but not least, we've got a fair number of correctness and consistency + fixes, including a pretty significant refactoring of Ruby. + +[mf]: https://github.com/mfornos +[tm]: http://jmblog.github.com/color-themes-for-highlightjs/ +[tm0]: https://github.com/ChrisKempson/Tomorrow-Theme +[cd]: https://github.com/caseman +[amd]: http://requirejs.org/docs/whyamd.html + + +## Version 7.0 + +The reason for the new major version update is a global change of keyword syntax +which resulted in the library getting smaller once again. For example, the +hosted build is 2K less than at the previous version while supporting two new +languages. + +Notable changes: + +- The library now works not only in a browser but also with [node.js][]. It is + installable with `npm install highlight.js`. [API][] docs are available on our + wiki. + +- The new unique feature (apparently) among syntax highlighters is highlighting + *HTTP* headers and an arbitrary language in the request body. The most useful + languages here are *XML* and *JSON* both of which highlight.js does support. + Here's [the detailed post][p] about the feature. + +- Two new style themes: a dark "south" *[Pojoaque][]* by Jason Tate and an + emulation of*XCode* IDE by [Angel Olloqui][ao]. + +- Three new languages: *D* by [Aleksandar Ružičić][ar], *R* by [Joe Cheng][jc] + and *GLSL* by [Sergey Tikhomirov][st]. + +- *Nginx* syntax has become a million times smaller and more universal thanks to + remaking it in a more generic manner that doesn't require listing all the + directives in the known universe. + +- Function titles are now highlighted in *PHP*. + +- *Haskell* and *VHDL* were significantly reworked to be more rich and correct + by their respective maintainers [Jeremy Hull][sr] and [Igor Kalnitsky][ik]. + +And last but not least, many bugs have been fixed around correctness and +language detection. + +Overall highlight.js currently supports 51 languages and 20 style themes. + +[node.js]: http://nodejs.org/ +[api]: http://softwaremaniacs.org/wiki/doku.php/highlight.js:api +[p]: http://softwaremaniacs.org/blog/2012/05/10/http-and-json-in-highlight-js/en/ +[pojoaque]: http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +[ao]: https://github.com/angelolloqui +[ar]: https://github.com/raleksandar +[jc]: https://github.com/jcheng5 +[st]: https://github.com/tikhomirov +[sr]: https://github.com/sourrust +[ik]: https://github.com/ikalnitsky + + +## Version 6.2 + +A lot of things happened in highlight.js since the last version! We've got nine +new contributors, the discussion group came alive, and the main branch on GitHub +now counts more than 350 followers. Here are most significant results coming +from all this activity: + +- 5 (five!) new languages: Rust, ActionScript, CoffeeScript, MatLab and + experimental support for markdown. Thanks go to [Andrey Vlasovskikh][av], + [Alexander Myadzel][am], [Dmytrii Nagirniak][dn], [Oleg Efimov][oe], [Denis + Bardadym][db] and [John Crepezzi][jc]. + +- 2 new style themes: Monokai by [Luigi Maselli][lm] and stylistic imitation of + another well-known highlighter Google Code Prettify by [Aahan Krish][ak]. + +- A vast number of [correctness fixes and code refactorings][log], mostly made + by [Oleg Efimov][oe] and [Evgeny Stepanischev][es]. + +[av]: https://github.com/vlasovskikh +[am]: https://github.com/myadzel +[dn]: https://github.com/dnagir +[oe]: https://github.com/Sannis +[db]: https://github.com/btd +[jc]: https://github.com/seejohnrun +[lm]: http://grigio.org/ +[ak]: https://github.com/geekpanth3r +[es]: https://github.com/bolknote +[log]: https://github.com/isagalaev/highlight.js/commits/ + + +## Version 6.1 — Solarized + +[Jeremy Hull][jh] has implemented my dream feature — a port of [Solarized][] +style theme famous for being based on the intricate color theory to achieve +correct contrast and color perception. It is now available for highlight.js in +both variants — light and dark. + +This version also adds a new original style Arta. Its author pumbur maintains a +[heavily modified fork of highlight.js][pb] on GitHub. + +[jh]: https://github.com/sourrust +[solarized]: http://ethanschoonover.com/solarized +[pb]: https://github.com/pumbur/highlight.js + + +## Version 6.0 + +New major version of the highlighter has been built on a significantly +refactored syntax. Due to this it's even smaller than the previous one while +supporting more languages! + +New languages are: + +- Haskell by [Jeremy Hull][sourrust] +- Erlang in two varieties — module and REPL — made collectively by [Nikolay + Zakharov][desh], [Dmitry Kovega][arhibot] and [Sergey Ignatov][ignatov] +- Objective C by [Valerii Hiora][vhbit] +- Vala by [Antono Vasiljev][antono] +- Go by [Stephan Kountso][steplg] + +[sourrust]: https://github.com/sourrust +[desh]: http://desh.su/ +[arhibot]: https://github.com/arhibot +[ignatov]: https://github.com/ignatov +[vhbit]: https://github.com/vhbit +[antono]: https://github.com/antono +[steplg]: https://github.com/steplg + +Also this version is marginally faster and fixes a number of small long-standing +bugs. + +Developer overview of the new language syntax is available in a [blog post about +recent beta release][beta]. + +[beta]: http://softwaremaniacs.org/blog/2011/04/25/highlight-js-60-beta/en/ + +P.S. New version is not yet available on a Yandex CDN, so for now you have to +download [your own copy][d]. + +[d]: /soft/highlight/en/download/ + + +## Version 5.14 + +Fixed bugs in HTML/XML detection and relevance introduced in previous +refactoring. + +Also test.html now shows the second best result of language detection by +relevance. + + +## Version 5.13 + +Past weekend began with a couple of simple additions for existing languages but +ended up in a big code refactoring bringing along nice improvements for language +developers. + +### For users + +- Description of C++ has got new keywords from the upcoming [C++ 0x][] standard. +- Description of HTML has got new tags from [HTML 5][]. +- CSS-styles have been unified to use consistent padding and also have lost + pop-outs with names of detected languages. +- [Igor Kalnitsky][ik] has sent two new language descriptions: CMake & VHDL. + +This makes total number of languages supported by highlight.js to reach 35. + +Bug fixes: + +- Custom classes on `
` tags are not being overridden anymore
+- More correct highlighting of code blocks inside non-`
` containers:
+  highlighter now doesn't insist on replacing them with its own container and
+  just replaces the contents.
+- Small fixes in browser compatibility and heuristics.
+
+[c++ 0x]: http://ru.wikipedia.org/wiki/C%2B%2B0x
+[html 5]: http://en.wikipedia.org/wiki/HTML5
+[ik]: http://kalnitsky.org.ua/
+
+### For developers
+
+The most significant change is the ability to include language submodes right
+under `contains` instead of defining explicit named submodes in the main array:
+
+    contains: [
+      'string',
+      'number',
+      {begin: '\\n', end: hljs.IMMEDIATE_RE}
+    ]
+
+This is useful for auxiliary modes needed only in one place to define parsing.
+Note that such modes often don't have `className` and hence won't generate a
+separate `` in the resulting markup. This is similar in effect to
+`noMarkup: true`. All existing languages have been refactored accordingly.
+
+Test file test.html has at last become a real test. Now it not only puts the
+detected language name under the code snippet but also tests if it matches the
+expected one. Test summary is displayed right above all language snippets.
+
+
+## CDN
+
+Fine people at [Yandex][] agreed to host highlight.js on their big fast servers.
+[Link up][l]!
+
+[yandex]: http://yandex.com/
+[l]: http://softwaremaniacs.org/soft/highlight/en/download/
+
+
+## Version 5.10 — "Paris".
+
+Though I'm on a vacation in Paris, I decided to release a new version with a
+couple of small fixes:
+
+- Tomas Vitvar discovered that TAB replacement doesn't always work when used
+  with custom markup in code
+- SQL parsing is even more rigid now and doesn't step over SmallTalk in tests
+
+
+## Version 5.9
+
+A long-awaited version is finally released.
+
+New languages:
+
+- Andrew Fedorov made a definition for Lua
+- a long-time highlight.js contributor [Peter Leonov][pl] made a definition for
+  Nginx config
+- [Vladimir Moskva][vm] made a definition for TeX
+
+[pl]: http://kung-fu-tzu.ru/
+[vm]: http://fulc.ru/
+
+Fixes for existing languages:
+
+- [Loren Segal][ls] reworked the Ruby definition and added highlighting for
+  [YARD][] inline documentation
+- the definition of SQL has become more solid and now it shouldn't be overly
+  greedy when it comes to language detection
+
+[ls]: http://gnuu.org/
+[yard]: http://yardoc.org/
+
+The highlighter has become more usable as a library allowing to do highlighting
+from initialization code of JS frameworks and in ajax methods (see.
+readme.eng.txt).
+
+Also this version drops support for the [WordPress][wp] plugin. Everyone is
+welcome to [pick up its maintenance][p] if needed.
+
+[wp]: http://wordpress.org/
+[p]: http://bazaar.launchpad.net/~isagalaev/+junk/highlight/annotate/342/src/wp_highlight.js.php
+
+
+## Version 5.8
+
+- Jan Berkel has contributed a definition for Scala. +1 to hotness!
+- All CSS-styles are rewritten to work only inside `
` tags to avoid
+  conflicts with host site styles.
+
+
+## Version 5.7.
+
+Fixed escaping of quotes in VBScript strings.
+
+
+## Version 5.5
+
+This version brings a small change: now .ini-files allow digits, underscores and
+square brackets in key names.
+
+
+## Version 5.4
+
+Fixed small but upsetting bug in the packer which caused incorrect highlighting
+of explicitly specified languages. Thanks to Andrew Fedorov for precise
+diagnostics!
+
+
+## Version 5.3
+
+The version to fulfil old promises.
+
+The most significant change is that highlight.js now preserves custom user
+markup in code along with its own highlighting markup. This means that now it's
+possible to use, say, links in code. Thanks to [Vladimir Dolzhenko][vd] for the
+[initial proposal][1] and for making a proof-of-concept patch.
+
+Also in this version:
+
+- [Vasily Polovnyov][vp] has sent a GitHub-like style and has implemented
+  support for CSS @-rules and Ruby symbols.
+- Yura Zaripov has sent two styles: Brown Paper and School Book.
+- Oleg Volchkov has sent a definition for [Parser 3][p3].
+
+[1]: http://softwaremaniacs.org/forum/highlightjs/6612/
+[p3]: http://www.parser.ru/
+[vp]: http://vasily.polovnyov.ru/
+[vd]: http://dolzhenko.blogspot.com/
+
+
+## Version 5.2
+
+- at last it's possible to replace indentation TABs with something sensible
+  (e.g. 2 or 4 spaces)
+- new keywords and built-ins for 1C by Sergey Baranov
+- a couple of small fixes to Apache highlighting
+
+
+## Version 5.1
+
+This is one of those nice version consisting entirely of new and shiny
+contributions!
+
+- [Vladimir Ermakov][vooon] created highlighting for AVR Assembler
+- [Ruslan Keba][rukeba] created highlighting for Apache config file. Also his
+  original visual style for it is now available for all highlight.js languages
+  under the name "Magula".
+- [Shuen-Huei Guan][drake] (aka Drake) sent new keywords for RenderMan
+  languages. Also thanks go to [Konstantin Evdokimenko][ke] for his advice on
+  the matter.
+
+[vooon]: http://vehq.ru/about/
+[rukeba]: http://rukeba.com/
+[drake]: http://drakeguan.org/
+[ke]: http://k-evdokimenko.moikrug.ru/
+
+
+## Version 5.0
+
+The main change in the new major version of highlight.js is a mechanism for
+packing several languages along with the library itself into a single compressed
+file. Now sites using several languages will load considerably faster because
+the library won't dynamically include additional files while loading.
+
+Also this version fixes a long-standing bug with Javascript highlighting that
+couldn't distinguish between regular expressions and division operations.
+
+And as usually there were a couple of minor correctness fixes.
+
+Great thanks to all contributors! Keep using highlight.js.
+
+
+## Version 4.3
+
+This version comes with two contributions from [Jason Diamond][jd]:
+
+- language definition for C# (yes! it was a long-missed thing!)
+- Visual Studio-like highlighting style
+
+Plus there are a couple of minor bug fixes for parsing HTML and XML attributes.
+
+[jd]: http://jason.diamond.name/weblog/
+
+
+## Version 4.2
+
+The biggest news is highlighting for Lisp, courtesy of Vasily Polovnyov. It's
+somewhat experimental meaning that for highlighting "keywords" it doesn't use
+any pre-defined set of a Lisp dialect. Instead it tries to highlight first word
+in parentheses wherever it makes sense. I'd like to ask people programming in
+Lisp to confirm if it's a good idea and send feedback to [the forum][f].
+
+Other changes:
+
+- Smalltalk was excluded from DEFAULT_LANGUAGES to save traffic
+- [Vladimir Epifanov][voldmar] has implemented javascript style switcher for
+  test.html
+- comments now allowed inside Ruby function definition
+- [MEL][] language from [Shuen-Huei Guan][drake]
+- whitespace now allowed between `
` and ``
+- better auto-detection of C++ and PHP
+- HTML allows embedded VBScript (`<% .. %>`)
+
+[f]: http://softwaremaniacs.org/forum/highlightjs/
+[voldmar]: http://voldmar.ya.ru/
+[mel]: http://en.wikipedia.org/wiki/Maya_Embedded_Language
+[drake]: http://drakeguan.org/
+
+
+## Version 4.1
+
+Languages:
+
+- Bash from Vah
+- DOS bat-files from Alexander Makarov (Sam)
+- Diff files from Vasily Polovnyov
+- Ini files from myself though initial idea was from Sam
+
+Styles:
+
+- Zenburn from Vladimir Epifanov, this is an imitation of a
+  [well-known theme for Vim][zenburn].
+- Ascetic from myself, as a realization of ideals of non-flashy highlighting:
+  just one color in only three gradations :-)
+
+In other news. [One small bug][bug] was fixed, built-in keywords were added for
+Python and C++ which improved auto-detection for the latter (it was shame that
+[my wife's blog][alenacpp] had issues with it from time to time). And lastly
+thanks go to Sam for getting rid of my stylistic comments in code that were
+getting in the way of [JSMin][].
+
+[zenburn]: http://en.wikipedia.org/wiki/Zenburn
+[alenacpp]: http://alenacpp.blogspot.com/
+[bug]: http://softwaremaniacs.org/forum/viewtopic.php?id=1823
+[jsmin]: http://code.google.com/p/jsmin-php/
+
+
+## Version 4.0
+
+New major version is a result of vast refactoring and of many contributions.
+
+Visible new features:
+
+- Highlighting of embedded languages. Currently is implemented highlighting of
+  Javascript and CSS inside HTML.
+- Bundled 5 ready-made style themes!
+
+Invisible new features:
+
+- Highlight.js no longer pollutes global namespace. Only one object and one
+  function for backward compatibility.
+- Performance is further increased by about 15%.
+
+Changing of a major version number caused by a new format of language definition
+files. If you use some third-party language files they should be updated.
+
+
+## Version 3.5
+
+A very nice version in my opinion fixing a number of small bugs and slightly
+increased speed in a couple of corner cases. Thanks to everybody who reports
+bugs in he [forum][f] and by email!
+
+There is also a new language — XML. A custom XML formerly was detected as HTML
+and didn't highlight custom tags. In this version I tried to make custom XML to
+be detected and highlighted by its own rules. Which by the way include such
+things as CDATA sections and processing instructions (``).
+
+[f]: http://softwaremaniacs.org/forum/viewforum.php?id=6
+
+
+## Version 3.3
+
+[Vladimir Gubarkov][xonix] has provided an interesting and useful addition.
+File export.html contains a little program that shows and allows to copy and
+paste an HTML code generated by the highlighter for any code snippet. This can
+be useful in situations when one can't use the script itself on a site.
+
+
+[xonix]: http://xonixx.blogspot.com/
+
+
+## Version 3.2 consists completely of contributions:
+
+- Vladimir Gubarkov has described SmallTalk
+- Yuri Ivanov has described 1C
+- Peter Leonov has packaged the highlighter as a Firefox extension
+- Vladimir Ermakov has compiled a mod for phpBB
+
+Many thanks to you all!
+
+
+## Version 3.1
+
+Three new languages are available: Django templates, SQL and Axapta. The latter
+two are sent by [Dmitri Roudakov][1]. However I've almost entirely rewrote an
+SQL definition but I'd never started it be it from the ground up :-)
+
+The engine itself has got a long awaited feature of grouping keywords
+("keyword", "built-in function", "literal"). No more hacks!
+
+[1]: http://roudakov.ru/
+
+
+## Version 3.0
+
+It is major mainly because now highlight.js has grown large and has become
+modular. Now when you pass it a list of languages to highlight it will
+dynamically load into a browser only those languages.
+
+Also:
+
+- Konstantin Evdokimenko of [RibKit][] project has created a highlighting for
+  RenderMan Shading Language and RenderMan Interface Bytestream. Yay for more
+  languages!
+- Heuristics for C++ and HTML got better.
+- I've implemented (at last) a correct handling of backslash escapes in C-like
+  languages.
+
+There is also a small backwards incompatible change in the new version. The
+function initHighlighting that was used to initialize highlighting instead of
+initHighlightingOnLoad a long time ago no longer works. If you by chance still
+use it — replace it with the new one.
+
+[RibKit]: http://ribkit.sourceforge.net/
+
+
+## Version 2.9
+
+Highlight.js is a parser, not just a couple of regular expressions. That said
+I'm glad to announce that in the new version 2.9 has support for:
+
+- in-string substitutions for Ruby -- `#{...}`
+- strings from from numeric symbol codes (like #XX) for Delphi
+
+
+## Version 2.8
+
+A maintenance release with more tuned heuristics. Fully backwards compatible.
+
+
+## Version 2.7
+
+- Nikita Ledyaev presents highlighting for VBScript, yay!
+- A couple of bugs with escaping in strings were fixed thanks to Mickle
+- Ongoing tuning of heuristics
+
+Fixed bugs were rather unpleasant so I encourage everyone to upgrade!
+
+
+## Version 2.4
+
+- Peter Leonov provides another improved highlighting for Perl
+- Javascript gets a new kind of keywords — "literals". These are the words
+  "true", "false" and "null"
+
+Also highlight.js homepage now lists sites that use the library. Feel free to
+add your site by [dropping me a message][mail] until I find the time to build a
+submit form.
+
+[mail]: mailto:Maniac@SoftwareManiacs.Org
+
+
+## Version 2.3
+
+This version fixes IE breakage in previous version. My apologies to all who have
+already downloaded that one!
+
+
+## Version 2.2
+
+- added highlighting for Javascript
+- at last fixed parsing of Delphi's escaped apostrophes in strings
+- in Ruby fixed highlighting of keywords 'def' and 'class', same for 'sub' in
+  Perl
+
+
+## Version 2.0
+
+- Ruby support by [Anton Kovalyov][ak]
+- speed increased by orders of magnitude due to new way of parsing
+- this same way allows now correct highlighting of keywords in some tricky
+  places (like keyword "End" at the end of Delphi classes)
+
+[ak]: http://anton.kovalyov.net/
+
+
+## Version 1.0
+
+Version 1.0 of javascript syntax highlighter is released!
+
+It's the first version available with English description. Feel free to post
+your comments and question to [highlight.js forum][forum]. And don't be afraid
+if you find there some fancy Cyrillic letters -- it's for Russian users too :-)
+
+[forum]: http://softwaremaniacs.org/forum/viewforum.php?id=6
diff --git a/yknjs/highlight.js/LICENSE b/yknjs/highlight.js/LICENSE
new file mode 100644
index 0000000..422deb7
--- /dev/null
+++ b/yknjs/highlight.js/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of highlight.js nor the names of its contributors 
+      may be used to endorse or promote products derived from this software 
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/yknjs/highlight.js/README.md b/yknjs/highlight.js/README.md
new file mode 100644
index 0000000..4c287ae
--- /dev/null
+++ b/yknjs/highlight.js/README.md
@@ -0,0 +1,188 @@
+# Highlight.js
+
+[![Build Status](https://travis-ci.org/highlightjs/highlight.js.svg?branch=master)](https://travis-ci.org/highlightjs/highlight.js) [![Greenkeeper badge](https://badges.greenkeeper.io/highlightjs/highlight.js.svg)](https://greenkeeper.io/)
+
+Highlight.js is a syntax highlighter written in JavaScript. It works in
+the browser as well as on the server. It works with pretty much any
+markup, doesn’t depend on any framework, and has automatic language
+detection.
+
+## Getting Started
+
+The bare minimum for using highlight.js on a web page is linking to the
+library along with one of the styles and calling
+[`initHighlightingOnLoad`][1]:
+
+```html
+
+
+
+```
+
+This will find and highlight code inside of `
` tags; it tries
+to detect the language automatically. If automatic detection doesn’t
+work for you, you can specify the language in the `class` attribute:
+
+```html
+
...
+``` + +The list of supported language classes is available in the [class +reference][2]. Classes can also be prefixed with either `language-` or +`lang-`. + +To make arbitrary text look like code, but without highlighting, use the +`plaintext` class: + +```html +
...
+``` + +To disable highlighting altogether use the `nohighlight` class: + +```html +
...
+``` + +## Custom Initialization + +When you need a bit more control over the initialization of +highlight.js, you can use the [`highlightBlock`][3] and [`configure`][4] +functions. This allows you to control *what* to highlight and *when*. + +Here’s an equivalent way to calling [`initHighlightingOnLoad`][1] using +vanilla JS: + +```js +document.addEventListener('DOMContentLoaded', (event) => { + document.querySelectorAll('pre code').forEach((block) => { + hljs.highlightBlock(block); + }); +}); +``` + +You can use any tags instead of `
` to mark up your code. If
+you don't use a container that preserves line breaks you will need to
+configure highlight.js to use the `
` tag: + +```js +hljs.configure({useBR: true}); + +document.querySelectorAll('div.code').forEach((block) => { + hljs.highlightBlock(block); +}); +``` + +For other options refer to the documentation for [`configure`][4]. + + +## Web Workers + +You can run highlighting inside a web worker to avoid freezing the browser +window while dealing with very big chunks of code. + +In your main script: + +```js +addEventListener('load', () => { + const code = document.querySelector('#code'); + const worker = new Worker('worker.js'); + worker.onmessage = (event) => { code.innerHTML = event.data; } + worker.postMessage(code.textContent); +}); +``` + +In worker.js: + +```js +onmessage = (event) => { + importScripts('/highlight.pack.js'); + const result = self.hljs.highlightAuto(event.data); + postMessage(result.value); +}; +``` + + +## Getting the Library + +You can get highlight.js as a hosted, or custom-build, browser script or +as a server module. Right out of the box the browser script supports +both AMD and CommonJS, so if you wish you can use RequireJS or +Browserify without having to build from source. The server module also +works perfectly fine with Browserify, but there is the option to use a +build specific to browsers rather than something meant for a server. +Head over to the [download page][5] for all the options. + +**Don't link to GitHub directly.** The library is not supposed to work straight +from the source, it requires building. If none of the pre-packaged options +work for you refer to the [building documentation][6]. + +**The CDN-hosted package doesn't have all the languages.** Otherwise it'd be +too big. If you don't see the language you need in the ["Common" section][5], +it can be added manually: + +```html + +``` + +**On Almond.** You need to use the optimizer to give the module a name. For +example: + +```bash +r.js -o name=hljs paths.hljs=/path/to/highlight out=highlight.js +``` + + +### CommonJS + +You can import Highlight.js as a CommonJS-module: + +```bash +npm install highlight.js --save +``` + +In your application: + +```js +import hljs from 'highlight.js'; +``` + +The default import imports all languages! Therefore it is likely to be more efficient to import only the library and the languages you need: + +```js +import hljs from 'highlight.js/lib/highlight'; +import javascript from 'highlight.js/lib/languages/javascript'; +hljs.registerLanguage('javascript', javascript); +``` + +To set the syntax highlighting style, if your build tool processes CSS from your JavaScript entry point, you can import the stylesheet directly into your CommonJS-module: + +```js +import hljs from 'highlight.js/lib/highlight'; +import 'highlight.js/styles/github.css'; +``` + +## License + +Highlight.js is released under the BSD License. See [LICENSE][7] file +for details. + +## Links + +The official site for the library is at . + +Further in-depth documentation for the API and other topics is at +. + +Authors and contributors are listed in the [AUTHORS.en.txt][8] file. + +[1]: http://highlightjs.readthedocs.io/en/latest/api.html#inithighlightingonload +[2]: http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html +[3]: http://highlightjs.readthedocs.io/en/latest/api.html#highlightblock-block +[4]: http://highlightjs.readthedocs.io/en/latest/api.html#configure-options +[5]: https://highlightjs.org/download/ +[6]: http://highlightjs.readthedocs.io/en/latest/building-testing.html +[7]: https://github.com/highlightjs/highlight.js/blob/master/LICENSE +[8]: https://github.com/highlightjs/highlight.js/blob/master/AUTHORS.en.txt diff --git a/yknjs/highlight.js/README.ru.md b/yknjs/highlight.js/README.ru.md new file mode 100644 index 0000000..198ee96 --- /dev/null +++ b/yknjs/highlight.js/README.ru.md @@ -0,0 +1,142 @@ +# Highlight.js + +Highlight.js — это инструмент для подсветки синтаксиса, написанный на JavaScript. Он работает +и в браузере, и на сервере. Он работает с практически любой HTML разметкой, не +зависит от каких-либо фреймворков и умеет автоматически определять язык. + + +## Начало работы + +Минимум, что нужно сделать для использования highlight.js на веб-странице — это +подключить библиотеку, CSS-стили и вызывать [`initHighlightingOnLoad`][1]: + +```html + + + +``` + +Библиотека найдёт и раскрасит код внутри тегов `
`, попытавшись
+автоматически определить язык. Когда автоопределение не срабатывает, можно явно
+указать язык в атрибуте class:
+
+```html
+
...
+``` + +Список поддерживаемых классов языков доступен в [справочнике по классам][2]. +Класс также можно предварить префиксами `language-` или `lang-`. + +Чтобы отключить подсветку для какого-то блока, используйте класс `nohighlight`: + +```html +
...
+``` + +## Инициализация вручную + +Чтобы иметь чуть больше контроля за инициализацией подсветки, вы можете +использовать функции [`highlightBlock`][3] и [`configure`][4]. Таким образом +можно управлять тем, *что* и *когда* подсвечивать. + +Вот пример инициализации, эквивалентной вызову [`initHighlightingOnLoad`][1], но +с использованием `document.addEventListener`: + +```js +document.addEventListener('DOMContentLoaded', (event) => { + document.querySelectorAll('pre code').forEach((block) => { + hljs.highlightBlock(block); + }); +}); +``` + +Вы можете использовать любые теги разметки вместо `
`. Если
+используете контейнер, не сохраняющий переводы строк, вам нужно сказать
+highlight.js использовать для них тег `
`: + +```js +hljs.configure({useBR: true}); + +document.querySelectorAll('div.code').forEach((block) => { + hljs.highlightBlock(block); +}); +``` + +Другие опции можно найти в документации функции [`configure`][4]. + + +## Web Workers + +Подсветку можно запустить внутри web worker'а, чтобы окно +браузера не подтормаживало при работе с большими кусками кода. + +В основном скрипте: + +```js +addEventListener('load', () => { + const code = document.querySelector('#code'); + const worker = new Worker('worker.js'); + worker.onmessage = (event) => { code.innerHTML = event.data; } + worker.postMessage(code.textContent); +}); +``` + +В worker.js: + +```js +onmessage = (event) => { + importScripts('/highlight.pack.js'); + const result = self.hljs.highlightAuto(event.data); + postMessage(result.value); +}; +``` + + +## Установка библиотеки + +Highlight.js можно использовать в браузере прямо с CDN хостинга или скачать +индивидуальную сборку, а также установив модуль на сервере. На +[странице загрузки][5] подробно описаны все варианты. + +**Не подключайте GitHub напрямую.** Библиотека не предназначена для +использования в виде исходного кода, а требует отдельной сборки. Если вам не +подходит ни один из готовых вариантов, читайте [документацию по сборке][6]. + +**Файл на CDN содержит не все языки.** Иначе он будет слишком большого размера. +Если нужного вам языка нет в [категории "Common"][5], можно дообавить его +вручную: + +```html + +``` + +**Про Almond.** Нужно задать имя модуля в оптимизаторе, например: + +``` +r.js -o name=hljs paths.hljs=/path/to/highlight out=highlight.js +``` + + +## Лицензия + +Highlight.js распространяется под лицензией BSD. Подробнее читайте файл +[LICENSE][7]. + + +## Ссылки + +Официальный сайт билиотеки расположен по адресу . + +Более подробная документация по API и другим темам расположена на +. + +Авторы и контрибьюторы перечислены в файле [AUTHORS.ru.txt][8] file. + +[1]: http://highlightjs.readthedocs.io/en/latest/api.html#inithighlightingonload +[2]: http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html +[3]: http://highlightjs.readthedocs.io/en/latest/api.html#highlightblock-block +[4]: http://highlightjs.readthedocs.io/en/latest/api.html#configure-options +[5]: https://highlightjs.org/download/ +[6]: http://highlightjs.readthedocs.io/en/latest/building-testing.html +[7]: https://github.com/highlightjs/highlight.js/blob/master/LICENSE +[8]: https://github.com/highlightjs/highlight.js/blob/master/AUTHORS.ru.txt diff --git a/yknjs/highlight.js/demo/demo.js b/yknjs/highlight.js/demo/demo.js new file mode 100644 index 0000000..3516cb0 --- /dev/null +++ b/yknjs/highlight.js/demo/demo.js @@ -0,0 +1,119 @@ +(function() { + 'use strict'; + + var $window = $(window), + $languages = $('#languages div'), + $linkTitle = $('link[title]'), + $categoryContainer = $('#categories'), + $styleContainer = $('#styles'); + + function resizeLists() { + var screenHeight = $window.height() + + $categoryContainer.css('max-height', screenHeight / 4); + $categoryContainer.perfectScrollbar('update'); + $styleContainer.height( + screenHeight - $styleContainer.position().top - 20 + ); + $styleContainer.perfectScrollbar('update'); + } + + function selectCategory(category) { + $languages.each(function(i, language) { + var $language = $(language); + + if ($language.hasClass(category)) { + var code = $language.find('code'); + + if (!code.hasClass('hljs')) { + hljs.highlightBlock(code.get(0)); + } + + $language.show(); + } else { + $language.hide(); + } + }); + + $(document).scrollTop(0); + } + + function categoryKey(c) { + return c === 'common' ? '' : c === 'misc' ? 'z' : c === 'all' ? 'zz' : c; + } + + function initCategories() { + var $categories, categoryNames; + var categories = {}; + + $languages.each(function(i, div) { + if (!div.className) { + div.className += 'misc'; + } + div.className += ' all'; + div.className.split(' ').forEach(function(c) { + categories[c] = (categories[c] || 0) + 1; + }); + }); + + categoryNames = Object.keys(categories); + + categoryNames.sort(function(a, b) { + a = categoryKey(a); + b = categoryKey(b); + return a < b ? -1 : a > b ? 1 : 0; + }); + + categoryNames.forEach(function(c) { + $categoryContainer.append( + '
  • ' + c + ' (' + categories[c] +')
  • ' + ); + }); + + $categories = $categoryContainer.find('li'); + + $categories.click(function() { + var $category = $(this); + + $categories.removeClass('current'); + $category.addClass('current'); + selectCategory($category.data('category')); + }); + + $categories.first().click(); + $categoryContainer.perfectScrollbar(); + } + + function selectStyle(style) { + $linkTitle.each(function(i, link) { + link.disabled = (link.title !== style); + }); + } + + function initStyles() { + var $styles; + + $linkTitle.each(function(i, link) { + $styleContainer.append('
  • ' + link.title + '
  • '); + }); + + $styles = $styleContainer.find('li'); + + $styles.click(function() { + var $style = $(this); + + $styles.removeClass('current'); + $style.addClass('current'); + selectStyle($style.text()); + }); + $styles.first().click(); + $styleContainer.perfectScrollbar(); + } + + $(function() { + initCategories(); + initStyles(); + $window.resize(resizeLists); + resizeLists(); + }); +}).call(this); diff --git a/yknjs/highlight.js/demo/index.html b/yknjs/highlight.js/demo/index.html new file mode 100644 index 0000000..14becb4 --- /dev/null +++ b/yknjs/highlight.js/demo/index.html @@ -0,0 +1,55 @@ + + + + + + highlight.js demo + + + + + <% _.each(styles, function(style) { %> + + <% }); %> + + + + +
    + +
    + <% _.each(blobs, function(blob) { %> + <% var categories = blob.fileInfo.Category; %> +
    class="<%= categories.join(' ') %>"<% } %>> +

    <%- blob.fileInfo.Language %>

    +
    <%- blob.result %>
    +
    + <% }); %> +
    + +
    + + + + + + + diff --git a/yknjs/highlight.js/demo/jquery-2.1.1.min.js b/yknjs/highlight.js/demo/jquery-2.1.1.min.js new file mode 100644 index 0000000..e5ace11 --- /dev/null +++ b/yknjs/highlight.js/demo/jquery-2.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="
    ","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) +},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n(" diff --git a/yknjs/highlight.js/test/detect/xquery/default.txt b/yknjs/highlight.js/test/detect/xquery/default.txt new file mode 100644 index 0000000..392f42b --- /dev/null +++ b/yknjs/highlight.js/test/detect/xquery/default.txt @@ -0,0 +1,30 @@ +xquery version "3.1"; +(:~ + : @author Duncan Paterson + : @version 1.0:) + +declare variable $local:num := math:log10(12345); + +( +let $map := map { 'R': 'red', 'G': 'green', 'B': 'blue' } +return ( + $map?* (: 1. returns all values; same as: map:keys($map) ! $map(.) :), + $map?R (: 2. returns the value associated with the key 'R'; same as: $map('R') :), + $map?('G','B') (: 3. returns the values associated with the key 'G' and 'B' :) +), + +declare function local:city($country as node()*) as element (country) { +for $country in doc('factbook')//country +where $country/@population > 100000000 +let $name := $country/name[1] +for $city in $country//city[population gt 1000000] +group by $name +return + element country { attribute type { $name }, + $city/name } +}; + +return +('A', 'B', 'C') => count(), + +{local:city(.) + $local:num} diff --git a/yknjs/highlight.js/test/detect/yaml/default.txt b/yknjs/highlight.js/test/detect/yaml/default.txt new file mode 100644 index 0000000..49c4939 --- /dev/null +++ b/yknjs/highlight.js/test/detect/yaml/default.txt @@ -0,0 +1,39 @@ +--- +# comment +string_1: "Bar" +string_2: 'bar' +string_3: bar +inline_keys_ignored: sompath/name/file.jpg +keywords_in_yaml: + - true + - false + - TRUE + - FALSE + - 21 + - 21.0 + - !!str 123 +"quoted_key": &foobar + bar: foo + foo: + "foo": bar + +reference: *foobar + +multiline_1: | + Multiline + String +multiline_2: > + Multiline + String +multiline_3: " + Multiline string + " + +ansible_variables: "foo {{variable}}" + +array_nested: +- a +- b: 1 + c: 2 +- b +- comment diff --git a/yknjs/highlight.js/test/detect/zephir/default.txt b/yknjs/highlight.js/test/detect/zephir/default.txt new file mode 100644 index 0000000..8142e7f --- /dev/null +++ b/yknjs/highlight.js/test/detect/zephir/default.txt @@ -0,0 +1,55 @@ +function testBefore( a, var b = 5, int c = 10) +{ + a->method1(); + + return b + c; +} + +namespace Test; + +use RuntimeException as RE; + +/** + * Example comment + */ +class Test extends CustomClass implements TestInterface +{ + const C1 = null; + + // Magic constant: http://php.net/manual/ru/language.constants.predefined.php + const className = __CLASS__; + + public function method1() + { + int a = 1, b = 2; + return a + b; + } + + // See fn is allowed like shortcut + public fn method2() -> + { + call_user_func(function() { echo "hello"; }); + + + [1, 2, 3, 4, 5]->walk( + function(int! x) { + return x * x; + } + ); + + [1, 2, 3, 4, 5]->walk( + function(_, int key) { echo key; } + ); + + array input = [1, 2, 3, 4, 5]; + + input->walk( + function(_, int key) { echo key; } + ); + + + input->map(x => x * x); + + return this; + } +} diff --git a/yknjs/highlight.js/test/fixtures/expect/brInPre.txt b/yknjs/highlight.js/test/fixtures/expect/brInPre.txt new file mode 100644 index 0000000..e065147 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/brInPre.txt @@ -0,0 +1 @@ +>> '\x41\x42\x43'
    'ABC'


    >> '\x61\x62\x63'
    'abc' diff --git a/yknjs/highlight.js/test/fixtures/expect/custommarkup.txt b/yknjs/highlight.js/test/fixtures/expect/custommarkup.txt new file mode 100644 index 0000000..f0304c2 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/custommarkup.txt @@ -0,0 +1,3 @@ +<div id="contents"> + <p>Hello, World!Goodbye, cruel world! +</div> diff --git a/yknjs/highlight.js/test/fixtures/expect/customtabreplace.txt b/yknjs/highlight.js/test/fixtures/expect/customtabreplace.txt new file mode 100644 index 0000000..d217f1c --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/customtabreplace.txt @@ -0,0 +1,4 @@ +for x in [1, 2, 3]: + count(x) + if x == 3: + count(x + 1) \ No newline at end of file diff --git a/yknjs/highlight.js/test/fixtures/expect/endsWithParentVariants.txt b/yknjs/highlight.js/test/fixtures/expect/endsWithParentVariants.txt new file mode 100644 index 0000000..15d7617 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/endsWithParentVariants.txt @@ -0,0 +1 @@ +( [ ( ) ] ) diff --git a/yknjs/highlight.js/test/fixtures/expect/explicit1.txt b/yknjs/highlight.js/test/fixtures/expect/explicit1.txt new file mode 100644 index 0000000..59544c1 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/explicit1.txt @@ -0,0 +1,2 @@ +for x in [1, 2, 3]: + count(x) \ No newline at end of file diff --git a/yknjs/highlight.js/test/fixtures/expect/explicit2.txt b/yknjs/highlight.js/test/fixtures/expect/explicit2.txt new file mode 100644 index 0000000..1a49fda --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/explicit2.txt @@ -0,0 +1,2 @@ +@import "compass/reset"; +$colorGreenDark: darken($colorGreen, 10); diff --git a/yknjs/highlight.js/test/fixtures/expect/languagealias.txt b/yknjs/highlight.js/test/fixtures/expect/languagealias.txt new file mode 100644 index 0000000..571f200 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/languagealias.txt @@ -0,0 +1 @@ +var x = '<p>this should <b>not</b> be highlighted as <em>HTML</em>'; \ No newline at end of file diff --git a/yknjs/highlight.js/test/fixtures/expect/sublanguages.txt b/yknjs/highlight.js/test/fixtures/expect/sublanguages.txt new file mode 100644 index 0000000..2a89d6a --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/sublanguages.txt @@ -0,0 +1,4 @@ +<? echo 'php'; /* ?> */ ?> +<body> +<script>document.write('Legacy code');</script> +</body> diff --git a/yknjs/highlight.js/test/fixtures/expect/tabreplace.txt b/yknjs/highlight.js/test/fixtures/expect/tabreplace.txt new file mode 100644 index 0000000..01d1c57 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/tabreplace.txt @@ -0,0 +1,2 @@ +for x in [1, 2, 3]: + count(x) \ No newline at end of file diff --git a/yknjs/highlight.js/test/fixtures/expect/useBr.txt b/yknjs/highlight.js/test/fixtures/expect/useBr.txt new file mode 100644 index 0000000..7707a4c --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/expect/useBr.txt @@ -0,0 +1 @@ +<head>
    <meta charset="utf-8">
    <title></title>
    </head> diff --git a/yknjs/highlight.js/test/fixtures/index.html b/yknjs/highlight.js/test/fixtures/index.html new file mode 100644 index 0000000..aba3e89 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/index.html @@ -0,0 +1,146 @@ + + + + + highlight.js test + + +
    + + +
    for x in [1, 2, 3]:
    +  count(x)
    + + +
    for x in [1, 2, 3]:
    +  count(x)
    + + +
    for x in [1, 2, 3]:
    +  count(x)
    + + +
    @import "compass/reset";
    +$colorGreenDark: darken($colorGreen, 10);
    +
    + + +
    @import "compass/reset";
    +$colorGreenDark: darken($colorGreen, 10);
    +
    + +
    + +
    + + +
    for x in [1, 2, 3]:
    +	count(x)
    + + +
    <div id="contents">
    +  <p>Hello, World!Goodbye, cruel world!
    +</div>
    +
    + + +
    for x in [1, 2, 3]:
    +	count(x)
    +	if x == 3:
    +		count(x + 1)
    + + +
    >> '\x41\x42\x43'
    'ABC'


    >> '\x61\x62\x63'
    'abc' +
    + +
    + +
    + + +
    var x = '<p>this should <b>not</b> be highlighted as <em>HTML</em>';
    + +
    + +
    + + +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    +
    <div id="contents">
    +  <p>Hello, World!
    +</div>
    + + +
    Computer output
    + + +
    for x in [1, 2, 3]: count(x)
    + + +
    for x in [1, 2, 3]: count(x)
    + + +
    for x in [1, 2, 3]: count(x)
    + + +
    var x = 'foo';
    +
    var x = 'foo';
    + +
    + + +
    <? echo 'php'; /* ?> */ ?>
    +<body>
    +<script>document.write('Legacy code');</script>
    +</body>
    +
    + +
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + + +
    <?xml version="1.0"?>
    +    <response value="ok" xml:lang="en"></response>
    + +
    + +
    + +
    <head>
    <meta charset="utf-8">
    <title></title>
    </head>
    + +
    <head>
    + <meta charset="utf-8">
    + <title></title>
    +</head>
    + +
    <head>
    + <meta charset="utf-8">
    + <title></title>
    +</head>
    + +
    + +
    ( [ ( ) ] )
    + + + + diff --git a/yknjs/highlight.js/test/fixtures/nested.js b/yknjs/highlight.js/test/fixtures/nested.js new file mode 100644 index 0000000..81e17d3 --- /dev/null +++ b/yknjs/highlight.js/test/fixtures/nested.js @@ -0,0 +1,17 @@ +module.exports = function(hljs) { + var BODY = { + className: 'body', endsWithParent: true + }; + var LIST = { + className: 'list', + variants: [ + {begin: /\(/, end: /\)/}, + {begin: /\[/, end: /\]/} + ], + contains: [BODY] + }; + BODY.contains = [LIST]; + return { + contains: [LIST] + } +}; diff --git a/yknjs/highlight.js/test/index.js b/yknjs/highlight.js/test/index.js new file mode 100644 index 0000000..6f30fea --- /dev/null +++ b/yknjs/highlight.js/test/index.js @@ -0,0 +1,24 @@ +'use strict'; + +// Tests specific to the API exposed inside the hljs object. +// Right now, that only includes tests for several common regular expressions. +require('./api'); + +// Tests for auto detection of languages via `highlightAuto`. +require('./detect'); + +// HTML markup tests for particular languages. Usually when there is an +// incorrect highlighting of one language, once the bug get fixed, the +// expected markup will be added into the `test/markup` folder to keep +// theses highlighting errors from cropping up again. +require('./markup'); + +// Tests meant for the browser only. Using the `test/fixtures/index.html` file +// along with `jsdom` these tests check for things like: custom markup already +// existing in the code being highlighted, blocks that disable highlighting, +// and several other cases. Do note that the `test/fixtures/index.html` file +// isn't actually used to test inside a browser but `jsdom` acts as a virtual +// browser inside of node.js and runs together with all the other tests. +require('./special'); + +require("./tools"); diff --git a/yknjs/highlight.js/test/markup/accesslog/default.expect.txt b/yknjs/highlight.js/test/markup/accesslog/default.expect.txt new file mode 100644 index 0000000..4e4dc30 --- /dev/null +++ b/yknjs/highlight.js/test/markup/accesslog/default.expect.txt @@ -0,0 +1 @@ +20.164.151.111 - - [20/Aug/2015:22:20:18 -0400] "GET /mywebpage/index.php HTTP/1.1" 403 772 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1" diff --git a/yknjs/highlight.js/test/markup/accesslog/default.txt b/yknjs/highlight.js/test/markup/accesslog/default.txt new file mode 100644 index 0000000..a9d4325 --- /dev/null +++ b/yknjs/highlight.js/test/markup/accesslog/default.txt @@ -0,0 +1 @@ +20.164.151.111 - - [20/Aug/2015:22:20:18 -0400] "GET /mywebpage/index.php HTTP/1.1" 403 772 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1" diff --git a/yknjs/highlight.js/test/markup/actionscript/method-call.expect.txt b/yknjs/highlight.js/test/markup/actionscript/method-call.expect.txt new file mode 100644 index 0000000..752a397 --- /dev/null +++ b/yknjs/highlight.js/test/markup/actionscript/method-call.expect.txt @@ -0,0 +1 @@ +x.get(0); diff --git a/yknjs/highlight.js/test/markup/actionscript/method-call.txt b/yknjs/highlight.js/test/markup/actionscript/method-call.txt new file mode 100644 index 0000000..1449787 --- /dev/null +++ b/yknjs/highlight.js/test/markup/actionscript/method-call.txt @@ -0,0 +1 @@ +x.get(0); diff --git a/yknjs/highlight.js/test/markup/arcade/profile.expect.txt b/yknjs/highlight.js/test/markup/arcade/profile.expect.txt new file mode 100644 index 0000000..e7ace43 --- /dev/null +++ b/yknjs/highlight.js/test/markup/arcade/profile.expect.txt @@ -0,0 +1,9 @@ +/* + Isolated test for the most recent version +*/ +function offsetPopulation(offset){ + var popDensity = Round( $feature.POPULATION / AreaGeodetic(Geometry($feature), "square-kilometers") ); + var geom = Geometry({ 'x': offset.x, 'y': offset.y, 'spatialReference':{'wkid':102100} }); + var myLayer = FeatureSet($map, ["POPULATION", "ELECTION-DATA"]); + return popDensity; +} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/arcade/profile.txt b/yknjs/highlight.js/test/markup/arcade/profile.txt new file mode 100644 index 0000000..b4f54b0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/arcade/profile.txt @@ -0,0 +1,9 @@ +/* + Isolated test for the most recent version +*/ +function offsetPopulation(offset){ + var popDensity = Round( $feature.POPULATION / AreaGeodetic(Geometry($feature), "square-kilometers") ); + var geom = Geometry({ 'x': offset.x, 'y': offset.y, 'spatialReference':{'wkid':102100} }); + var myLayer = FeatureSet($map, ["POPULATION", "ELECTION-DATA"]); + return popDensity; +} diff --git a/yknjs/highlight.js/test/markup/aspectj/intertype-constructor.expect.txt b/yknjs/highlight.js/test/markup/aspectj/intertype-constructor.expect.txt new file mode 100644 index 0000000..9cfa198 --- /dev/null +++ b/yknjs/highlight.js/test/markup/aspectj/intertype-constructor.expect.txt @@ -0,0 +1,3 @@ +public MyClass.new() throws Exception{ + // intertype constructor body +} diff --git a/yknjs/highlight.js/test/markup/aspectj/intertype-constructor.txt b/yknjs/highlight.js/test/markup/aspectj/intertype-constructor.txt new file mode 100644 index 0000000..0199ef9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/aspectj/intertype-constructor.txt @@ -0,0 +1,3 @@ +public MyClass.new() throws Exception{ + // intertype constructor body +} diff --git a/yknjs/highlight.js/test/markup/aspectj/intertype-method.expect.txt b/yknjs/highlight.js/test/markup/aspectj/intertype-method.expect.txt new file mode 100644 index 0000000..09b1c54 --- /dev/null +++ b/yknjs/highlight.js/test/markup/aspectj/intertype-method.expect.txt @@ -0,0 +1,6 @@ +public void MyClass.doSomething() throws Exception{ + // intertype method body +} +public void A.doSomething(int param1){ + // intertype method body +} diff --git a/yknjs/highlight.js/test/markup/aspectj/intertype-method.txt b/yknjs/highlight.js/test/markup/aspectj/intertype-method.txt new file mode 100644 index 0000000..99787a0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/aspectj/intertype-method.txt @@ -0,0 +1,6 @@ +public void MyClass.doSomething() throws Exception{ + // intertype method body +} +public void A.doSomething(int param1){ + // intertype method body +} diff --git a/yknjs/highlight.js/test/markup/bash/no-numbers.expect.txt b/yknjs/highlight.js/test/markup/bash/no-numbers.expect.txt new file mode 100644 index 0000000..33fc753 --- /dev/null +++ b/yknjs/highlight.js/test/markup/bash/no-numbers.expect.txt @@ -0,0 +1,3 @@ +# numbers aren't highlighted in bash as their semantics is +# not strictly defined for command line parameters +$ tail -10 access.log diff --git a/yknjs/highlight.js/test/markup/bash/no-numbers.txt b/yknjs/highlight.js/test/markup/bash/no-numbers.txt new file mode 100644 index 0000000..8e94063 --- /dev/null +++ b/yknjs/highlight.js/test/markup/bash/no-numbers.txt @@ -0,0 +1,3 @@ +# numbers aren't highlighted in bash as their semantics is +# not strictly defined for command line parameters +$ tail -10 access.log diff --git a/yknjs/highlight.js/test/markup/ceylon/nested-comments.expect.txt b/yknjs/highlight.js/test/markup/ceylon/nested-comments.expect.txt new file mode 100644 index 0000000..85c529d --- /dev/null +++ b/yknjs/highlight.js/test/markup/ceylon/nested-comments.expect.txt @@ -0,0 +1,5 @@ +/* + /* + Ceylon has nested comments. + */ + */ diff --git a/yknjs/highlight.js/test/markup/ceylon/nested-comments.txt b/yknjs/highlight.js/test/markup/ceylon/nested-comments.txt new file mode 100644 index 0000000..39b49eb --- /dev/null +++ b/yknjs/highlight.js/test/markup/ceylon/nested-comments.txt @@ -0,0 +1,5 @@ +/* + /* + Ceylon has nested comments. + */ + */ diff --git a/yknjs/highlight.js/test/markup/clojure-repl/prompt.expect.txt b/yknjs/highlight.js/test/markup/clojure-repl/prompt.expect.txt new file mode 100644 index 0000000..ee50199 --- /dev/null +++ b/yknjs/highlight.js/test/markup/clojure-repl/prompt.expect.txt @@ -0,0 +1,2 @@ +user=> +=> diff --git a/yknjs/highlight.js/test/markup/clojure-repl/prompt.txt b/yknjs/highlight.js/test/markup/clojure-repl/prompt.txt new file mode 100644 index 0000000..a410dda --- /dev/null +++ b/yknjs/highlight.js/test/markup/clojure-repl/prompt.txt @@ -0,0 +1,2 @@ +user=> +=> diff --git a/yknjs/highlight.js/test/markup/clojure/hint_col.expect.txt b/yknjs/highlight.js/test/markup/clojure/hint_col.expect.txt new file mode 100644 index 0000000..06e96c0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/clojure/hint_col.expect.txt @@ -0,0 +1,34 @@ +(import [java.lang.annotation Retention RetentionPolicy Target ElementType] + [javax.xml.ws WebServiceRef WebServiceRefs]) + +(definterface Foo (foo [])) + +;; annotation on type +(deftype ^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + Bar [^int a + ;; on field + ^{:tag int + Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + b] + ;; on method + Foo (^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + foo [this] 42)) + +(seq (.getAnnotations Bar)) +(seq (.getAnnotations (.getField Bar "b"))) +(seq (.getAnnotations (.getMethod Bar "foo" nil))) diff --git a/yknjs/highlight.js/test/markup/clojure/hint_col.txt b/yknjs/highlight.js/test/markup/clojure/hint_col.txt new file mode 100644 index 0000000..9584dec --- /dev/null +++ b/yknjs/highlight.js/test/markup/clojure/hint_col.txt @@ -0,0 +1,34 @@ +(import [java.lang.annotation Retention RetentionPolicy Target ElementType] + [javax.xml.ws WebServiceRef WebServiceRefs]) + +(definterface Foo (foo [])) + +;; annotation on type +(deftype ^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + Bar [^int a + ;; on field + ^{:tag int + Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + b] + ;; on method + Foo (^{Deprecated true + Retention RetentionPolicy/RUNTIME + javax.annotation.processing.SupportedOptions ["foo" "bar" "baz"] + javax.xml.ws.soap.Addressing {:enabled false :required true} + WebServiceRefs [(WebServiceRef {:name "fred" :type String}) + (WebServiceRef {:name "ethel" :mappedName "lucy"})]} + foo [this] 42)) + +(seq (.getAnnotations Bar)) +(seq (.getAnnotations (.getField Bar "b"))) +(seq (.getAnnotations (.getMethod Bar "foo" nil))) diff --git a/yknjs/highlight.js/test/markup/clojure/symbols-numbers.expect.txt b/yknjs/highlight.js/test/markup/clojure/symbols-numbers.expect.txt new file mode 100644 index 0000000..f9c48b2 --- /dev/null +++ b/yknjs/highlight.js/test/markup/clojure/symbols-numbers.expect.txt @@ -0,0 +1 @@ +(def +x [(a 1) +2 -3.0 y-5]) diff --git a/yknjs/highlight.js/test/markup/clojure/symbols-numbers.txt b/yknjs/highlight.js/test/markup/clojure/symbols-numbers.txt new file mode 100644 index 0000000..01e839b --- /dev/null +++ b/yknjs/highlight.js/test/markup/clojure/symbols-numbers.txt @@ -0,0 +1 @@ +(def +x [(a 1) +2 -3.0 y-5]) diff --git a/yknjs/highlight.js/test/markup/coffeescript/division.expect.txt b/yknjs/highlight.js/test/markup/coffeescript/division.expect.txt new file mode 100644 index 0000000..28a9dfa --- /dev/null +++ b/yknjs/highlight.js/test/markup/coffeescript/division.expect.txt @@ -0,0 +1,8 @@ +# Divisions +x = 6/foo/i +x = 6 /foo +x = 6 / foo +x = 6 /foo * 2/gm +x = f /foo +x = f / foo / gm +x = f /foo * 2/6 diff --git a/yknjs/highlight.js/test/markup/coffeescript/division.txt b/yknjs/highlight.js/test/markup/coffeescript/division.txt new file mode 100644 index 0000000..483fa56 --- /dev/null +++ b/yknjs/highlight.js/test/markup/coffeescript/division.txt @@ -0,0 +1,8 @@ +# Divisions +x = 6/foo/i +x = 6 /foo +x = 6 / foo +x = 6 /foo * 2/gm +x = f /foo +x = f / foo / gm +x = f /foo * 2/6 diff --git a/yknjs/highlight.js/test/markup/coffeescript/function.expect.txt b/yknjs/highlight.js/test/markup/coffeescript/function.expect.txt new file mode 100644 index 0000000..0c4f8af --- /dev/null +++ b/yknjs/highlight.js/test/markup/coffeescript/function.expect.txt @@ -0,0 +1,14 @@ +returnNull = -> null +returnTrue = () -> true +square = (x) -> x * x + +npmWishlist.sha256 = (str) -> + throw new Error() + +str.split(" ").map((m) -> m.charCodeAt(0)) + +fs.readFile("package.json", "utf-8", (err, content) -> + data = JSON.parse(content) + + data.version +) diff --git a/yknjs/highlight.js/test/markup/coffeescript/function.txt b/yknjs/highlight.js/test/markup/coffeescript/function.txt new file mode 100644 index 0000000..d76f3b9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/coffeescript/function.txt @@ -0,0 +1,14 @@ +returnNull = -> null +returnTrue = () -> true +square = (x) -> x * x + +npmWishlist.sha256 = (str) -> + throw new Error() + +str.split(" ").map((m) -> m.charCodeAt(0)) + +fs.readFile("package.json", "utf-8", (err, content) -> + data = JSON.parse(content) + + data.version +) diff --git a/yknjs/highlight.js/test/markup/coffeescript/regex.expect.txt b/yknjs/highlight.js/test/markup/coffeescript/regex.expect.txt new file mode 100644 index 0000000..51c3f9c --- /dev/null +++ b/yknjs/highlight.js/test/markup/coffeescript/regex.expect.txt @@ -0,0 +1,8 @@ +# Regexps +x = /\// +x = /\n/ +x = /ab\/ ab/ +x = f /6 * 2/ - 3 +x = f /foo * 2/gm +x = if true then /\n/ else /[.,]+/ +x = ///^key-#{key}-\d+/// diff --git a/yknjs/highlight.js/test/markup/coffeescript/regex.txt b/yknjs/highlight.js/test/markup/coffeescript/regex.txt new file mode 100644 index 0000000..e62a0fc --- /dev/null +++ b/yknjs/highlight.js/test/markup/coffeescript/regex.txt @@ -0,0 +1,8 @@ +# Regexps +x = /\// +x = /\n/ +x = /ab\/ ab/ +x = f /6 * 2/ - 3 +x = f /foo * 2/gm +x = if true then /\n/ else /[.,]+/ +x = ///^key-#{key}-\d+/// diff --git a/yknjs/highlight.js/test/markup/cos/basic.expect.txt b/yknjs/highlight.js/test/markup/cos/basic.expect.txt new file mode 100644 index 0000000..e26474f --- /dev/null +++ b/yknjs/highlight.js/test/markup/cos/basic.expect.txt @@ -0,0 +1,7 @@ +SET test = 1 +set ^global = 2 +Write "Current date """, $ztimestamp, """, result: ", test + ^global = 3 +if (^global = 2) { + do ##class(Cinema.Utils).AddShow("test") // line comment +} +d:(^global = 2) ..thisClassMethod(1, 2, "test") diff --git a/yknjs/highlight.js/test/markup/cos/basic.txt b/yknjs/highlight.js/test/markup/cos/basic.txt new file mode 100644 index 0000000..97e0328 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cos/basic.txt @@ -0,0 +1,7 @@ +SET test = 1 +set ^global = 2 +Write "Current date """, $ztimestamp, """, result: ", test + ^global = 3 +if (^global = 2) { + do ##class(Cinema.Utils).AddShow("test") // line comment +} +d:(^global = 2) ..thisClassMethod(1, 2, "test") diff --git a/yknjs/highlight.js/test/markup/cos/embedded.expect.txt b/yknjs/highlight.js/test/markup/cos/embedded.expect.txt new file mode 100644 index 0000000..d070b70 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cos/embedded.expect.txt @@ -0,0 +1,5 @@ +/* + * Multiline comment + */ +&sql(SELECT * FROM Cinema.Film WHERE Length > 2) +&js<for (var i = 0; i < String("test").split("").length); ++i) { console.log(i); }> diff --git a/yknjs/highlight.js/test/markup/cos/embedded.txt b/yknjs/highlight.js/test/markup/cos/embedded.txt new file mode 100644 index 0000000..1f0c3e1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cos/embedded.txt @@ -0,0 +1,5 @@ +/* + * Multiline comment + */ +&sql(SELECT * FROM Cinema.Film WHERE Length > 2) +&js diff --git a/yknjs/highlight.js/test/markup/cpp/expression-keywords.expect.txt b/yknjs/highlight.js/test/markup/cpp/expression-keywords.expect.txt new file mode 100644 index 0000000..4fb7c52 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/expression-keywords.expect.txt @@ -0,0 +1,2 @@ +double x = exp(log(2)); // recognize built-ins +return 0; // recognize keyword that started the expression diff --git a/yknjs/highlight.js/test/markup/cpp/expression-keywords.txt b/yknjs/highlight.js/test/markup/cpp/expression-keywords.txt new file mode 100644 index 0000000..93b0cff --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/expression-keywords.txt @@ -0,0 +1,2 @@ +double x = exp(log(2)); // recognize built-ins +return 0; // recognize keyword that started the expression diff --git a/yknjs/highlight.js/test/markup/cpp/function-params.expect.txt b/yknjs/highlight.js/test/markup/cpp/function-params.expect.txt new file mode 100644 index 0000000..a388045 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/function-params.expect.txt @@ -0,0 +1,7 @@ +int f( + int a = 1, + char* b = "2", // Line comment + double c = 3.0, /* Block comment */ + ARRAY(int, 5) d, + void* e __attribute__((unused)) +); diff --git a/yknjs/highlight.js/test/markup/cpp/function-params.txt b/yknjs/highlight.js/test/markup/cpp/function-params.txt new file mode 100644 index 0000000..6053675 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/function-params.txt @@ -0,0 +1,7 @@ +int f( + int a = 1, + char* b = "2", // Line comment + double c = 3.0, /* Block comment */ + ARRAY(int, 5) d, + void* e __attribute__((unused)) +); diff --git a/yknjs/highlight.js/test/markup/cpp/function-title.expect.txt b/yknjs/highlight.js/test/markup/cpp/function-title.expect.txt new file mode 100644 index 0000000..750081e --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/function-title.expect.txt @@ -0,0 +1,9 @@ +int main() { + A a = new A(); + int b = b * sum(1, 2); + if (a->check1()) + return 3; + else if (a->check2()) + return 4; + return a->result(); +} diff --git a/yknjs/highlight.js/test/markup/cpp/function-title.txt b/yknjs/highlight.js/test/markup/cpp/function-title.txt new file mode 100644 index 0000000..74c810a --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/function-title.txt @@ -0,0 +1,9 @@ +int main() { + A a = new A(); + int b = b * sum(1, 2); + if (a->check1()) + return 3; + else if (a->check2()) + return 4; + return a->result(); +} diff --git a/yknjs/highlight.js/test/markup/cpp/number-literals.expect.txt b/yknjs/highlight.js/test/markup/cpp/number-literals.expect.txt new file mode 100644 index 0000000..09e2d5a --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/number-literals.expect.txt @@ -0,0 +1,6 @@ +/* digit separators */ +int number = 2'555'555'555; // digit separators +float exponentFloat = .123'456e3'000; // digit separators in floats +float suffixed = 3.000'001'234f // digit separators in suffixed numbers +char word[] = { '3', '\0' }; // make sure digit separators don't mess up chars +float negative = -123.0f; // negative floating point numbers diff --git a/yknjs/highlight.js/test/markup/cpp/number-literals.txt b/yknjs/highlight.js/test/markup/cpp/number-literals.txt new file mode 100644 index 0000000..ec02e50 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/number-literals.txt @@ -0,0 +1,6 @@ +/* digit separators */ +int number = 2'555'555'555; // digit separators +float exponentFloat = .123'456e3'000; // digit separators in floats +float suffixed = 3.000'001'234f // digit separators in suffixed numbers +char word[] = { '3', '\0' }; // make sure digit separators don't mess up chars +float negative = -123.0f; // negative floating point numbers diff --git a/yknjs/highlight.js/test/markup/cpp/pointers-returns.expect.txt b/yknjs/highlight.js/test/markup/cpp/pointers-returns.expect.txt new file mode 100644 index 0000000..a2333fe --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/pointers-returns.expect.txt @@ -0,0 +1,4 @@ +// These will all work: +char** foo_bar(); +char ** foo_bar(); +char **foo_bar(); diff --git a/yknjs/highlight.js/test/markup/cpp/pointers-returns.txt b/yknjs/highlight.js/test/markup/cpp/pointers-returns.txt new file mode 100644 index 0000000..f56cc4a --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/pointers-returns.txt @@ -0,0 +1,4 @@ +// These will all work: +char** foo_bar(); +char ** foo_bar(); +char **foo_bar(); diff --git a/yknjs/highlight.js/test/markup/cpp/preprocessor.expect.txt b/yknjs/highlight.js/test/markup/cpp/preprocessor.expect.txt new file mode 100644 index 0000000..62fff51 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/preprocessor.expect.txt @@ -0,0 +1,13 @@ +#include <iostream> +#define foo 1<<16 + +#ifdef DEBUG +TYPE1 foo(void) +#else +int foo(void) +#endif +{ } + +#define x(v) ((v)) +# define x(v) ((v)) +# define x(v) ((v)) diff --git a/yknjs/highlight.js/test/markup/cpp/preprocessor.txt b/yknjs/highlight.js/test/markup/cpp/preprocessor.txt new file mode 100644 index 0000000..b1ad6a6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/preprocessor.txt @@ -0,0 +1,13 @@ +#include +#define foo 1<<16 + +#ifdef DEBUG +TYPE1 foo(void) +#else +int foo(void) +#endif +{ } + +#define x(v) ((v)) +# define x(v) ((v)) +# define x(v) ((v)) diff --git a/yknjs/highlight.js/test/markup/cpp/primitive-types.expect.txt b/yknjs/highlight.js/test/markup/cpp/primitive-types.expect.txt new file mode 100644 index 0000000..1ab0047 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/primitive-types.expect.txt @@ -0,0 +1,3 @@ +const uint64_t MAX_INT_64; + +struct position_tag; diff --git a/yknjs/highlight.js/test/markup/cpp/primitive-types.txt b/yknjs/highlight.js/test/markup/cpp/primitive-types.txt new file mode 100644 index 0000000..86f1167 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/primitive-types.txt @@ -0,0 +1,3 @@ +const uint64_t MAX_INT_64; + +struct position_tag; diff --git a/yknjs/highlight.js/test/markup/cpp/string-literals.expect.txt b/yknjs/highlight.js/test/markup/cpp/string-literals.expect.txt new file mode 100644 index 0000000..4c5baca --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/string-literals.expect.txt @@ -0,0 +1,56 @@ +// Unicode literals +auto str = "Hello regular string"; +auto utf8 = u8"Hello utf-8 string"; +auto utf16 = u"Hello utf-16 string"; +auto utf32 = U"Hello utf-32 string"; + +// Wide-character strings +auto wide_char = L"Hello wchar_t string"; + +// Raw string literals (multiline) +auto char_multi = R"(Hello +"normal" +multiline +string.)"; +auto utf8_multi = u8R"(Hello +"utf-8" +multiline +string)"; +auto utf16_multi = uR"(Hello +"utf-16" +multiline +string)"; +auto utf32_multi = UR"(Hello +"utf-32" +multiline +string)"; + +// Raw string literals with delimiter (multiline) +auto char_multi = R"blah1(Hello +"normal" +multiline +)" +)blah" +string.)blah1"; +auto utf8_multi = u8R"blah2(Hello +"utf-8" +multiline +)" +)blah" +string)blah2"; +auto utf16_multi = uR"blah3(Hello +"utf-16" +multiline +)" +)blah" +string)blah3"; +auto utf32_multi = UR"blah4(Hello +"utf-32" +multiline +)" +)blah" +string)blah4"; + +// Meta strings +#include <stdio> +#include "lib.h" diff --git a/yknjs/highlight.js/test/markup/cpp/string-literals.txt b/yknjs/highlight.js/test/markup/cpp/string-literals.txt new file mode 100644 index 0000000..9939edb --- /dev/null +++ b/yknjs/highlight.js/test/markup/cpp/string-literals.txt @@ -0,0 +1,56 @@ +// Unicode literals +auto str = "Hello regular string"; +auto utf8 = u8"Hello utf-8 string"; +auto utf16 = u"Hello utf-16 string"; +auto utf32 = U"Hello utf-32 string"; + +// Wide-character strings +auto wide_char = L"Hello wchar_t string"; + +// Raw string literals (multiline) +auto char_multi = R"(Hello +"normal" +multiline +string.)"; +auto utf8_multi = u8R"(Hello +"utf-8" +multiline +string)"; +auto utf16_multi = uR"(Hello +"utf-16" +multiline +string)"; +auto utf32_multi = UR"(Hello +"utf-32" +multiline +string)"; + +// Raw string literals with delimiter (multiline) +auto char_multi = R"blah1(Hello +"normal" +multiline +)" +)blah" +string.)blah1"; +auto utf8_multi = u8R"blah2(Hello +"utf-8" +multiline +)" +)blah" +string)blah2"; +auto utf16_multi = uR"blah3(Hello +"utf-16" +multiline +)" +)blah" +string)blah3"; +auto utf32_multi = UR"blah4(Hello +"utf-32" +multiline +)" +)blah" +string)blah4"; + +// Meta strings +#include +#include "lib.h" diff --git a/yknjs/highlight.js/test/markup/crystal/literals.expect.txt b/yknjs/highlight.js/test/markup/crystal/literals.expect.txt new file mode 100644 index 0000000..46d8aef --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/literals.expect.txt @@ -0,0 +1,98 @@ +nil +true +false + +1 + +1_i8 +1_i16 +1_i32 +1_i64 +1_i128 + +1_u8 +1_u16 +1_u32 +1_u64 + ++10 +-20 + +2147483648 +9223372036854775808 + +1_000_000 + +0b1101 + +0o123 + +0xFE012D +0xfe012d + +1_f64 +1.0 +1.0_f32 +1_f32 + +1e10 +1e10_f64 +1.5e10 +1.5e-7 + ++1.3 +-0.5 + +1_000_000.111_111 +1_000_000.111_111e12 + +'c' +'\\' +'\u{ABCD}' + +"string" +"\u{48 45 4C 4C 4F}" +"interpolated #{string}" +"interpolated #{"string"}" +%(string) +%q(string) +%Q(string) +%(hello ("world")) +%[hello ["world"]] +%{hello {"world"}} +%<hello <"world">> +%|hello "world"| +"hello + world" +"hello \ + world, \ + no newlines" +<<-STRING + Hello world + STRING + +<<-'HERE' + hello \n + HERE + +:unquoted_symbol +:"quoted symbol" +:question? +:exclamation! +:+ + +%i(foo(bar) baz) +%w(one two three) + +/foo|bar/ +/h(e+)llo/ +/\d+/ +/あ/ + +%r((/)) +%r[[/]] +%r{{/}} +%r<</>> +%r|/| + +`echo foo > foo.txt` diff --git a/yknjs/highlight.js/test/markup/crystal/literals.txt b/yknjs/highlight.js/test/markup/crystal/literals.txt new file mode 100644 index 0000000..9de2fed --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/literals.txt @@ -0,0 +1,98 @@ +nil +true +false + +1 + +1_i8 +1_i16 +1_i32 +1_i64 +1_i128 + +1_u8 +1_u16 +1_u32 +1_u64 + ++10 +-20 + +2147483648 +9223372036854775808 + +1_000_000 + +0b1101 + +0o123 + +0xFE012D +0xfe012d + +1_f64 +1.0 +1.0_f32 +1_f32 + +1e10 +1e10_f64 +1.5e10 +1.5e-7 + ++1.3 +-0.5 + +1_000_000.111_111 +1_000_000.111_111e12 + +'c' +'\\' +'\u{ABCD}' + +"string" +"\u{48 45 4C 4C 4F}" +"interpolated #{string}" +"interpolated #{"string"}" +%(string) +%q(string) +%Q(string) +%(hello ("world")) +%[hello ["world"]] +%{hello {"world"}} +%> +%|hello "world"| +"hello + world" +"hello \ + world, \ + no newlines" +<<-STRING + Hello world + STRING + +<<-'HERE' + hello \n + HERE + +:unquoted_symbol +:"quoted symbol" +:question? +:exclamation! +:+ + +%i(foo(bar) baz) +%w(one two three) + +/foo|bar/ +/h(e+)llo/ +/\d+/ +/あ/ + +%r((/)) +%r[[/]] +%r{{/}} +%r<> +%r|/| + +`echo foo > foo.txt` diff --git a/yknjs/highlight.js/test/markup/crystal/macro.expect.txt b/yknjs/highlight.js/test/markup/crystal/macro.expect.txt new file mode 100644 index 0000000..38b2447 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/macro.expect.txt @@ -0,0 +1,9 @@ +puts {{ "hello world" }} + +{% verbatim %}{{ "bla".id }}{% end %} + +macro foo + {% verbatim %} + {{ "bla".id }} + {% end %} +end diff --git a/yknjs/highlight.js/test/markup/crystal/macro.txt b/yknjs/highlight.js/test/markup/crystal/macro.txt new file mode 100644 index 0000000..1039545 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/macro.txt @@ -0,0 +1,9 @@ +puts {{ "hello world" }} + +{% verbatim %}{{ "bla".id }}{% end %} + +macro foo + {% verbatim %} + {{ "bla".id }} + {% end %} +end diff --git a/yknjs/highlight.js/test/markup/crystal/operators.expect.txt b/yknjs/highlight.js/test/markup/crystal/operators.expect.txt new file mode 100644 index 0000000..cd70109 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/operators.expect.txt @@ -0,0 +1,34 @@ ++ +- +* +% +& +| +^ +** +<< +>> +== +!= +< +<= +> +>= +<=> +=== +// +//= +&+ +&- +&* +&** +&+= +&-= +&*= +! +~ +[] +[]? +[]= +/ + diff --git a/yknjs/highlight.js/test/markup/crystal/operators.txt b/yknjs/highlight.js/test/markup/crystal/operators.txt new file mode 100644 index 0000000..80bac44 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/operators.txt @@ -0,0 +1,33 @@ ++ +- +* +% +& +| +^ +** +<< +>> +== +!= +< +<= +> +>= +<=> +=== +// +//= +&+ +&- +&* +&** +&+= +&-= +&*= +! +~ +[] +[]? +[]= +/ diff --git a/yknjs/highlight.js/test/markup/crystal/regexes.expect.txt b/yknjs/highlight.js/test/markup/crystal/regexes.expect.txt new file mode 100644 index 0000000..5c93fd3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/regexes.expect.txt @@ -0,0 +1,12 @@ +if /foo/ +unless /foo/ +case /foo/ +select /foo/ +when /foo/ +while /foo/ +until /foo/ ++/foo/ + +# NG +xif /foo/ +ifx /foo/ diff --git a/yknjs/highlight.js/test/markup/crystal/regexes.txt b/yknjs/highlight.js/test/markup/crystal/regexes.txt new file mode 100644 index 0000000..409627a --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/regexes.txt @@ -0,0 +1,12 @@ +if /foo/ +unless /foo/ +case /foo/ +select /foo/ +when /foo/ +while /foo/ +until /foo/ ++/foo/ + +# NG +xif /foo/ +ifx /foo/ diff --git a/yknjs/highlight.js/test/markup/crystal/toplevel-keywords.expect.txt b/yknjs/highlight.js/test/markup/crystal/toplevel-keywords.expect.txt new file mode 100644 index 0000000..7583a10 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/toplevel-keywords.expect.txt @@ -0,0 +1,4 @@ +class Foo; end +struct Bar; end + +annotation JSON::Field; end diff --git a/yknjs/highlight.js/test/markup/crystal/toplevel-keywords.txt b/yknjs/highlight.js/test/markup/crystal/toplevel-keywords.txt new file mode 100644 index 0000000..4ca49d4 --- /dev/null +++ b/yknjs/highlight.js/test/markup/crystal/toplevel-keywords.txt @@ -0,0 +1,4 @@ +class Foo; end +struct Bar; end + +annotation JSON::Field; end diff --git a/yknjs/highlight.js/test/markup/cs/dotted-namespace.expect.txt b/yknjs/highlight.js/test/markup/cs/dotted-namespace.expect.txt new file mode 100644 index 0000000..96108bd --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/dotted-namespace.expect.txt @@ -0,0 +1,6 @@ +namespace Dotted.Namespace +{ + class MyClass + { + } +} diff --git a/yknjs/highlight.js/test/markup/cs/dotted-namespace.txt b/yknjs/highlight.js/test/markup/cs/dotted-namespace.txt new file mode 100644 index 0000000..68356f8 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/dotted-namespace.txt @@ -0,0 +1,6 @@ +namespace Dotted.Namespace +{ + class MyClass + { + } +} diff --git a/yknjs/highlight.js/test/markup/cs/floats.expect.txt b/yknjs/highlight.js/test/markup/cs/floats.expect.txt new file mode 100644 index 0000000..7935858 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/floats.expect.txt @@ -0,0 +1,4 @@ +float test = 1.0f; +float test2 = 1.f; +float test3 = 1.0; +float test4 = 1; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/cs/floats.txt b/yknjs/highlight.js/test/markup/cs/floats.txt new file mode 100644 index 0000000..777bfc9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/floats.txt @@ -0,0 +1,4 @@ +float test = 1.0f; +float test2 = 1.f; +float test3 = 1.0; +float test4 = 1; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/cs/functions.expect.txt b/yknjs/highlight.js/test/markup/cs/functions.expect.txt new file mode 100644 index 0000000..7546f94 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/functions.expect.txt @@ -0,0 +1,16 @@ +public void ExampleFunction1() { +} + +public void ExampleFunction2() +{ +} + +void ExampleFunctionDeclaration1(); + +void ExampleFunctionDeclaration2() +; + +public string ExampleExpressionBodiedFunction1() => "dummy"; + +public string ExampleExpressionBodiedFunction2() + => "dummy"; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/cs/functions.txt b/yknjs/highlight.js/test/markup/cs/functions.txt new file mode 100644 index 0000000..e370c2a --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/functions.txt @@ -0,0 +1,16 @@ +public void ExampleFunction1() { +} + +public void ExampleFunction2() +{ +} + +void ExampleFunctionDeclaration1(); + +void ExampleFunctionDeclaration2() +; + +public string ExampleExpressionBodiedFunction1() => "dummy"; + +public string ExampleExpressionBodiedFunction2() + => "dummy"; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/cs/string-interpolation.expect.txt b/yknjs/highlight.js/test/markup/cs/string-interpolation.expect.txt new file mode 100644 index 0000000..65e754a --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/string-interpolation.expect.txt @@ -0,0 +1,9 @@ +var istr = $"{{Hello}},\n{$"\"{nested}\"" + @" and " + $@"""{nested}""" /*comments*/ }"; +var ivstr = $@"{{Hello}}, +{ +$"\"{nested}\"" + @" +and +" + $@" +""{nested}"" +" +/*comments*/ }"; diff --git a/yknjs/highlight.js/test/markup/cs/string-interpolation.txt b/yknjs/highlight.js/test/markup/cs/string-interpolation.txt new file mode 100644 index 0000000..42e1e95 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/string-interpolation.txt @@ -0,0 +1,9 @@ +var istr = $"{{Hello}},\n{$"\"{nested}\"" + @" and " + $@"""{nested}""" /*comments*/ }"; +var ivstr = $@"{{Hello}}, +{ +$"\"{nested}\"" + @" +and +" + $@" +""{nested}"" +" +/*comments*/ }"; diff --git a/yknjs/highlight.js/test/markup/cs/titles.expect.txt b/yknjs/highlight.js/test/markup/cs/titles.expect.txt new file mode 100644 index 0000000..185cb34 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/titles.expect.txt @@ -0,0 +1,19 @@ +namespace Foo // namespace +{ + public class Greet : Base, Other // class + { + public Greet(string who) // function + { + Who = who; + } + + int[] f(int val = 0) + { + new Type(); + return getType(); + throw getError(); + await Stuff(); + } + } + +} diff --git a/yknjs/highlight.js/test/markup/cs/titles.txt b/yknjs/highlight.js/test/markup/cs/titles.txt new file mode 100644 index 0000000..ee1d815 --- /dev/null +++ b/yknjs/highlight.js/test/markup/cs/titles.txt @@ -0,0 +1,19 @@ +namespace Foo // namespace +{ + public class Greet : Base, Other // class + { + public Greet(string who) // function + { + Who = who; + } + + int[] f(int val = 0) + { + new Type(); + return getType(); + throw getError(); + await Stuff(); + } + } + +} diff --git a/yknjs/highlight.js/test/markup/css/pseudo-selector.expect.txt b/yknjs/highlight.js/test/markup/css/pseudo-selector.expect.txt new file mode 100644 index 0000000..0749771 --- /dev/null +++ b/yknjs/highlight.js/test/markup/css/pseudo-selector.expect.txt @@ -0,0 +1,2 @@ +li:not(.red){} +li:not(.red):not(.green){} diff --git a/yknjs/highlight.js/test/markup/css/pseudo-selector.txt b/yknjs/highlight.js/test/markup/css/pseudo-selector.txt new file mode 100644 index 0000000..4508da1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/css/pseudo-selector.txt @@ -0,0 +1,2 @@ +li:not(.red){} +li:not(.red):not(.green){} diff --git a/yknjs/highlight.js/test/markup/css/url.expect.txt b/yknjs/highlight.js/test/markup/css/url.expect.txt new file mode 100644 index 0000000..b9ca8ff --- /dev/null +++ b/yknjs/highlight.js/test/markup/css/url.expect.txt @@ -0,0 +1,6 @@ +div { background: url("foo/bar/baz.jpg") } +div { background: url('foo/bar/baz.jpg') } +div { background: url(foo/bar/baz.jpg) } +div { background-image: url(data:image/png;base64,TWFuIGlzIGRpc3=) } +div { background-image: url("data:image/png;base64,TWFuIGlzIGRpc3=") } +div { background-image: url('data:image/png;base64,TWFuIGlzIGRpc3=') } diff --git a/yknjs/highlight.js/test/markup/css/url.txt b/yknjs/highlight.js/test/markup/css/url.txt new file mode 100644 index 0000000..7a91d04 --- /dev/null +++ b/yknjs/highlight.js/test/markup/css/url.txt @@ -0,0 +1,6 @@ +div { background: url("foo/bar/baz.jpg") } +div { background: url('foo/bar/baz.jpg') } +div { background: url(foo/bar/baz.jpg) } +div { background-image: url(data:image/png;base64,TWFuIGlzIGRpc3=) } +div { background-image: url("data:image/png;base64,TWFuIGlzIGRpc3=") } +div { background-image: url('data:image/png;base64,TWFuIGlzIGRpc3=') } \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/dart/string-interpolation.expect.txt b/yknjs/highlight.js/test/markup/dart/string-interpolation.expect.txt new file mode 100644 index 0000000..e35e1e6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/dart/string-interpolation.expect.txt @@ -0,0 +1,3 @@ +'1234$identifier $true'; +// comment +'1234${1234 + true + 'foo'}'; diff --git a/yknjs/highlight.js/test/markup/dart/string-interpolation.txt b/yknjs/highlight.js/test/markup/dart/string-interpolation.txt new file mode 100644 index 0000000..e7adb5c --- /dev/null +++ b/yknjs/highlight.js/test/markup/dart/string-interpolation.txt @@ -0,0 +1,3 @@ +'1234$identifier $true'; +// comment +'1234${1234 + true + 'foo'}'; diff --git a/yknjs/highlight.js/test/markup/delphi/compiler-directive.expect.txt b/yknjs/highlight.js/test/markup/delphi/compiler-directive.expect.txt new file mode 100644 index 0000000..e3ad344 --- /dev/null +++ b/yknjs/highlight.js/test/markup/delphi/compiler-directive.expect.txt @@ -0,0 +1,4 @@ +{ Compiler directives } +{$I} (*$I*) +procedure A(x: {$IFDEF Debug}Integer{$ELSE}Word{$ENDIF}); +begin end; diff --git a/yknjs/highlight.js/test/markup/delphi/compiler-directive.txt b/yknjs/highlight.js/test/markup/delphi/compiler-directive.txt new file mode 100644 index 0000000..c62b1a2 --- /dev/null +++ b/yknjs/highlight.js/test/markup/delphi/compiler-directive.txt @@ -0,0 +1,4 @@ +{ Compiler directives } +{$I} (*$I*) +procedure A(x: {$IFDEF Debug}Integer{$ELSE}Word{$ENDIF}); +begin end; diff --git a/yknjs/highlight.js/test/markup/diff/comments.expect.txt b/yknjs/highlight.js/test/markup/diff/comments.expect.txt new file mode 100644 index 0000000..5477ae7 --- /dev/null +++ b/yknjs/highlight.js/test/markup/diff/comments.expect.txt @@ -0,0 +1,10 @@ +Index: languages/demo.js +=================================================================== +--- languages/demo.js (revision 199) ++++ languages/demo.js (revision 200) +@@ -1,8 +1,7 @@ ++ Here we highlight correctly +==== ++ Here too +===== ++ Here we don't anymore after five '=' next to each other diff --git a/yknjs/highlight.js/test/markup/diff/comments.txt b/yknjs/highlight.js/test/markup/diff/comments.txt new file mode 100644 index 0000000..f79bb67 --- /dev/null +++ b/yknjs/highlight.js/test/markup/diff/comments.txt @@ -0,0 +1,10 @@ +Index: languages/demo.js +=================================================================== +--- languages/demo.js (revision 199) ++++ languages/demo.js (revision 200) +@@ -1,8 +1,7 @@ ++ Here we highlight correctly +==== ++ Here too +===== ++ Here we don't anymore after five '=' next to each other diff --git a/yknjs/highlight.js/test/markup/dockerfile/default.expect.txt b/yknjs/highlight.js/test/markup/dockerfile/default.expect.txt new file mode 100644 index 0000000..3d7b03d --- /dev/null +++ b/yknjs/highlight.js/test/markup/dockerfile/default.expect.txt @@ -0,0 +1,23 @@ +FROM ubuntu + +MAINTAINER laurent@docker.com + +ARG debug=0 + +COPY www.conf /etc/php5/fpm/pool.d/ + +RUN apt-get update \ + && apt-get install -y php5-fpm php-apc php5-curl php5-gd php5-intl php5-mysql +RUN mkdir /tmp/sessions + +ENV APPLICATION_ENV dev + +USER www-data + +EXPOSE 80 + +VOLUME ["/var/www/html"] + +WORKDIR "/var/www/html" + +CMD [ "/usr/sbin/php5-fpm", "-F" ] diff --git a/yknjs/highlight.js/test/markup/dockerfile/default.txt b/yknjs/highlight.js/test/markup/dockerfile/default.txt new file mode 100644 index 0000000..bfeeaef --- /dev/null +++ b/yknjs/highlight.js/test/markup/dockerfile/default.txt @@ -0,0 +1,23 @@ +FROM ubuntu + +MAINTAINER laurent@docker.com + +ARG debug=0 + +COPY www.conf /etc/php5/fpm/pool.d/ + +RUN apt-get update \ + && apt-get install -y php5-fpm php-apc php5-curl php5-gd php5-intl php5-mysql +RUN mkdir /tmp/sessions + +ENV APPLICATION_ENV dev + +USER www-data + +EXPOSE 80 + +VOLUME ["/var/www/html"] + +WORKDIR "/var/www/html" + +CMD [ "/usr/sbin/php5-fpm", "-F" ] diff --git a/yknjs/highlight.js/test/markup/dos/comments.expect.txt b/yknjs/highlight.js/test/markup/dos/comments.expect.txt new file mode 100644 index 0000000..3f00626 --- /dev/null +++ b/yknjs/highlight.js/test/markup/dos/comments.expect.txt @@ -0,0 +1,3 @@ +rem comment + rem comment +copy a.txt b.txt > rem not_a_comment diff --git a/yknjs/highlight.js/test/markup/dos/comments.txt b/yknjs/highlight.js/test/markup/dos/comments.txt new file mode 100644 index 0000000..6456884 --- /dev/null +++ b/yknjs/highlight.js/test/markup/dos/comments.txt @@ -0,0 +1,3 @@ +rem comment + rem comment +copy a.txt b.txt > rem not_a_comment diff --git a/yknjs/highlight.js/test/markup/dsconfig/default.expect.txt b/yknjs/highlight.js/test/markup/dsconfig/default.expect.txt new file mode 100644 index 0000000..cfb2fba --- /dev/null +++ b/yknjs/highlight.js/test/markup/dsconfig/default.expect.txt @@ -0,0 +1,24 @@ +# Quoted and unquoted properties +dsconfig create-client-connection-policy \ + --policy-name "Restrictive Client Connection Policy" \ + --set "description:Restrictive Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:1000 \ + --set "connection-criteria:User.0 Connection Criteria" \ + --set maximum-concurrent-connections:2 \ + --set "maximum-connection-duration:1 s" \ + --set "maximum-idle-connection-duration:1 s" \ + --set maximum-operation-count-per-connection:1000 +# dsconfig keyword is optional +create-client-connection-policy \ + --policy-name "Another Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:100 \ + --set 'connection-criteria:User.1 Connection Criteria' \ +# Property without value + --reset maximum-concurrent-connections +# Unquoted property, quoted property value +dsconfig set-access-control-handler-prop \ + --add global-aci:'(target="ldap:///cn=config")(targetattr="*")(version 3.0; acl "Allow access to the config tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --add global-aci:'(target="ldap:///cn=monitor")(targetattr="*")(version 3.0; acl "Allow access to the monitor tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --remove global-aci:'(target="ldap:///cn=alerts")(targetattr="*")(version 3.0; acl "Allow access to the alerts tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' +# No continuation +dsconfig delete-log-publisher --publisher-name "File-Based Error Logger" diff --git a/yknjs/highlight.js/test/markup/dsconfig/default.txt b/yknjs/highlight.js/test/markup/dsconfig/default.txt new file mode 100644 index 0000000..430bda6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/dsconfig/default.txt @@ -0,0 +1,24 @@ +# Quoted and unquoted properties +dsconfig create-client-connection-policy \ + --policy-name "Restrictive Client Connection Policy" \ + --set "description:Restrictive Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:1000 \ + --set "connection-criteria:User.0 Connection Criteria" \ + --set maximum-concurrent-connections:2 \ + --set "maximum-connection-duration:1 s" \ + --set "maximum-idle-connection-duration:1 s" \ + --set maximum-operation-count-per-connection:1000 +# dsconfig keyword is optional +create-client-connection-policy \ + --policy-name "Another Client Connection Policy" \ + --set enabled:true --set evaluation-order-index:100 \ + --set 'connection-criteria:User.1 Connection Criteria' \ +# Property without value + --reset maximum-concurrent-connections +# Unquoted property, quoted property value +dsconfig set-access-control-handler-prop \ + --add global-aci:'(target="ldap:///cn=config")(targetattr="*")(version 3.0; acl "Allow access to the config tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --add global-aci:'(target="ldap:///cn=monitor")(targetattr="*")(version 3.0; acl "Allow access to the monitor tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' \ + --remove global-aci:'(target="ldap:///cn=alerts")(targetattr="*")(version 3.0; acl "Allow access to the alerts tree by cn=admin,c=us"; allow(all) groupdn="ldap:///cn=directory administrators,ou=groups,c=us";)' +# No continuation +dsconfig delete-log-publisher --publisher-name "File-Based Error Logger" diff --git a/yknjs/highlight.js/test/markup/elixir/function-title.expect.txt b/yknjs/highlight.js/test/markup/elixir/function-title.expect.txt new file mode 100644 index 0000000..c4d01de --- /dev/null +++ b/yknjs/highlight.js/test/markup/elixir/function-title.expect.txt @@ -0,0 +1,15 @@ +def f do + :ok +end + +def f(list) do + :ok +end + +def f :clear, list do + :ok +end + +def f!, do: IO.puts "hello world" + +x = 5 diff --git a/yknjs/highlight.js/test/markup/elixir/function-title.txt b/yknjs/highlight.js/test/markup/elixir/function-title.txt new file mode 100644 index 0000000..9f950a6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/elixir/function-title.txt @@ -0,0 +1,15 @@ +def f do + :ok +end + +def f(list) do + :ok +end + +def f :clear, list do + :ok +end + +def f!, do: IO.puts "hello world" + +x = 5 diff --git a/yknjs/highlight.js/test/markup/excel/comments.expect.txt b/yknjs/highlight.js/test/markup/excel/comments.expect.txt new file mode 100644 index 0000000..596c4f2 --- /dev/null +++ b/yknjs/highlight.js/test/markup/excel/comments.expect.txt @@ -0,0 +1 @@ +=(N4 + N5)*0.055 + N("This is a comment.") diff --git a/yknjs/highlight.js/test/markup/excel/comments.txt b/yknjs/highlight.js/test/markup/excel/comments.txt new file mode 100644 index 0000000..ab6e3db --- /dev/null +++ b/yknjs/highlight.js/test/markup/excel/comments.txt @@ -0,0 +1 @@ +=(N4 + N5)*0.055 + N("This is a comment.") diff --git a/yknjs/highlight.js/test/markup/fortran/numbers.expect.txt b/yknjs/highlight.js/test/markup/fortran/numbers.expect.txt new file mode 100644 index 0000000..f90b246 --- /dev/null +++ b/yknjs/highlight.js/test/markup/fortran/numbers.expect.txt @@ -0,0 +1,15 @@ +1.d0 +-1.d0 +1.d-5 +-1.D5 +342.e+12 +12. +12 +.23 +-.23 +1.E4 +1E4 +1D-4 +var1 +va1r +mo_tot_8 = 1./(0.4*log(float(elec_num_tot_8+0.4))) \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/fortran/numbers.txt b/yknjs/highlight.js/test/markup/fortran/numbers.txt new file mode 100644 index 0000000..49ad3bb --- /dev/null +++ b/yknjs/highlight.js/test/markup/fortran/numbers.txt @@ -0,0 +1,15 @@ +1.d0 +-1.d0 +1.d-5 +-1.D5 +342.e+12 +12. +12 +.23 +-.23 +1.E4 +1E4 +1D-4 +var1 +va1r +mo_tot_8 = 1./(0.4*log(float(elec_num_tot_8+0.4))) \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/fsharp/bang-keywords.expect.txt b/yknjs/highlight.js/test/markup/fsharp/bang-keywords.expect.txt new file mode 100644 index 0000000..9aff5df --- /dev/null +++ b/yknjs/highlight.js/test/markup/fsharp/bang-keywords.expect.txt @@ -0,0 +1 @@ +let! (result2 : byte[]) = stream.AsyncRead(bufferSize) diff --git a/yknjs/highlight.js/test/markup/fsharp/bang-keywords.txt b/yknjs/highlight.js/test/markup/fsharp/bang-keywords.txt new file mode 100644 index 0000000..5824ca8 --- /dev/null +++ b/yknjs/highlight.js/test/markup/fsharp/bang-keywords.txt @@ -0,0 +1 @@ +let! (result2 : byte[]) = stream.AsyncRead(bufferSize) diff --git a/yknjs/highlight.js/test/markup/gauss/function_defs.expect.txt b/yknjs/highlight.js/test/markup/gauss/function_defs.expect.txt new file mode 100644 index 0000000..5203af0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/gauss/function_defs.expect.txt @@ -0,0 +1,7 @@ +proc (1) = foo(if, endif, 10); +proc foo; +proc (1) = calc(local__row, fin, ...); +fn /* inline */ twopi=pi*2; +fn _n_pi(n /* inline comment */) = pi*n; +keyword add(str, struct plotControl myPlot); +keyword sub; diff --git a/yknjs/highlight.js/test/markup/gauss/function_defs.txt b/yknjs/highlight.js/test/markup/gauss/function_defs.txt new file mode 100644 index 0000000..401af60 --- /dev/null +++ b/yknjs/highlight.js/test/markup/gauss/function_defs.txt @@ -0,0 +1,7 @@ +proc (1) = foo(if, endif, 10); +proc foo; +proc (1) = calc(local__row, fin, ...); +fn /* inline */ twopi=pi*2; +fn _n_pi(n /* inline comment */) = pi*n; +keyword add(str, struct plotControl myPlot); +keyword sub; diff --git a/yknjs/highlight.js/test/markup/gauss/function_refs.expect.txt b/yknjs/highlight.js/test/markup/gauss/function_refs.expect.txt new file mode 100644 index 0000000..795eb54 --- /dev/null +++ b/yknjs/highlight.js/test/markup/gauss/function_refs.expect.txt @@ -0,0 +1,5 @@ +k = colsf(fin); +nr = floor(minc(maxbytes/(k*8*3.5)|maxvec/(k+1))); +call random_user_function_2(-10.0, "hey", /* blah */ x[0x2F]); +ols("", csvReadM("test.csv")); +if myfn(10) == 20; diff --git a/yknjs/highlight.js/test/markup/gauss/function_refs.txt b/yknjs/highlight.js/test/markup/gauss/function_refs.txt new file mode 100644 index 0000000..d87911d --- /dev/null +++ b/yknjs/highlight.js/test/markup/gauss/function_refs.txt @@ -0,0 +1,5 @@ +k = colsf(fin); +nr = floor(minc(maxbytes/(k*8*3.5)|maxvec/(k+1))); +call random_user_function_2(-10.0, "hey", /* blah */ x[0x2F]); +ols("", csvReadM("test.csv")); +if myfn(10) == 20; diff --git a/yknjs/highlight.js/test/markup/gauss/keywords.expect.txt b/yknjs/highlight.js/test/markup/gauss/keywords.expect.txt new file mode 100644 index 0000000..b02f6ef --- /dev/null +++ b/yknjs/highlight.js/test/markup/gauss/keywords.expect.txt @@ -0,0 +1,7 @@ +for i(start, stop, bar(5)); +if (i-1 % 5 == 0 .and some_flag); +elseif i % 2 .eqv 0; +external string _olsrnam; +external proc indices2,indexcat; +myPlot.axes.and.for.if.endif.text = "hey"; +local f:proc; diff --git a/yknjs/highlight.js/test/markup/gauss/keywords.txt b/yknjs/highlight.js/test/markup/gauss/keywords.txt new file mode 100644 index 0000000..a39a18f --- /dev/null +++ b/yknjs/highlight.js/test/markup/gauss/keywords.txt @@ -0,0 +1,7 @@ +for i(start, stop, bar(5)); +if (i-1 % 5 == 0 .and some_flag); +elseif i % 2 .eqv 0; +external string _olsrnam; +external proc indices2,indexcat; +myPlot.axes.and.for.if.endif.text = "hey"; +local f:proc; diff --git a/yknjs/highlight.js/test/markup/go/numbers.expect.txt b/yknjs/highlight.js/test/markup/go/numbers.expect.txt new file mode 100644 index 0000000..c7d4d2a --- /dev/null +++ b/yknjs/highlight.js/test/markup/go/numbers.expect.txt @@ -0,0 +1,2 @@ +float_var := 1.0e10f +complex_var := 1.2e5+2.3i \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/go/numbers.txt b/yknjs/highlight.js/test/markup/go/numbers.txt new file mode 100644 index 0000000..f3b4a79 --- /dev/null +++ b/yknjs/highlight.js/test/markup/go/numbers.txt @@ -0,0 +1,2 @@ +float_var := 1.0e10f +complex_var := 1.2e5+2.3i \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/golo/default.expect.txt b/yknjs/highlight.js/test/markup/golo/default.expect.txt new file mode 100644 index 0000000..7492208 --- /dev/null +++ b/yknjs/highlight.js/test/markup/golo/default.expect.txt @@ -0,0 +1,15 @@ +module hello + +function dyno = -> DynamicObject() + +struct human = { name } + +@annotated +function main = |args| { + let a = 1 + var b = 2 + + println("hello") + + let john = human("John Doe") +} diff --git a/yknjs/highlight.js/test/markup/golo/default.txt b/yknjs/highlight.js/test/markup/golo/default.txt new file mode 100644 index 0000000..0c0f62c --- /dev/null +++ b/yknjs/highlight.js/test/markup/golo/default.txt @@ -0,0 +1,15 @@ +module hello + +function dyno = -> DynamicObject() + +struct human = { name } + +@annotated +function main = |args| { + let a = 1 + var b = 2 + + println("hello") + + let john = human("John Doe") +} diff --git a/yknjs/highlight.js/test/markup/haskell/infix.expect.txt b/yknjs/highlight.js/test/markup/haskell/infix.expect.txt new file mode 100644 index 0000000..0ce07f7 --- /dev/null +++ b/yknjs/highlight.js/test/markup/haskell/infix.expect.txt @@ -0,0 +1,3 @@ +infix 3 `foo` +infixl 6 `bar` +infixr 9 `baz` diff --git a/yknjs/highlight.js/test/markup/haskell/infix.txt b/yknjs/highlight.js/test/markup/haskell/infix.txt new file mode 100644 index 0000000..55f679a --- /dev/null +++ b/yknjs/highlight.js/test/markup/haskell/infix.txt @@ -0,0 +1,3 @@ +infix 3 `foo` +infixl 6 `bar` +infixr 9 `baz` diff --git a/yknjs/highlight.js/test/markup/haskell/nested-comments.expect.txt b/yknjs/highlight.js/test/markup/haskell/nested-comments.expect.txt new file mode 100644 index 0000000..564c142 --- /dev/null +++ b/yknjs/highlight.js/test/markup/haskell/nested-comments.expect.txt @@ -0,0 +1 @@ +{- this is a {- nested -} comment -} diff --git a/yknjs/highlight.js/test/markup/haskell/nested-comments.txt b/yknjs/highlight.js/test/markup/haskell/nested-comments.txt new file mode 100644 index 0000000..b716623 --- /dev/null +++ b/yknjs/highlight.js/test/markup/haskell/nested-comments.txt @@ -0,0 +1 @@ +{- this is a {- nested -} comment -} diff --git a/yknjs/highlight.js/test/markup/http/default.expect.txt b/yknjs/highlight.js/test/markup/http/default.expect.txt new file mode 100644 index 0000000..dafe8dc --- /dev/null +++ b/yknjs/highlight.js/test/markup/http/default.expect.txt @@ -0,0 +1,7 @@ +POST /task?id=1 HTTP/1.1 +Host: example.org +Content-Type: application/json; charset=utf-8 +Content-Length: 19 + +{"status": "ok", "extended": true} + diff --git a/yknjs/highlight.js/test/markup/http/default.txt b/yknjs/highlight.js/test/markup/http/default.txt new file mode 100644 index 0000000..34631a1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/http/default.txt @@ -0,0 +1,6 @@ +POST /task?id=1 HTTP/1.1 +Host: example.org +Content-Type: application/json; charset=utf-8 +Content-Length: 19 + +{"status": "ok", "extended": true} diff --git a/yknjs/highlight.js/test/markup/index.js b/yknjs/highlight.js/test/markup/index.js new file mode 100644 index 0000000..e80fedc --- /dev/null +++ b/yknjs/highlight.js/test/markup/index.js @@ -0,0 +1,39 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let fs = bluebird.promisifyAll(require('fs')); +let glob = require('glob'); +let hljs = require('../../build'); +let path = require('path'); +let utility = require('../utility'); + +function testLanguage(language) { + describe(language, function() { + const filePath = utility.buildPath('markup', language, '*.expect.txt'), + filenames = glob.sync(filePath); + + _.each(filenames, function(filename) { + const testName = path.basename(filename, '.expect.txt'), + sourceName = filename.replace(/\.expect/, ''); + + it(`should markup ${testName}`, function(done) { + const sourceFile = fs.readFileAsync(sourceName, 'utf-8'), + expectedFile = fs.readFileAsync(filename, 'utf-8'); + + bluebird.join(sourceFile, expectedFile, function(source, expected) { + const actual = hljs.highlight(language, source).value; + + actual.trim().should.equal(expected.trim()); + done(); + }); + }); + }); + }); +} + +describe('hljs.highlight()', function() { + let markupPath = utility.buildPath('markup'); + + return fs.readdirAsync(markupPath).each(testLanguage); +}); diff --git a/yknjs/highlight.js/test/markup/java/gh1031.expect.txt b/yknjs/highlight.js/test/markup/java/gh1031.expect.txt new file mode 100644 index 0000000..43879d3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/java/gh1031.expect.txt @@ -0,0 +1,7 @@ +public class DefaultDataDaoImpl { + private List<AbstractCmrDataProcessor> cmrDataProcessors; +} + +public class DefaultDataDaoImpl { + private List<AbstractCmrDataProcessor, AbstractCmrDataProcessor> cmrDataProcessors; +} diff --git a/yknjs/highlight.js/test/markup/java/gh1031.txt b/yknjs/highlight.js/test/markup/java/gh1031.txt new file mode 100644 index 0000000..2e7e2e1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/java/gh1031.txt @@ -0,0 +1,7 @@ +public class DefaultDataDaoImpl { + private List cmrDataProcessors; +} + +public class DefaultDataDaoImpl { + private List cmrDataProcessors; +} diff --git a/yknjs/highlight.js/test/markup/java/numbers.expect.txt b/yknjs/highlight.js/test/markup/java/numbers.expect.txt new file mode 100644 index 0000000..713579c --- /dev/null +++ b/yknjs/highlight.js/test/markup/java/numbers.expect.txt @@ -0,0 +1,9 @@ +long creditCardNumber = 1234_5678_9012_3456L; +long socialSecurityNumber = 999_99_9999L; +float pi = 3.14_15F; +long hexBytes = 0xFF_EC_DE_5E; +long hexWords = 0xCAFE_BABE; +long maxLong = 0x7fff_ffff_ffff_ffffL; +byte nybbles = 0b0010_0101; +long bytes = 0b11010010_01101001_10010100_10010010; +int n = 1234 + Contacts._ID; diff --git a/yknjs/highlight.js/test/markup/java/numbers.txt b/yknjs/highlight.js/test/markup/java/numbers.txt new file mode 100644 index 0000000..f68a40c --- /dev/null +++ b/yknjs/highlight.js/test/markup/java/numbers.txt @@ -0,0 +1,9 @@ +long creditCardNumber = 1234_5678_9012_3456L; +long socialSecurityNumber = 999_99_9999L; +float pi = 3.14_15F; +long hexBytes = 0xFF_EC_DE_5E; +long hexWords = 0xCAFE_BABE; +long maxLong = 0x7fff_ffff_ffff_ffffL; +byte nybbles = 0b0010_0101; +long bytes = 0b11010010_01101001_10010100_10010010; +int n = 1234 + Contacts._ID; diff --git a/yknjs/highlight.js/test/markup/java/titles.expect.txt b/yknjs/highlight.js/test/markup/java/titles.expect.txt new file mode 100644 index 0000000..cc0a41b --- /dev/null +++ b/yknjs/highlight.js/test/markup/java/titles.expect.txt @@ -0,0 +1,10 @@ +public class Greet { + public Either<Integer, String> f(int val) { + new Type(); + if (val) { + return getType(); + } else if (!val) { + throw getError(); + } + } +} diff --git a/yknjs/highlight.js/test/markup/java/titles.txt b/yknjs/highlight.js/test/markup/java/titles.txt new file mode 100644 index 0000000..c43f696 --- /dev/null +++ b/yknjs/highlight.js/test/markup/java/titles.txt @@ -0,0 +1,10 @@ +public class Greet { + public Either f(int val) { + new Type(); + if (val) { + return getType(); + } else if (!val) { + throw getError(); + } + } +} diff --git a/yknjs/highlight.js/test/markup/javascript/arrow-function.expect.txt b/yknjs/highlight.js/test/markup/javascript/arrow-function.expect.txt new file mode 100644 index 0000000..7a4faaf --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/arrow-function.expect.txt @@ -0,0 +1,3 @@ +var f = x => x; +f(x => x + (y=2, z=undefined, ...rest) => y); +() => null; diff --git a/yknjs/highlight.js/test/markup/javascript/arrow-function.txt b/yknjs/highlight.js/test/markup/javascript/arrow-function.txt new file mode 100644 index 0000000..0d39f38 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/arrow-function.txt @@ -0,0 +1,3 @@ +var f = x => x; +f(x => x + (y=2, z=undefined, ...rest) => y); +() => null; diff --git a/yknjs/highlight.js/test/markup/javascript/class.expect.txt b/yknjs/highlight.js/test/markup/javascript/class.expect.txt new file mode 100644 index 0000000..31a8507 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/class.expect.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/yknjs/highlight.js/test/markup/javascript/class.txt b/yknjs/highlight.js/test/markup/javascript/class.txt new file mode 100644 index 0000000..47fa67c --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/class.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/yknjs/highlight.js/test/markup/javascript/default-parameters.expect.txt b/yknjs/highlight.js/test/markup/javascript/default-parameters.expect.txt new file mode 100644 index 0000000..d433ced --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/default-parameters.expect.txt @@ -0,0 +1 @@ +function visibleTodoFilter(state = 'watch', action) {} diff --git a/yknjs/highlight.js/test/markup/javascript/default-parameters.txt b/yknjs/highlight.js/test/markup/javascript/default-parameters.txt new file mode 100644 index 0000000..12fb144 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/default-parameters.txt @@ -0,0 +1 @@ +function visibleTodoFilter(state = 'watch', action) {} diff --git a/yknjs/highlight.js/test/markup/javascript/jsx.expect.txt b/yknjs/highlight.js/test/markup/javascript/jsx.expect.txt new file mode 100644 index 0000000..7044949 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/jsx.expect.txt @@ -0,0 +1,6 @@ +var jsx = <node/>; +var jsx = <node><child/></node>; +var jsx = <node>...<child>...</child></node>; +var jsx = <div><span><br /></span></div>; +var x = 5; +return (<node attr="value"></node>); diff --git a/yknjs/highlight.js/test/markup/javascript/jsx.txt b/yknjs/highlight.js/test/markup/javascript/jsx.txt new file mode 100644 index 0000000..2b3db72 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/jsx.txt @@ -0,0 +1,6 @@ +var jsx = ; +var jsx = ; +var jsx = ......; +var jsx =

    ; +var x = 5; +return (); diff --git a/yknjs/highlight.js/test/markup/javascript/keywords.expect.txt b/yknjs/highlight.js/test/markup/javascript/keywords.expect.txt new file mode 100644 index 0000000..66edf9f --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/keywords.expect.txt @@ -0,0 +1,13 @@ +function $initHighlight(block, cls) { + try { + if (cls.search(/\bno\-highlight\b/) != -1) + return process(block, true, 0x0F) + + ' class=""'; + } catch (e) { + /* handle exception */ + } + for (var i = 0 / 2; i < classes.length; i++) { + if (checkCondition(classes[i]) === undefined) + return /\d+[\s/]/g; + } +} diff --git a/yknjs/highlight.js/test/markup/javascript/keywords.txt b/yknjs/highlight.js/test/markup/javascript/keywords.txt new file mode 100644 index 0000000..39b3f20 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/keywords.txt @@ -0,0 +1,13 @@ +function $initHighlight(block, cls) { + try { + if (cls.search(/\bno\-highlight\b/) != -1) + return process(block, true, 0x0F) + + ' class=""'; + } catch (e) { + /* handle exception */ + } + for (var i = 0 / 2; i < classes.length; i++) { + if (checkCondition(classes[i]) === undefined) + return /\d+[\s/]/g; + } +} diff --git a/yknjs/highlight.js/test/markup/javascript/method-call.expect.txt b/yknjs/highlight.js/test/markup/javascript/method-call.expect.txt new file mode 100644 index 0000000..25b4a6a --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/method-call.expect.txt @@ -0,0 +1 @@ +x.continue(0); diff --git a/yknjs/highlight.js/test/markup/javascript/method-call.txt b/yknjs/highlight.js/test/markup/javascript/method-call.txt new file mode 100644 index 0000000..e4e6cc4 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/method-call.txt @@ -0,0 +1 @@ +x.continue(0); diff --git a/yknjs/highlight.js/test/markup/javascript/modules.expect.txt b/yknjs/highlight.js/test/markup/javascript/modules.expect.txt new file mode 100644 index 0000000..0f83909 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/modules.expect.txt @@ -0,0 +1,8 @@ +//------ underscore.js ------ +export default function (obj) {}; +export function each(obj, iterator, context) {}; +export { each as forEach }; +export function something() {}; + +//------ main.js ------ +import _, { each, something as otherthing } from 'underscore'; diff --git a/yknjs/highlight.js/test/markup/javascript/modules.txt b/yknjs/highlight.js/test/markup/javascript/modules.txt new file mode 100644 index 0000000..c0c8e35 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/modules.txt @@ -0,0 +1,8 @@ +//------ underscore.js ------ +export default function (obj) {}; +export function each(obj, iterator, context) {}; +export { each as forEach }; +export function something() {}; + +//------ main.js ------ +import _, { each, something as otherthing } from 'underscore'; diff --git a/yknjs/highlight.js/test/markup/javascript/object-attr.expect.txt b/yknjs/highlight.js/test/markup/javascript/object-attr.expect.txt new file mode 100644 index 0000000..092d8d7 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/object-attr.expect.txt @@ -0,0 +1,6 @@ +{ + key: value, + key2: value, + 'key-3': value, + key4: false ? undefined : true +} diff --git a/yknjs/highlight.js/test/markup/javascript/object-attr.txt b/yknjs/highlight.js/test/markup/javascript/object-attr.txt new file mode 100644 index 0000000..852dbdf --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/object-attr.txt @@ -0,0 +1,6 @@ +{ + key: value, + key2: value, + 'key-3': value, + key4: false ? undefined : true +} diff --git a/yknjs/highlight.js/test/markup/javascript/shebang.expect.txt b/yknjs/highlight.js/test/markup/javascript/shebang.expect.txt new file mode 100644 index 0000000..0bd20fa --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/shebang.expect.txt @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +var a = 1; diff --git a/yknjs/highlight.js/test/markup/javascript/shebang.txt b/yknjs/highlight.js/test/markup/javascript/shebang.txt new file mode 100644 index 0000000..5ea5ac0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/shebang.txt @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +var a = 1; diff --git a/yknjs/highlight.js/test/markup/javascript/template-strings.expect.txt b/yknjs/highlight.js/test/markup/javascript/template-strings.expect.txt new file mode 100644 index 0000000..74dddc1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/template-strings.expect.txt @@ -0,0 +1 @@ +`string ${foo + `str${undefined}ing`}`; diff --git a/yknjs/highlight.js/test/markup/javascript/template-strings.txt b/yknjs/highlight.js/test/markup/javascript/template-strings.txt new file mode 100644 index 0000000..a713e0a --- /dev/null +++ b/yknjs/highlight.js/test/markup/javascript/template-strings.txt @@ -0,0 +1 @@ +`string ${foo + `str${undefined}ing`}`; diff --git a/yknjs/highlight.js/test/markup/kotlin/class.expect.txt b/yknjs/highlight.js/test/markup/kotlin/class.expect.txt new file mode 100644 index 0000000..583c2de --- /dev/null +++ b/yknjs/highlight.js/test/markup/kotlin/class.expect.txt @@ -0,0 +1,16 @@ +class A { +} + +class B() + +class C() {} + +public class D + +class E1<T> +class E2<T, R> +class E3<T,R> + +class F1 : A +class F2 : A, B +class F3 : A<T> \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/kotlin/class.txt b/yknjs/highlight.js/test/markup/kotlin/class.txt new file mode 100644 index 0000000..cb7a911 --- /dev/null +++ b/yknjs/highlight.js/test/markup/kotlin/class.txt @@ -0,0 +1,16 @@ +class A { +} + +class B() + +class C() {} + +public class D + +class E1 +class E2 +class E3 + +class F1 : A +class F2 : A, B +class F3 : A \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/kotlin/function.expect.txt b/yknjs/highlight.js/test/markup/kotlin/function.expect.txt new file mode 100644 index 0000000..62e3c83 --- /dev/null +++ b/yknjs/highlight.js/test/markup/kotlin/function.expect.txt @@ -0,0 +1,13 @@ +fun a() = 1 +fun /* b1 */ b(/*b2*/ a : Int /*b3*/) /*b4*/ = a // b5 + + +fun <T> c() : String = "1" +inline fun <reified T> d() { return } + + +fun e( + a : Int, /*a*/ + b : String //b +) +{} diff --git a/yknjs/highlight.js/test/markup/kotlin/function.txt b/yknjs/highlight.js/test/markup/kotlin/function.txt new file mode 100644 index 0000000..1bc2a1a --- /dev/null +++ b/yknjs/highlight.js/test/markup/kotlin/function.txt @@ -0,0 +1,13 @@ +fun a() = 1 +fun /* b1 */ b(/*b2*/ a : Int /*b3*/) /*b4*/ = a // b5 + + +fun c() : String = "1" +inline fun d() { return } + + +fun e( + a : Int, /*a*/ + b : String //b +) +{} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/lasso/delimiters.expect.txt b/yknjs/highlight.js/test/markup/lasso/delimiters.expect.txt new file mode 100644 index 0000000..c3cab91 --- /dev/null +++ b/yknjs/highlight.js/test/markup/lasso/delimiters.expect.txt @@ -0,0 +1,7 @@ +<div> +[local(y::decimal = .57721)] +[noprocess] <?lasso delimiters?> [until] [/noprocess] +[no_square_brackets] skip subsequent [square brackets] +<!--ignore <?LassoScript in HTML comments ?>--> +<?=!#y ? true | `string`?> +</div> diff --git a/yknjs/highlight.js/test/markup/lasso/delimiters.txt b/yknjs/highlight.js/test/markup/lasso/delimiters.txt new file mode 100644 index 0000000..375ac58 --- /dev/null +++ b/yknjs/highlight.js/test/markup/lasso/delimiters.txt @@ -0,0 +1,7 @@ +
    +[local(y::decimal = .57721)] +[noprocess] [until] [/noprocess] +[no_square_brackets] skip subsequent [square brackets] + + +
    diff --git a/yknjs/highlight.js/test/markup/ldif/ldapmodify.expect.txt b/yknjs/highlight.js/test/markup/ldif/ldapmodify.expect.txt new file mode 100644 index 0000000..c3ba8ab --- /dev/null +++ b/yknjs/highlight.js/test/markup/ldif/ldapmodify.expect.txt @@ -0,0 +1,7 @@ +dn: uid=user.0,ou=People,dc=example,dc=com +changeType: modify +add: cn +cn: Morris Day +- +add: mobile +mobile: (408) 555-7844 diff --git a/yknjs/highlight.js/test/markup/ldif/ldapmodify.txt b/yknjs/highlight.js/test/markup/ldif/ldapmodify.txt new file mode 100644 index 0000000..022b0eb --- /dev/null +++ b/yknjs/highlight.js/test/markup/ldif/ldapmodify.txt @@ -0,0 +1,7 @@ +dn: uid=user.0,ou=People,dc=example,dc=com +changeType: modify +add: cn +cn: Morris Day +- +add: mobile +mobile: (408) 555-7844 diff --git a/yknjs/highlight.js/test/markup/ldif/schema.expect.txt b/yknjs/highlight.js/test/markup/ldif/schema.expect.txt new file mode 100644 index 0000000..0229806 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ldif/schema.expect.txt @@ -0,0 +1,15 @@ +dn: cn=schema +objectClass: top +objectClass: ldapSubentry +objectClass: subschema +# Single-valued JSON attribute +attributeTypes: ( example-json1-oid NAME 'json1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + SINGLE-VALUE X-ORIGIN 'custom attribute' ) +# Multi-valued JSON attribute +attributeTypes: ( example-mjson1-oid NAME 'mjson1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + X-ORIGIN 'custom attribute' ) +objectClasses: ( example-application-oc-oid NAME 'example-application-oc' + SUP top AUXILIARY MAY ( json1 $ mjson1 ) + X-ORIGIN 'custom auxiliary object class' ) diff --git a/yknjs/highlight.js/test/markup/ldif/schema.txt b/yknjs/highlight.js/test/markup/ldif/schema.txt new file mode 100644 index 0000000..02a620e --- /dev/null +++ b/yknjs/highlight.js/test/markup/ldif/schema.txt @@ -0,0 +1,15 @@ +dn: cn=schema +objectClass: top +objectClass: ldapSubentry +objectClass: subschema +# Single-valued JSON attribute +attributeTypes: ( example-json1-oid NAME 'json1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + SINGLE-VALUE X-ORIGIN 'custom attribute' ) +# Multi-valued JSON attribute +attributeTypes: ( example-mjson1-oid NAME 'mjson1' + EQUALITY jsonObjectExactMatch SYNTAX 1.3.6.1.4.1.30221.2.3.4 + X-ORIGIN 'custom attribute' ) +objectClasses: ( example-application-oc-oid NAME 'example-application-oc' + SUP top AUXILIARY MAY ( json1 $ mjson1 ) + X-ORIGIN 'custom auxiliary object class' ) diff --git a/yknjs/highlight.js/test/markup/less/selectors.expect.txt b/yknjs/highlight.js/test/markup/less/selectors.expect.txt new file mode 100644 index 0000000..425530e --- /dev/null +++ b/yknjs/highlight.js/test/markup/less/selectors.expect.txt @@ -0,0 +1,8 @@ +#foo { + tag #bar {} + > #bar {} + #bar {} + &#bar {} + &:hover {} + height: ~"@{height}px"; +} diff --git a/yknjs/highlight.js/test/markup/less/selectors.txt b/yknjs/highlight.js/test/markup/less/selectors.txt new file mode 100644 index 0000000..8a5ed6e --- /dev/null +++ b/yknjs/highlight.js/test/markup/less/selectors.txt @@ -0,0 +1,8 @@ +#foo { + tag #bar {} + > #bar {} + #bar {} + &#bar {} + &:hover {} + height: ~"@{height}px"; +} diff --git a/yknjs/highlight.js/test/markup/lisp/mec.expect.txt b/yknjs/highlight.js/test/markup/lisp/mec.expect.txt new file mode 100644 index 0000000..a1e680d --- /dev/null +++ b/yknjs/highlight.js/test/markup/lisp/mec.expect.txt @@ -0,0 +1,4 @@ +; MEC: Multiple Escape Characters. See https://github.com/highlightjs/highlight.js/issues/615 +(|spaces and +newlines| x) +(x '|quoted|) diff --git a/yknjs/highlight.js/test/markup/lisp/mec.txt b/yknjs/highlight.js/test/markup/lisp/mec.txt new file mode 100644 index 0000000..2a05b15 --- /dev/null +++ b/yknjs/highlight.js/test/markup/lisp/mec.txt @@ -0,0 +1,4 @@ +; MEC: Multiple Escape Characters. See https://github.com/highlightjs/highlight.js/issues/615 +(|spaces and +newlines| x) +(x '|quoted|) diff --git a/yknjs/highlight.js/test/markup/markdown/code.expect.txt b/yknjs/highlight.js/test/markup/markdown/code.expect.txt new file mode 100644 index 0000000..881ec44 --- /dev/null +++ b/yknjs/highlight.js/test/markup/markdown/code.expect.txt @@ -0,0 +1,8 @@ + var code = true; + + +```javascript +var code = true; +``` + +Inline `code`, and `more code`. diff --git a/yknjs/highlight.js/test/markup/markdown/code.txt b/yknjs/highlight.js/test/markup/markdown/code.txt new file mode 100644 index 0000000..d9bed99 --- /dev/null +++ b/yknjs/highlight.js/test/markup/markdown/code.txt @@ -0,0 +1,8 @@ + var code = true; + + +```javascript +var code = true; +``` + +Inline `code`, and `more code`. diff --git a/yknjs/highlight.js/test/markup/matlab/block_comment.expect.txt b/yknjs/highlight.js/test/markup/matlab/block_comment.expect.txt new file mode 100644 index 0000000..2f08800 --- /dev/null +++ b/yknjs/highlight.js/test/markup/matlab/block_comment.expect.txt @@ -0,0 +1,27 @@ +%{ evaluate_this = false; % Evaluated as regular single-line comment +evaluate_this = true; +%} + +evaluate_this = true; + +%{ +This is a multi-line comment +evaluate_this = false; +%{ +%} + +evaluate_this = true; + +%{ +Opening (%{) and closing (%}) block comment markers can be within a comment block +%} + +evaluate_this = true; + + %{ + Indented block comments can be indented +or not +and whitespace can be added before or after the %{ and %} + %} + +evaluate_this = true; diff --git a/yknjs/highlight.js/test/markup/matlab/block_comment.txt b/yknjs/highlight.js/test/markup/matlab/block_comment.txt new file mode 100644 index 0000000..92127cd --- /dev/null +++ b/yknjs/highlight.js/test/markup/matlab/block_comment.txt @@ -0,0 +1,27 @@ +%{ evaluate_this = false; % Evaluated as regular single-line comment +evaluate_this = true; +%} + +evaluate_this = true; + +%{ +This is a multi-line comment +evaluate_this = false; +%{ +%} + +evaluate_this = true; + +%{ +Opening (%{) and closing (%}) block comment markers can be within a comment block +%} + +evaluate_this = true; + + %{ + Indented block comments can be indented +or not +and whitespace can be added before or after the %{ and %} + %} + +evaluate_this = true; diff --git a/yknjs/highlight.js/test/markup/matlab/transpose.expect.txt b/yknjs/highlight.js/test/markup/matlab/transpose.expect.txt new file mode 100644 index 0000000..26fe7f7 --- /dev/null +++ b/yknjs/highlight.js/test/markup/matlab/transpose.expect.txt @@ -0,0 +1,40 @@ +% This use of ' is for transpose: +mat2x2 = [1 2; 3 4]'; % transpose of a matrix +cell2x2 = {1 2; 3 4}'; % transpose of a cell +v=mat2x2'; % transpose of a variable +v2 = (v')'; % two transpose operations +foo = 1.'; % transpose of scalar 1. + +% Nonconjugate transpose uses .' +mat2x2 = [1 2; 3 4].'; % of a matrix +cell2x2 = {1 2; 3 4}.'; % of a cell +v=mat2x2.'; % of a variable +v2 = (v.').'; % two operations +foo = 1..'; % of scalar 1. +bar = v.''.'.''; % mix of transpose operations + +% single quote strings: +sq1 = 'a single quote string'; +sq2 = ... +' abcd '; % single quote string starting at column 1 +sq3 = ['a','bc']; % array of single quote strings +sq4 = {'a','bc'}; % cell of single quote strings + +% double quote strings +dq1 = "a double string"; +dq2 = ... +" abcd "; % double quote string starting at column 1 +dq3 = ["a","bc"]; % array of double quote strings + +% Mixture of strings and transpose +c2 = {'a','bc'}'; % transpose of a cell of strings +s = ['a','bc']'; % you can transpose vectors of strings (they are really 'char' arrays) +s = s'; % and transpose back +% (s')' is a double transpose of a string +x = [(s')', ' xyz ', 'a single quote in a string'', escape \', two quotes in a string''''']; + +s2 = "abc\"def""ghi"; % newer versions of MATLAB support double quoted strings +s3 = (["abc", "defg"]')'; % transpose a vectors of quoted string twice +s4 = "abc"!; % transpose a quoted string + +b = true' + false'; % boolean constants diff --git a/yknjs/highlight.js/test/markup/matlab/transpose.txt b/yknjs/highlight.js/test/markup/matlab/transpose.txt new file mode 100644 index 0000000..d1da28e --- /dev/null +++ b/yknjs/highlight.js/test/markup/matlab/transpose.txt @@ -0,0 +1,40 @@ +% This use of ' is for transpose: +mat2x2 = [1 2; 3 4]'; % transpose of a matrix +cell2x2 = {1 2; 3 4}'; % transpose of a cell +v=mat2x2'; % transpose of a variable +v2 = (v')'; % two transpose operations +foo = 1.'; % transpose of scalar 1. + +% Nonconjugate transpose uses .' +mat2x2 = [1 2; 3 4].'; % of a matrix +cell2x2 = {1 2; 3 4}.'; % of a cell +v=mat2x2.'; % of a variable +v2 = (v.').'; % two operations +foo = 1..'; % of scalar 1. +bar = v.''.'.''; % mix of transpose operations + +% single quote strings: +sq1 = 'a single quote string'; +sq2 = ... +' abcd '; % single quote string starting at column 1 +sq3 = ['a','bc']; % array of single quote strings +sq4 = {'a','bc'}; % cell of single quote strings + +% double quote strings +dq1 = "a double string"; +dq2 = ... +" abcd "; % double quote string starting at column 1 +dq3 = ["a","bc"]; % array of double quote strings + +% Mixture of strings and transpose +c2 = {'a','bc'}'; % transpose of a cell of strings +s = ['a','bc']'; % you can transpose vectors of strings (they are really 'char' arrays) +s = s'; % and transpose back +% (s')' is a double transpose of a string +x = [(s')', ' xyz ', 'a single quote in a string'', escape \', two quotes in a string''''']; + +s2 = "abc\"def""ghi"; % newer versions of MATLAB support double quoted strings +s3 = (["abc", "defg"]')'; % transpose a vectors of quoted string twice +s4 = "abc"!; % transpose a quoted string + +b = true' + false'; % boolean constants diff --git a/yknjs/highlight.js/test/markup/maxima/example.expect.txt b/yknjs/highlight.js/test/markup/maxima/example.expect.txt new file mode 100644 index 0000000..0e23890 --- /dev/null +++ b/yknjs/highlight.js/test/markup/maxima/example.expect.txt @@ -0,0 +1,42 @@ +/* Maxima computer algebra system */ + +print ("mumble"); + +/* this + /* this is + /* this is a nested comment */ nested comment + */ comment + */ + +sin(%pi); /* should be highlighted again */ + +/* programming keywords */ + +if a then b elseif c then d else f; +for x:1 thru 10 step 2 do print(x); +for z:-2 while z < 0 do print(z); +for m:0 unless m > 10 do print(m); +for x in [1, 2, 3] do print(x); +foo and bar or not baz; + +/* different kinds of integers */ + +ibase : 18 $ +[0, 1234, 1234., 0abcdefgh]; +reset (ibase) $ + +/* strings */ + +s1 : "\"now\" is"; +s2 : "the 'time' for all good men"; +print (s1, s2, "to come to the aid", + "of their country"); + +/* expressions */ + +foo (x, y, z) := + if x > 1 + y + then z - x*y + elseif y <= 100! + then x/(y + z)^2 + else z - y . x . y; diff --git a/yknjs/highlight.js/test/markup/maxima/example.txt b/yknjs/highlight.js/test/markup/maxima/example.txt new file mode 100644 index 0000000..206f969 --- /dev/null +++ b/yknjs/highlight.js/test/markup/maxima/example.txt @@ -0,0 +1,42 @@ +/* Maxima computer algebra system */ + +print ("mumble"); + +/* this + /* this is + /* this is a nested comment */ nested comment + */ comment + */ + +sin(%pi); /* should be highlighted again */ + +/* programming keywords */ + +if a then b elseif c then d else f; +for x:1 thru 10 step 2 do print(x); +for z:-2 while z < 0 do print(z); +for m:0 unless m > 10 do print(m); +for x in [1, 2, 3] do print(x); +foo and bar or not baz; + +/* different kinds of integers */ + +ibase : 18 $ +[0, 1234, 1234., 0abcdefgh]; +reset (ibase) $ + +/* strings */ + +s1 : "\"now\" is"; +s2 : "the 'time' for all good men"; +print (s1, s2, "to come to the aid", + "of their country"); + +/* expressions */ + +foo (x, y, z) := + if x > 1 + y + then z - x*y + elseif y <= 100! + then x/(y + z)^2 + else z - y . x . y; diff --git a/yknjs/highlight.js/test/markup/maxima/numbers.expect.txt b/yknjs/highlight.js/test/markup/maxima/numbers.expect.txt new file mode 100644 index 0000000..61fc9dd --- /dev/null +++ b/yknjs/highlight.js/test/markup/maxima/numbers.expect.txt @@ -0,0 +1,24 @@ +0 +0. +12345. +12345 +0.0 +123.45 +0e0 +0b0 +12345e0 +12345e123 +12345e-123 +12345e+123 +12345b0 +12345b123 +12345b-123 +12345b+123 +1.2345e0 +1.2345e123 +1.2345e-123 +1.2345e+123 +1.2345b0 +1.2345b123 +1.2345b-123 +1.2345b+123 diff --git a/yknjs/highlight.js/test/markup/maxima/numbers.txt b/yknjs/highlight.js/test/markup/maxima/numbers.txt new file mode 100644 index 0000000..b93e4d5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/maxima/numbers.txt @@ -0,0 +1,24 @@ +0 +0. +12345. +12345 +0.0 +123.45 +0e0 +0b0 +12345e0 +12345e123 +12345e-123 +12345e+123 +12345b0 +12345b123 +12345b-123 +12345b+123 +1.2345e0 +1.2345e123 +1.2345e-123 +1.2345e+123 +1.2345b0 +1.2345b123 +1.2345b-123 +1.2345b+123 diff --git a/yknjs/highlight.js/test/markup/maxima/symbols.expect.txt b/yknjs/highlight.js/test/markup/maxima/symbols.expect.txt new file mode 100644 index 0000000..de72666 --- /dev/null +++ b/yknjs/highlight.js/test/markup/maxima/symbols.expect.txt @@ -0,0 +1,18 @@ +/* symbolic constants */ + +[true, false, unknown, inf, minf, ind, + und, %e, %i, %pi, %phi, %gamma]; + +/* built-in variables */ + +[_, __, %, %%, linel, simp, dispflag, + stringdisp, lispdisp, %edispflag]; + +/* built-in functions */ + +[sin, cosh, exp, atan2, sqrt, log, struve_h, + sublist_indices, read_array]; + +/* user-defined symbols */ + +[foo, ?bar, baz%, quux_mumble_blurf]; diff --git a/yknjs/highlight.js/test/markup/maxima/symbols.txt b/yknjs/highlight.js/test/markup/maxima/symbols.txt new file mode 100644 index 0000000..e22b0c2 --- /dev/null +++ b/yknjs/highlight.js/test/markup/maxima/symbols.txt @@ -0,0 +1,18 @@ +/* symbolic constants */ + +[true, false, unknown, inf, minf, ind, + und, %e, %i, %pi, %phi, %gamma]; + +/* built-in variables */ + +[_, __, %, %%, linel, simp, dispflag, + stringdisp, lispdisp, %edispflag]; + +/* built-in functions */ + +[sin, cosh, exp, atan2, sqrt, log, struve_h, + sublist_indices, read_array]; + +/* user-defined symbols */ + +[foo, ?bar, baz%, quux_mumble_blurf]; diff --git a/yknjs/highlight.js/test/markup/ocaml/literals.expect.txt b/yknjs/highlight.js/test/markup/ocaml/literals.expect.txt new file mode 100644 index 0000000..d0c95be --- /dev/null +++ b/yknjs/highlight.js/test/markup/ocaml/literals.expect.txt @@ -0,0 +1,29 @@ +let i = 14 +let i = -14 +let i = 1_000 +let i = 0b100 +let i = 0x1FF +let i = 0o777 +let i64 = 128L +let i64 = 0b10L +let i32 = 32l +let i32 = 0x12l +let nat = 10n +let nat = 0o644n +let f = 5. +let f = 5.1 +let f = 1e+1 +let f = 1e1 +let f = 1e-1 +let f = 1_024e12 +let f = 1L + +let b = true || false +let l = [] +let a = [||] +let () = ignore (b) + +let c = 'a' +let c = '\xFF' +let c = '\128' +let c = '\n' diff --git a/yknjs/highlight.js/test/markup/ocaml/literals.txt b/yknjs/highlight.js/test/markup/ocaml/literals.txt new file mode 100644 index 0000000..d9d3632 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ocaml/literals.txt @@ -0,0 +1,29 @@ +let i = 14 +let i = -14 +let i = 1_000 +let i = 0b100 +let i = 0x1FF +let i = 0o777 +let i64 = 128L +let i64 = 0b10L +let i32 = 32l +let i32 = 0x12l +let nat = 10n +let nat = 0o644n +let f = 5. +let f = 5.1 +let f = 1e+1 +let f = 1e1 +let f = 1e-1 +let f = 1_024e12 +let f = 1L + +let b = true || false +let l = [] +let a = [||] +let () = ignore (b) + +let c = 'a' +let c = '\xFF' +let c = '\128' +let c = '\n' diff --git a/yknjs/highlight.js/test/markup/ocaml/types.expect.txt b/yknjs/highlight.js/test/markup/ocaml/types.expect.txt new file mode 100644 index 0000000..1c28405 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ocaml/types.expect.txt @@ -0,0 +1,17 @@ +(* type variables *) +type 'a t = 'a list +let f (a : 'a list) : 'a = List.hd a + +(* polymorphic variants *) +type t = [ `A | `B ] + +(* variants *) +type result = Sat | Unsat | Unknown + +(* module and module types *) +module type S = sig + val compute : unit -> unit +end +module Impl : S = struct + let compute () = () +end diff --git a/yknjs/highlight.js/test/markup/ocaml/types.txt b/yknjs/highlight.js/test/markup/ocaml/types.txt new file mode 100644 index 0000000..c18ed56 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ocaml/types.txt @@ -0,0 +1,17 @@ +(* type variables *) +type 'a t = 'a list +let f (a : 'a list) : 'a = List.hd a + +(* polymorphic variants *) +type t = [ `A | `B ] + +(* variants *) +type result = Sat | Unsat | Unknown + +(* module and module types *) +module type S = sig + val compute : unit -> unit +end +module Impl : S = struct + let compute () = () +end diff --git a/yknjs/highlight.js/test/markup/pgsql/clauses.expect.txt b/yknjs/highlight.js/test/markup/pgsql/clauses.expect.txt new file mode 100644 index 0000000..736d57e --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/clauses.expect.txt @@ -0,0 +1,67 @@ +-- clauses + +ADD, ADD COLUMN, +ALTER, +DROP, DROP COLUMN, +SET, SET ( .. ), +ON, + ACCESS METHOD, + AGGREGATE, + ATTRIBUTE, + CASCADE, + COLLATION, + COLUMN, + CONFLICT, + CONSTRAINT, + CONVERSION, + DATABASE, + DEFAULT, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + EVENT TRIGGER, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FROM CURRENT, + FUNCTION, + IDENTITY, + INDEX, + ISOLATION LEVEL SERIALIZABLE, ISOLATION LEVEL REPEATABLE READ, + ISOLATION LEVEL READ COMMITTED, ISOLATION LEVEL READ UNCOMMITTED, + LARGE OBJECT, + LOGGED, UNLOGGED, + MAPPING FOR .. WITH .., MAPPING REPLACE .. WITH .., + MATERIALIZED VIEW, + NOT VALID, + OPERATOR, + OPERATOR CLASS .. USING .., + OPERATOR FAMILY .. USING .., + POLICY, + PROCEDURAL LANGUAGE, + PROCEDURE, + PUBLICATION, + READ WRITE, READ ONLY, + RESTRICT, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + STORAGE PLAIN, STORAGE EXTERNAL, STORAGE EXTENDED, STORAGE MAIN, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM FOR .. LANGUAGE SQL, + TRIGGER, + TYPE, + VALUE, + VIEW, + WITH OIDS, WITHOUT OIDS, + WITHOUT CLUSTER, +SET DATA TYPE; diff --git a/yknjs/highlight.js/test/markup/pgsql/clauses.txt b/yknjs/highlight.js/test/markup/pgsql/clauses.txt new file mode 100644 index 0000000..283429f --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/clauses.txt @@ -0,0 +1,67 @@ +-- clauses + +ADD, ADD COLUMN, +ALTER, +DROP, DROP COLUMN, +SET, SET ( .. ), +ON, + ACCESS METHOD, + AGGREGATE, + ATTRIBUTE, + CASCADE, + COLLATION, + COLUMN, + CONFLICT, + CONSTRAINT, + CONVERSION, + DATABASE, + DEFAULT, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + EVENT TRIGGER, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FROM CURRENT, + FUNCTION, + IDENTITY, + INDEX, + ISOLATION LEVEL SERIALIZABLE, ISOLATION LEVEL REPEATABLE READ, + ISOLATION LEVEL READ COMMITTED, ISOLATION LEVEL READ UNCOMMITTED, + LARGE OBJECT, + LOGGED, UNLOGGED, + MAPPING FOR .. WITH .., MAPPING REPLACE .. WITH .., + MATERIALIZED VIEW, + NOT VALID, + OPERATOR, + OPERATOR CLASS .. USING .., + OPERATOR FAMILY .. USING .., + POLICY, + PROCEDURAL LANGUAGE, + PROCEDURE, + PUBLICATION, + READ WRITE, READ ONLY, + RESTRICT, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + STORAGE PLAIN, STORAGE EXTERNAL, STORAGE EXTENDED, STORAGE MAIN, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM FOR .. LANGUAGE SQL, + TRIGGER, + TYPE, + VALUE, + VIEW, + WITH OIDS, WITHOUT OIDS, + WITHOUT CLUSTER, +SET DATA TYPE; diff --git a/yknjs/highlight.js/test/markup/pgsql/clauses2.expect.txt b/yknjs/highlight.js/test/markup/pgsql/clauses2.expect.txt new file mode 100644 index 0000000..9988ed9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/clauses2.expect.txt @@ -0,0 +1,160 @@ +-- clauses (part 2) + +ADMIN OPTION, +ALL, +ANALYZE, ANALYZE ( .. ), +AS ASSIGNMENT, AS IMPLICIT, +AS PERMISSIVE, AS RESTRICTIVE, +AS ENUM, AS RANGE, +AS ( .. ), -- select +ASC, DESC, +ATTACH PARTITION, +AUTHORIZATION, +BEFORE, AFTER, INSTEAD OF, +CACHE 100, NO CYCLE, +CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, +COLLATE, +CONCURRENTLY, +CONNECTION '..', +CONSTRAINT, +COST 100, +CLUSTER ON, +CURSOR, +DEPENDS ON EXTENSION, +DISABLE, ENABLE + REPLICA, ALWAYS, + TRIGGER, TRIGGER USER, REPLICA TRIGGER, ALWAYS TRIGGER, TRIGGER ALL, + RULE, REPLICA RULE, ALWAYS RULE, + ROW LEVEL SECURITY, FORCE ROW LEVEL SECURITY, NO FORCE ROW LEVEL SECURITY, +DISCARD PLANS, +DISTINCT, DISTINCT ON ( .. ), -- select +DO ALSO .., DO INSTEAD .., DO ALSO NOTHING, DO INSTEAD NOTHING, +DO NOTHING, DO UPDATE, +EXCEPT, +EXECUTE PROCEDURE, +EXPLAIN ( .. ), +EXTERNAL, +FAMILY, +FOR ROLE .. IN SCHEMA, +FOR USER, +FOR SEARCH, FOR ORDER BY, +FOR TABLE, FOR ALL TABLES, +FOR VALUES, FOR VALUES FROM .. TO, FOR VALUES IN ( .. ), +FOR ROW, FOR EACH ROW, FOR STATEMENT, FOR EACH STATEMENT, +FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE, FOR KEY SHARE, +FROM, +FROM '..', FROM PROGRAM, FROM STDIN, +FROM SQL WITH FUNCTION, TO SQL WITH FUNCTION, +FROM ( .. ), -- select +FUNCTION, FUNCTIONS, +GLOBAL, -- create global table +GROUP BY, +HAVING, +SELECT, + INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, USAGE, EXECUTE, ALL PRIVILEGES, + CONNECT, TEMPORARY, TEMP, +HANDLER, NO HANDLER +IF EXISTS, IF NOT EXISTS, +IMMUTABLE, +IN + ACCESS SHARE MODE, ROW SHARE MODE, ROW EXCLUSIVE MODE, SHARE UPDATE EXCLUSIVE MODE, + SHARE MODE, SHARE ROW EXCLUSIVE MODE, EXCLUSIVE MODE, ACCESS EXCLUSIVE MODE, +INCREMENT 100, INCREMENT BY 100, +INHERIT, NO INHERIT, +INHERITS ( .. ), +INLINE, +INTO, +JOIN, INNER JOIN, LEFT OUTER JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN, +LANGUAGE, +LATERAL, +LEAKPROOF, NOT LEAKPROOF, +LIMIT, LIMIT TO, +LOCAL, -- create local table, set +LOCATION, +MAXVALUE 100, NO MAXVALUE, +MINVALUE 100, NO MINVALUE, +NATURAL, +FETCH NEXT, FETCH PRIOR, FETCH FIRST, FETCH LAST, FETCH ABSOLUTE 10, FETCH RELATIVE 10, + FETCH ALL, FETCH FORWARD, FETCH FORWARD 10, FETCH FORWARD ALL, + FETCH BACKWARD, FETCH BACKWARD 10, FETCH BACKWARD ALL, +NOWAIT, +NULLS FIRST, NULLS LAST, +OFFSET 10 ROW, OFFSET 10 ROWS, -- select +ON TABLES, ON SEQUENCES, ON FUNCTIONS, ON ROUTINES, ON TYPES, ON SCHEMAS, +ON COMMIT PRESERVE ROWS, ON COMMIT DELETE ROWS, ON COMMIT DROP, +ONLY, +OPTIONS ( .. ), +OPERATOR, +OR REPLACE, +OVERRIDING SYSTEM VALUE, OVERRIDING USER VALUE, +OWNER TO .., OWNER TO CURRENT_USER, OWNER TO SESSION_USER, +OWNED BY, +PARALLEL UNSAFE, PARALLEL RESTRICTED, PARALLEL SAFE, +PARTITION BY RANGE (), PARTITION BY LIST (), PARTITION BY HASH (), +PARTITION OF .., +PREPARE, +PROCEDURAL, +PROCEDURES, +RECURSIVE, -- create view +REFERENCING OLD TABLE, REFERENCING NEW TABLE, +REFRESH VERSION, REFRESH PUBLICATION ( .. ), +REINDEX ( .. ), +REPEATABLE ( .. ), -- select +REPLICA IDENTITY + DEFAULT, USING INDEX, FULL, NOTHING, +RENAME + CONSTRAINT .. TO, TO, COLUMN .. TO, +RESET, RESET ALL, RESET ( .. ), +RESTART 100, RESTART WITH 100, +RESTART IDENTITY, CONTINUE IDENTITY, -- truncate +RETURNS, RETURNS TABLE ( .. ), +RETURNING, +ROLLUP ( .. ), CUBE ( .. ), GROUPING SETS ( .. ), +ROUTINES, +ROW, ROW ( .. ), +GRANT OPTION, +ROWS 100, +SCROLL CURSOR, NO SCROLL CURSOR, BINARY CURSOR, INSENSITIVE CURSOR, -- declare +SEQUENCES, +SECURITY INVOKER, SECURITY DEFINER, +SERVER, +SESSION, -- set +SKIP LOCKED, -- select +SNAPSHOT, -- set transaction +STABLE, +START 100, START WITH 100, +STORAGE, +STRICT, +SYSTEM, -- reindex +TABLES, +TABLESAMPLE, +TEMPORARY, TEMP, -- create sequence/table/view, discard +TO GROUP, PUBLIC WITH GRANT OPTION, +TO '..', TO PROGRAM, TO STDOUT, +TRANSFORM FOR TYPE, +TRUSTED, +TYPE, +UNIQUE, +UNION, INTERSECT, EXCEPT, -- select +UNLOGGED, +UPDATE TO, +USING .., USING ( .. ), +VACUUM ( .. ), +VALIDATE CONSTRAINT, +VALIDATOR, NO VALIDATOR, +VALUES, VALUES ( .. ), +VERBOSE, +VOLATILE, +WHEN ( .. ), +WHERE, WHERE CURRENT OF, +WINDOW, +WITH, WITH RECURSIVE, +WITH ALLOW_CONNECTIONS 10 CONNECTION LIMIT 1 IS_TEMPLATE true, +WITH CHECK ( .. ), +WITH DATA, WITH NO DATA, +WITH FUNCTION, WITHOUT FUNCTION, WITH INOUT, +WITH OPTIONS, +WITH ORDINALITY, -- select +WITH CASCADED CHECK OPTION, WITH LOCAL CHECK OPTION, +WITH HOLD, WITHOUT HOLD, -- declare +WITH, WITH ( .. ), (); diff --git a/yknjs/highlight.js/test/markup/pgsql/clauses2.txt b/yknjs/highlight.js/test/markup/pgsql/clauses2.txt new file mode 100644 index 0000000..f9e55fb --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/clauses2.txt @@ -0,0 +1,160 @@ +-- clauses (part 2) + +ADMIN OPTION, +ALL, +ANALYZE, ANALYZE ( .. ), +AS ASSIGNMENT, AS IMPLICIT, +AS PERMISSIVE, AS RESTRICTIVE, +AS ENUM, AS RANGE, +AS ( .. ), -- select +ASC, DESC, +ATTACH PARTITION, +AUTHORIZATION, +BEFORE, AFTER, INSTEAD OF, +CACHE 100, NO CYCLE, +CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, +COLLATE, +CONCURRENTLY, +CONNECTION '..', +CONSTRAINT, +COST 100, +CLUSTER ON, +CURSOR, +DEPENDS ON EXTENSION, +DISABLE, ENABLE + REPLICA, ALWAYS, + TRIGGER, TRIGGER USER, REPLICA TRIGGER, ALWAYS TRIGGER, TRIGGER ALL, + RULE, REPLICA RULE, ALWAYS RULE, + ROW LEVEL SECURITY, FORCE ROW LEVEL SECURITY, NO FORCE ROW LEVEL SECURITY, +DISCARD PLANS, +DISTINCT, DISTINCT ON ( .. ), -- select +DO ALSO .., DO INSTEAD .., DO ALSO NOTHING, DO INSTEAD NOTHING, +DO NOTHING, DO UPDATE, +EXCEPT, +EXECUTE PROCEDURE, +EXPLAIN ( .. ), +EXTERNAL, +FAMILY, +FOR ROLE .. IN SCHEMA, +FOR USER, +FOR SEARCH, FOR ORDER BY, +FOR TABLE, FOR ALL TABLES, +FOR VALUES, FOR VALUES FROM .. TO, FOR VALUES IN ( .. ), +FOR ROW, FOR EACH ROW, FOR STATEMENT, FOR EACH STATEMENT, +FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE, FOR KEY SHARE, +FROM, +FROM '..', FROM PROGRAM, FROM STDIN, +FROM SQL WITH FUNCTION, TO SQL WITH FUNCTION, +FROM ( .. ), -- select +FUNCTION, FUNCTIONS, +GLOBAL, -- create global table +GROUP BY, +HAVING, +SELECT, + INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, USAGE, EXECUTE, ALL PRIVILEGES, + CONNECT, TEMPORARY, TEMP, +HANDLER, NO HANDLER +IF EXISTS, IF NOT EXISTS, +IMMUTABLE, +IN + ACCESS SHARE MODE, ROW SHARE MODE, ROW EXCLUSIVE MODE, SHARE UPDATE EXCLUSIVE MODE, + SHARE MODE, SHARE ROW EXCLUSIVE MODE, EXCLUSIVE MODE, ACCESS EXCLUSIVE MODE, +INCREMENT 100, INCREMENT BY 100, +INHERIT, NO INHERIT, +INHERITS ( .. ), +INLINE, +INTO, +JOIN, INNER JOIN, LEFT OUTER JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN, +LANGUAGE, +LATERAL, +LEAKPROOF, NOT LEAKPROOF, +LIMIT, LIMIT TO, +LOCAL, -- create local table, set +LOCATION, +MAXVALUE 100, NO MAXVALUE, +MINVALUE 100, NO MINVALUE, +NATURAL, +FETCH NEXT, FETCH PRIOR, FETCH FIRST, FETCH LAST, FETCH ABSOLUTE 10, FETCH RELATIVE 10, + FETCH ALL, FETCH FORWARD, FETCH FORWARD 10, FETCH FORWARD ALL, + FETCH BACKWARD, FETCH BACKWARD 10, FETCH BACKWARD ALL, +NOWAIT, +NULLS FIRST, NULLS LAST, +OFFSET 10 ROW, OFFSET 10 ROWS, -- select +ON TABLES, ON SEQUENCES, ON FUNCTIONS, ON ROUTINES, ON TYPES, ON SCHEMAS, +ON COMMIT PRESERVE ROWS, ON COMMIT DELETE ROWS, ON COMMIT DROP, +ONLY, +OPTIONS ( .. ), +OPERATOR, +OR REPLACE, +OVERRIDING SYSTEM VALUE, OVERRIDING USER VALUE, +OWNER TO .., OWNER TO CURRENT_USER, OWNER TO SESSION_USER, +OWNED BY, +PARALLEL UNSAFE, PARALLEL RESTRICTED, PARALLEL SAFE, +PARTITION BY RANGE (), PARTITION BY LIST (), PARTITION BY HASH (), +PARTITION OF .., +PREPARE, +PROCEDURAL, +PROCEDURES, +RECURSIVE, -- create view +REFERENCING OLD TABLE, REFERENCING NEW TABLE, +REFRESH VERSION, REFRESH PUBLICATION ( .. ), +REINDEX ( .. ), +REPEATABLE ( .. ), -- select +REPLICA IDENTITY + DEFAULT, USING INDEX, FULL, NOTHING, +RENAME + CONSTRAINT .. TO, TO, COLUMN .. TO, +RESET, RESET ALL, RESET ( .. ), +RESTART 100, RESTART WITH 100, +RESTART IDENTITY, CONTINUE IDENTITY, -- truncate +RETURNS, RETURNS TABLE ( .. ), +RETURNING, +ROLLUP ( .. ), CUBE ( .. ), GROUPING SETS ( .. ), +ROUTINES, +ROW, ROW ( .. ), +GRANT OPTION, +ROWS 100, +SCROLL CURSOR, NO SCROLL CURSOR, BINARY CURSOR, INSENSITIVE CURSOR, -- declare +SEQUENCES, +SECURITY INVOKER, SECURITY DEFINER, +SERVER, +SESSION, -- set +SKIP LOCKED, -- select +SNAPSHOT, -- set transaction +STABLE, +START 100, START WITH 100, +STORAGE, +STRICT, +SYSTEM, -- reindex +TABLES, +TABLESAMPLE, +TEMPORARY, TEMP, -- create sequence/table/view, discard +TO GROUP, PUBLIC WITH GRANT OPTION, +TO '..', TO PROGRAM, TO STDOUT, +TRANSFORM FOR TYPE, +TRUSTED, +TYPE, +UNIQUE, +UNION, INTERSECT, EXCEPT, -- select +UNLOGGED, +UPDATE TO, +USING .., USING ( .. ), +VACUUM ( .. ), +VALIDATE CONSTRAINT, +VALIDATOR, NO VALIDATOR, +VALUES, VALUES ( .. ), +VERBOSE, +VOLATILE, +WHEN ( .. ), +WHERE, WHERE CURRENT OF, +WINDOW, +WITH, WITH RECURSIVE, +WITH ALLOW_CONNECTIONS 10 CONNECTION LIMIT 1 IS_TEMPLATE true, +WITH CHECK ( .. ), +WITH DATA, WITH NO DATA, +WITH FUNCTION, WITHOUT FUNCTION, WITH INOUT, +WITH OPTIONS, +WITH ORDINALITY, -- select +WITH CASCADED CHECK OPTION, WITH LOCAL CHECK OPTION, +WITH HOLD, WITHOUT HOLD, -- declare +WITH, WITH ( .. ), (); diff --git a/yknjs/highlight.js/test/markup/pgsql/constraints.expect.txt b/yknjs/highlight.js/test/markup/pgsql/constraints.expect.txt new file mode 100644 index 0000000..56d273a --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/constraints.expect.txt @@ -0,0 +1,21 @@ +-- column_constraint, table_constraint: + +CONSTRAINT, +NOT NULL, NULL, +CHECK ( .. ) NO INHERIT, +DEFAULT .., +EXCLUDE USING .. ( .. WITH .. ) .. WHERE ( .. ), +GENERATED ALWAYS AS IDENTITY, +GENERATED ALWAYS AS IDENTITY ( .. ), +GENERATED BY DEFAULT AS IDENTITY, +UNIQUE .., UNIQUE ( .. ), +PRIMARY KEY .., PRIMARY KEY ( .. ), +REFERENCES, REFERENCES .. ( .. ), +MATCH FULL, MATCH PARTIAL, MATCH SIMPLE, +ON DELETE .., ON UPDATE .., +DEFERRABLE, NOT DEFERRABLE, INITIALLY DEFERRED, INITIALLY IMMEDIATE, +FOREIGN KEY ( .. ) REFERENCES, +USING INDEX bar, +INCLUDE ( .. ), +WITH ( .. ), +USING INDEX TABLESPACE; diff --git a/yknjs/highlight.js/test/markup/pgsql/constraints.txt b/yknjs/highlight.js/test/markup/pgsql/constraints.txt new file mode 100644 index 0000000..6f0fdb5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/constraints.txt @@ -0,0 +1,21 @@ +-- column_constraint, table_constraint: + +CONSTRAINT, +NOT NULL, NULL, +CHECK ( .. ) NO INHERIT, +DEFAULT .., +EXCLUDE USING .. ( .. WITH .. ) .. WHERE ( .. ), +GENERATED ALWAYS AS IDENTITY, +GENERATED ALWAYS AS IDENTITY ( .. ), +GENERATED BY DEFAULT AS IDENTITY, +UNIQUE .., UNIQUE ( .. ), +PRIMARY KEY .., PRIMARY KEY ( .. ), +REFERENCES, REFERENCES .. ( .. ), +MATCH FULL, MATCH PARTIAL, MATCH SIMPLE, +ON DELETE .., ON UPDATE .., +DEFERRABLE, NOT DEFERRABLE, INITIALLY DEFERRED, INITIALLY IMMEDIATE, +FOREIGN KEY ( .. ) REFERENCES, +USING INDEX bar, +INCLUDE ( .. ), +WITH ( .. ), +USING INDEX TABLESPACE; diff --git a/yknjs/highlight.js/test/markup/pgsql/options.expect.txt b/yknjs/highlight.js/test/markup/pgsql/options.expect.txt new file mode 100644 index 0000000..d9b4414 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/options.expect.txt @@ -0,0 +1,44 @@ +-- options of some commands + +WITH, WITH ( .. ), (), + -- alter/create role + SUPERUSER, NOSUPERUSER, CREATEDB, NOCREATEDB, CREATEROLE, NOCREATEROLE, INHERIT, NOINHERIT, + LOGIN, NOLOGIN, REPLICATION, NOREPLICATION, BYPASSRLS, NOBYPASSRLS, CONNECTION LIMIT 100, + ENCRYPTED PASSWORD, UNENCRYPTED PASSWORD, VALID UNTIL '2020-01-01', + IN ROLE, IN GROUP, ROLE, ADMIN, USER, SYSID; + -- copy + FORMAT, OIDS, FREEZE, DELIMITER, NULL '..', HEADER, QUOTE, ESCAPE, FORCE_QUOTE, + FORCE_NOT_NULL, FORCE_NULL, ENCODING; + -- create aggregate + BASETYPE=, SFUNC=, STYPE=, SSPACE=, FINALFUNC=, FINALFUNC_EXTRA=, + FINALFUNC_MODIFY=, COMBINEFUNC=, SERIALFUNC=, DESERIALFUNC=, + INITCOND=, MSFUNC=, MINVFUNC=, MSTYPE=, MSSPACE=, MFINALFUNC=, MFINALFUNC_EXTRA=, + MFINALFUNC_MODIFY=, MINITCOND=, SORTOP=, PARALLEL=; + -- create collation + LOCALE=, LC_COLLATE=, LC_CTYPE=, PROVIDER=, VERSION=; + -- create dataase + OWNER=, TEMPLATE=, ENCODING=, LC_COLLATE=, LC_CTYPE=, TABLESPACE=, ALLOW_CONNECTIONS=, + CONNECTION LIMIT=, IS_TEMPLATE=; + -- create extension + SCHEMA, VERSION, FROM, CASCADE; + -- create operator + PROCEDURE=, LEFTARG=, RIGHTARG=, COMMUTATOR=, NEGATOR=, RESTRICT=, JOIN=, HASHES=, MERGES= + -- create text search configuration + PARSER=, COPY=; + -- create text search dictionary + TEMPLATE=; + -- create text search parser + START=, GETTOKEN=, END=, LEXTYPES=, HEADLINE=; + -- create text search template + INIT=, LEXIZE=; + -- create type + SUBTYPE=, SUBTYPE_OPCLASS=, COLLATION=, CANONICAL=, SUBTYPE_DIFF=, + INPUT=, OUTPUT=, RECEIVE=, SEND=, TYPMOD_IN=, TYPMOD_OUT=, ANALYZE=, INTERNALLENGTH=, PASSEDBYVALUE=, + ALIGNMENT=, STORAGE=, LIKE=, CATEGORY=, PREFERRED=, DEFAULT=, ELEMENT=, DELIMITER=, COLLATABLE=; + -- analyze/explain/vacuum + ANALYZE, VERBOSE, COSTS, BUFFERS, TIMING, SUMMARY, FORMAT TEXT, FORMAT XML, FORMAT JSON, + FORMAT YAML, FREEZE, FULL, DISABLE_PAGE_SKIPPING; + +-- table like options + +TABLE t1(LIKE t1 INCLUDING COMMENTS INCLUDING CONSTRAINTS EXCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING INDEXES INCLUDING STATISTICS INCLUDING STORAGE EXCLUDING ALL); diff --git a/yknjs/highlight.js/test/markup/pgsql/options.txt b/yknjs/highlight.js/test/markup/pgsql/options.txt new file mode 100644 index 0000000..17627c7 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/options.txt @@ -0,0 +1,44 @@ +-- options of some commands + +WITH, WITH ( .. ), (), + -- alter/create role + SUPERUSER, NOSUPERUSER, CREATEDB, NOCREATEDB, CREATEROLE, NOCREATEROLE, INHERIT, NOINHERIT, + LOGIN, NOLOGIN, REPLICATION, NOREPLICATION, BYPASSRLS, NOBYPASSRLS, CONNECTION LIMIT 100, + ENCRYPTED PASSWORD, UNENCRYPTED PASSWORD, VALID UNTIL '2020-01-01', + IN ROLE, IN GROUP, ROLE, ADMIN, USER, SYSID; + -- copy + FORMAT, OIDS, FREEZE, DELIMITER, NULL '..', HEADER, QUOTE, ESCAPE, FORCE_QUOTE, + FORCE_NOT_NULL, FORCE_NULL, ENCODING; + -- create aggregate + BASETYPE=, SFUNC=, STYPE=, SSPACE=, FINALFUNC=, FINALFUNC_EXTRA=, + FINALFUNC_MODIFY=, COMBINEFUNC=, SERIALFUNC=, DESERIALFUNC=, + INITCOND=, MSFUNC=, MINVFUNC=, MSTYPE=, MSSPACE=, MFINALFUNC=, MFINALFUNC_EXTRA=, + MFINALFUNC_MODIFY=, MINITCOND=, SORTOP=, PARALLEL=; + -- create collation + LOCALE=, LC_COLLATE=, LC_CTYPE=, PROVIDER=, VERSION=; + -- create dataase + OWNER=, TEMPLATE=, ENCODING=, LC_COLLATE=, LC_CTYPE=, TABLESPACE=, ALLOW_CONNECTIONS=, + CONNECTION LIMIT=, IS_TEMPLATE=; + -- create extension + SCHEMA, VERSION, FROM, CASCADE; + -- create operator + PROCEDURE=, LEFTARG=, RIGHTARG=, COMMUTATOR=, NEGATOR=, RESTRICT=, JOIN=, HASHES=, MERGES= + -- create text search configuration + PARSER=, COPY=; + -- create text search dictionary + TEMPLATE=; + -- create text search parser + START=, GETTOKEN=, END=, LEXTYPES=, HEADLINE=; + -- create text search template + INIT=, LEXIZE=; + -- create type + SUBTYPE=, SUBTYPE_OPCLASS=, COLLATION=, CANONICAL=, SUBTYPE_DIFF=, + INPUT=, OUTPUT=, RECEIVE=, SEND=, TYPMOD_IN=, TYPMOD_OUT=, ANALYZE=, INTERNALLENGTH=, PASSEDBYVALUE=, + ALIGNMENT=, STORAGE=, LIKE=, CATEGORY=, PREFERRED=, DEFAULT=, ELEMENT=, DELIMITER=, COLLATABLE=; + -- analyze/explain/vacuum + ANALYZE, VERBOSE, COSTS, BUFFERS, TIMING, SUMMARY, FORMAT TEXT, FORMAT XML, FORMAT JSON, + FORMAT YAML, FREEZE, FULL, DISABLE_PAGE_SKIPPING; + +-- table like options + +TABLE t1(LIKE t1 INCLUDING COMMENTS INCLUDING CONSTRAINTS EXCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING INDEXES INCLUDING STATISTICS INCLUDING STORAGE EXCLUDING ALL); diff --git a/yknjs/highlight.js/test/markup/pgsql/plpgsql.expect.txt b/yknjs/highlight.js/test/markup/pgsql/plpgsql.expect.txt new file mode 100644 index 0000000..5b1c494 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/plpgsql.expect.txt @@ -0,0 +1,61 @@ +-- PL/pgSQL + +<< outerblock >> +DECLARE + quantity integer := 30; + subtotal ALIAS FOR $1; + prior ALIAS FOR old; + arow record; + curs1 refcursor; + curs2 CURSOR FOR SELECT * FROM tenk1; +BEGIN + DECLARE + quantity CONSTANT integer := 80; + myrow tablename%ROWTYPE; + myfield tablename.columnname%TYPE; + BEGIN + PERFORM pg_sleep(1); + RAISE NOTICE 'Quantity here is %', quantity; + END; + + SELECT * INTO myrec FROM emp WHERE empname = myname; + + IF NOT FOUND THEN + EXIT <<outer_block>>; + ELSIF quantity < 0 THEN + ASSERT a > b, 'Bad luck'; + END IF; + + FOR r IN SELECT * FROM foo LOOP + CONTINUE WHEN count < 50; + END LOOP; + + FOR i IN REVERSE 10..1 LOOP + FOREACH x IN ARRAY $1 + LOOP + s := s + x; + END LOOP; + END LOOP; + + WHILE NOT done LOOP + CASE x + WHEN 1, 2 THEN RETURN NEXT r; + ELSE RETURN QUERY SELECT * FROM sales; + END CASE; + END LOOP; + + EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1' INTO c USING checked_user; + + OPEN curs1 SCROLL FOR SELECT * FROM foo WHERE key = mykey; + FETCH LAST FROM curs1 INTO x, y; + MOVE RELATIVE -2 FROM curs1; + UPDATE foo SET dataval = myval WHERE CURRENT OF curs1; + CLOSE curs1; + + RETURN quantity; +EXCEPTION + WHEN NO_DATA_FOUND THEN + GET DIAGNOSTICS integer_var = ROW_COUNT; + WHEN SQLSTATE '22012' THEN + NULL; +END; diff --git a/yknjs/highlight.js/test/markup/pgsql/plpgsql.txt b/yknjs/highlight.js/test/markup/pgsql/plpgsql.txt new file mode 100644 index 0000000..fcb22d1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/plpgsql.txt @@ -0,0 +1,61 @@ +-- PL/pgSQL + +<< outerblock >> +DECLARE + quantity integer := 30; + subtotal ALIAS FOR $1; + prior ALIAS FOR old; + arow record; + curs1 refcursor; + curs2 CURSOR FOR SELECT * FROM tenk1; +BEGIN + DECLARE + quantity CONSTANT integer := 80; + myrow tablename%ROWTYPE; + myfield tablename.columnname%TYPE; + BEGIN + PERFORM pg_sleep(1); + RAISE NOTICE 'Quantity here is %', quantity; + END; + + SELECT * INTO myrec FROM emp WHERE empname = myname; + + IF NOT FOUND THEN + EXIT <>; + ELSIF quantity < 0 THEN + ASSERT a > b, 'Bad luck'; + END IF; + + FOR r IN SELECT * FROM foo LOOP + CONTINUE WHEN count < 50; + END LOOP; + + FOR i IN REVERSE 10..1 LOOP + FOREACH x IN ARRAY $1 + LOOP + s := s + x; + END LOOP; + END LOOP; + + WHILE NOT done LOOP + CASE x + WHEN 1, 2 THEN RETURN NEXT r; + ELSE RETURN QUERY SELECT * FROM sales; + END CASE; + END LOOP; + + EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1' INTO c USING checked_user; + + OPEN curs1 SCROLL FOR SELECT * FROM foo WHERE key = mykey; + FETCH LAST FROM curs1 INTO x, y; + MOVE RELATIVE -2 FROM curs1; + UPDATE foo SET dataval = myval WHERE CURRENT OF curs1; + CLOSE curs1; + + RETURN quantity; +EXCEPTION + WHEN NO_DATA_FOUND THEN + GET DIAGNOSTICS integer_var = ROW_COUNT; + WHEN SQLSTATE '22012' THEN + NULL; +END; diff --git a/yknjs/highlight.js/test/markup/pgsql/sql-commands.expect.txt b/yknjs/highlight.js/test/markup/pgsql/sql-commands.expect.txt new file mode 100644 index 0000000..1b48f4f --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/sql-commands.expect.txt @@ -0,0 +1,99 @@ +-- SQL Commands + +ABORT WORK, ABORT TRANSACTION, +ANALYZE, +BEGIN WORK, BEGIN TRANSACTION, +CALL, +CHECKPOINT, +CLOSE, +CLUSTER, +COMMENT, +COMMIT WORK, COMMIT TRANSACTION, +COMMIT PREPARED, +COPY, +CREATE, ALTER, DROP + ACCESS METHOD, + AGGREGATE, + CAST, + COLLATION, + CONVERSION, + DATABASE, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FUNCTION, + GROUP, + INDEX, + LANGUAGE, + MATERIALIZED VIEW, + OPERATOR, + OPERATOR CLASS, + OPERATOR FAMILY, + POLICY, + PROCEDURE, + PUBLICATION, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM, + TRIGGER, + TYPE, + USER, + USER MAPPING, + VIEW, +DEALLOCATE, +DECLARE, +DELETE, +DISCARD, +DO, +END WORK, END TRANSACTION, +EXECUTE, +EXPLAIN, +FETCH, +GRANT, +IMPORT FOREIGN SCHEMA, +INSERT, +LISTEN, +LOAD, +LOCK, +MOVE, +NOTIFY, +PREPARE, +PREPARE TRANSACTION, +REASSIGN OWNED, +REFRESH MATERIALIZED VIEW, +REINDEX, +RELEASE SAVEPOINT, +RESET, +REVOKE, +ROLLBACK WORK, ROLLBACK TRANSACTION, +ROLLBACK PREPARED, +ROLLBACK TO SAVEPOINT, +SAVEPOINT, +SECURITY LABEL, +SELECT, +SET, +SET CONSTRAINTS, +SET ROLE, RESET ROLE, +SET SESSION AUTHORIZATION, RESET SESSION AUTHORIZATION, +SET TRANSACTION, SET SESSION CHARACTERISTICS AS TRANSACTION, +SHOW, +START TRANSACTION, +TRUNCATE, +UNLISTEN, +UPDATE, +VACUUM, +VALUES; diff --git a/yknjs/highlight.js/test/markup/pgsql/sql-commands.txt b/yknjs/highlight.js/test/markup/pgsql/sql-commands.txt new file mode 100644 index 0000000..7f8ae69 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/sql-commands.txt @@ -0,0 +1,99 @@ +-- SQL Commands + +ABORT WORK, ABORT TRANSACTION, +ANALYZE, +BEGIN WORK, BEGIN TRANSACTION, +CALL, +CHECKPOINT, +CLOSE, +CLUSTER, +COMMENT, +COMMIT WORK, COMMIT TRANSACTION, +COMMIT PREPARED, +COPY, +CREATE, ALTER, DROP + ACCESS METHOD, + AGGREGATE, + CAST, + COLLATION, + CONVERSION, + DATABASE, + DOMAIN, + EVENT TRIGGER, + EXTENSION, + FOREIGN DATA WRAPPER, + FOREIGN TABLE, + FUNCTION, + GROUP, + INDEX, + LANGUAGE, + MATERIALIZED VIEW, + OPERATOR, + OPERATOR CLASS, + OPERATOR FAMILY, + POLICY, + PROCEDURE, + PUBLICATION, + ROLE, + ROUTINE, + RULE, + SCHEMA, + SEQUENCE, + SERVER, + STATISTICS, + SUBSCRIPTION, + TABLE, + TABLESPACE, + TEXT SEARCH CONFIGURATION, + TEXT SEARCH DICTIONARY, + TEXT SEARCH PARSER, + TEXT SEARCH TEMPLATE, + TRANSFORM, + TRIGGER, + TYPE, + USER, + USER MAPPING, + VIEW, +DEALLOCATE, +DECLARE, +DELETE, +DISCARD, +DO, +END WORK, END TRANSACTION, +EXECUTE, +EXPLAIN, +FETCH, +GRANT, +IMPORT FOREIGN SCHEMA, +INSERT, +LISTEN, +LOAD, +LOCK, +MOVE, +NOTIFY, +PREPARE, +PREPARE TRANSACTION, +REASSIGN OWNED, +REFRESH MATERIALIZED VIEW, +REINDEX, +RELEASE SAVEPOINT, +RESET, +REVOKE, +ROLLBACK WORK, ROLLBACK TRANSACTION, +ROLLBACK PREPARED, +ROLLBACK TO SAVEPOINT, +SAVEPOINT, +SECURITY LABEL, +SELECT, +SET, +SET CONSTRAINTS, +SET ROLE, RESET ROLE, +SET SESSION AUTHORIZATION, RESET SESSION AUTHORIZATION, +SET TRANSACTION, SET SESSION CHARACTERISTICS AS TRANSACTION, +SHOW, +START TRANSACTION, +TRUNCATE, +UNLISTEN, +UPDATE, +VACUUM, +VALUES; diff --git a/yknjs/highlight.js/test/markup/pgsql/window-functions.expect.txt b/yknjs/highlight.js/test/markup/pgsql/window-functions.expect.txt new file mode 100644 index 0000000..ef85a33 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/window-functions.expect.txt @@ -0,0 +1,35 @@ +-- window functions + +-- frame clause: + +RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +RANGE 10 PRECEDING EXCLUDE GROUP, +RANGE CURRENT ROW EXCLUDE TIES, +RANGE 10 FOLLOWING EXCLUDE NO OTHERS, +RANGE UNBOUNDED FOLLOWING, +RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +ROWS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +ROWS 10 PRECEDING EXCLUDE GROUP, +ROWS CURRENT ROW EXCLUDE TIES, +ROWS 10 FOLLOWING EXCLUDE NO OTHERS, +ROWS UNBOUNDED FOLLOWING, +ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +GROUPS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +GROUPS 10 PRECEDING EXCLUDE GROUP, +GROUPS CURRENT ROW EXCLUDE TIES, +GROUPS 10 FOLLOWING EXCLUDE NO OTHERS, +GROUPS UNBOUNDED FOLLOWING, +GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +-- examples + +SELECT string_agg(empno, ',' ORDER BY a) FROM empsalary; +SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY income) FROM households; +SELECT count(*) FILTER (WHERE i < 5) FROM generate_series(1,10) AS s(i); +SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; +SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; +SELECT sum(salary) OVER w, avg(salary) OVER w + FROM empsalary + WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); diff --git a/yknjs/highlight.js/test/markup/pgsql/window-functions.txt b/yknjs/highlight.js/test/markup/pgsql/window-functions.txt new file mode 100644 index 0000000..8050fea --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/window-functions.txt @@ -0,0 +1,35 @@ +-- window functions + +-- frame clause: + +RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +RANGE 10 PRECEDING EXCLUDE GROUP, +RANGE CURRENT ROW EXCLUDE TIES, +RANGE 10 FOLLOWING EXCLUDE NO OTHERS, +RANGE UNBOUNDED FOLLOWING, +RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +ROWS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +ROWS 10 PRECEDING EXCLUDE GROUP, +ROWS CURRENT ROW EXCLUDE TIES, +ROWS 10 FOLLOWING EXCLUDE NO OTHERS, +ROWS UNBOUNDED FOLLOWING, +ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +GROUPS UNBOUNDED PRECEDING EXCLUDE CURRENT ROW, +GROUPS 10 PRECEDING EXCLUDE GROUP, +GROUPS CURRENT ROW EXCLUDE TIES, +GROUPS 10 FOLLOWING EXCLUDE NO OTHERS, +GROUPS UNBOUNDED FOLLOWING, +GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; + +-- examples + +SELECT string_agg(empno, ',' ORDER BY a) FROM empsalary; +SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY income) FROM households; +SELECT count(*) FILTER (WHERE i < 5) FROM generate_series(1,10) AS s(i); +SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; +SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; +SELECT sum(salary) OVER w, avg(salary) OVER w + FROM empsalary + WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); diff --git a/yknjs/highlight.js/test/markup/pgsql/xml.expect.txt b/yknjs/highlight.js/test/markup/pgsql/xml.expect.txt new file mode 100644 index 0000000..93ca3f6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/xml.expect.txt @@ -0,0 +1,47 @@ +-- xml + +XMLPARSE (DOCUMENT '...' PRESERVE WHITESPACE) +XMLPARSE (CONTENT '...' STRIP WHITESPACE) +XMLSERIALIZE ( DOCUMENT '...' AS text ) +XMLSERIALIZE ( CONTENT '...' AS text ) + +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; + +SELECT xmlcomment('...'); +SELECT xmlconcat('...', '...'); +SELECT xmlelement(name foo, xmlattributes('...' as bar)); +SELECT xmlforest('...' AS foo, 123 AS bar); +SELECT xmlpi(name php, '...'); +SELECT xmlroot(xmlparse(document '...'), version '...', standalone yes); +SELECT xmlagg(x ORDER BY y DESC) FROM test; + +SELECT xmlexists('...' PASSING BY REF '...'); + +SELECT xpath('...', '...', ARRAY[ARRAY['...', '...']]); +SELECT xpath_exists('...', '...', ARRAY[ARRAY['...', '...']]); + +SELECT XMLTABLE('...' PASSING data COLUMNS id int PATH '...' DEFAULT '...', ordinality FOR ORDINALITY) ; + +SELECT XMLTABLE(XMLNAMESPACES('...' AS x, '...' AS "B"), '...' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '...'); + +foo IS DOCUMENT +foo IS NOT DOCUMENT + +xml_is_well_formed(..) +xml_is_well_formed_document(..) +xml_is_well_formed_content(..) +table_to_xml(..) +query_to_xml(..) +cursor_to_xml(..) +table_to_xmlschema(..) +query_to_xmlschema(..) +cursor_to_xmlschema(..) +table_to_xml_and_xmlschema(..) +query_to_xml_and_xmlschema(..) +schema_to_xml(..) +schema_to_xmlschema(..) +schema_to_xml_and_xmlschema(..) +database_to_xml(..) +database_to_xmlschema(..) +database_to_xml_and_xmlschema(..) diff --git a/yknjs/highlight.js/test/markup/pgsql/xml.txt b/yknjs/highlight.js/test/markup/pgsql/xml.txt new file mode 100644 index 0000000..f925216 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pgsql/xml.txt @@ -0,0 +1,47 @@ +-- xml + +XMLPARSE (DOCUMENT '...' PRESERVE WHITESPACE) +XMLPARSE (CONTENT '...' STRIP WHITESPACE) +XMLSERIALIZE ( DOCUMENT '...' AS text ) +XMLSERIALIZE ( CONTENT '...' AS text ) + +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; + +SELECT xmlcomment('...'); +SELECT xmlconcat('...', '...'); +SELECT xmlelement(name foo, xmlattributes('...' as bar)); +SELECT xmlforest('...' AS foo, 123 AS bar); +SELECT xmlpi(name php, '...'); +SELECT xmlroot(xmlparse(document '...'), version '...', standalone yes); +SELECT xmlagg(x ORDER BY y DESC) FROM test; + +SELECT xmlexists('...' PASSING BY REF '...'); + +SELECT xpath('...', '...', ARRAY[ARRAY['...', '...']]); +SELECT xpath_exists('...', '...', ARRAY[ARRAY['...', '...']]); + +SELECT XMLTABLE('...' PASSING data COLUMNS id int PATH '...' DEFAULT '...', ordinality FOR ORDINALITY) ; + +SELECT XMLTABLE(XMLNAMESPACES('...' AS x, '...' AS "B"), '...' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '...'); + +foo IS DOCUMENT +foo IS NOT DOCUMENT + +xml_is_well_formed(..) +xml_is_well_formed_document(..) +xml_is_well_formed_content(..) +table_to_xml(..) +query_to_xml(..) +cursor_to_xml(..) +table_to_xmlschema(..) +query_to_xmlschema(..) +cursor_to_xmlschema(..) +table_to_xml_and_xmlschema(..) +query_to_xml_and_xmlschema(..) +schema_to_xml(..) +schema_to_xmlschema(..) +schema_to_xml_and_xmlschema(..) +database_to_xml(..) +database_to_xmlschema(..) +database_to_xml_and_xmlschema(..) diff --git a/yknjs/highlight.js/test/markup/php/comments.expect.txt b/yknjs/highlight.js/test/markup/php/comments.expect.txt new file mode 100644 index 0000000..a9e3312 --- /dev/null +++ b/yknjs/highlight.js/test/markup/php/comments.expect.txt @@ -0,0 +1,19 @@ +<?php + +/** + * @param int $a + * @return bool + */ +function isEven($a) { + return ($a % 2) === 0; +} + +/** + * TODO: Rely on isEven, but do not highlight bug. + * + * @param int $a + * @return bool + */ +function isOdd($a) { + return ($a % 2) === 1; +} diff --git a/yknjs/highlight.js/test/markup/php/comments.txt b/yknjs/highlight.js/test/markup/php/comments.txt new file mode 100644 index 0000000..f709f20 --- /dev/null +++ b/yknjs/highlight.js/test/markup/php/comments.txt @@ -0,0 +1,19 @@ +echo <<<EOT +String with $var and {$foo->bar[1]}. +EOT; + +echo <<<EOT + string + EOT + still string +EOT; + +array(<<<EOD +foobar! +EOD +); diff --git a/yknjs/highlight.js/test/markup/php/heredoc.txt b/yknjs/highlight.js/test/markup/php/heredoc.txt new file mode 100644 index 0000000..443d5fa --- /dev/null +++ b/yknjs/highlight.js/test/markup/php/heredoc.txt @@ -0,0 +1,14 @@ +echo <<bar[1]}. +EOT; + +echo <<if a == b and b == a then + env.out.print("they are the same") +elseif a > b or b < a then + env.out.print("a is bigger") +else + env.out.print("b bigger") +end + +while count <= 10 do + env.out.print(count.string()) + count = count + 1 +end + +for name in ["Bob"; "Fred"; "Sarah"].values() do + env.out.print(name) +end + +repeat + env.out.print("hello!") + counter = counter + 1 +until counter > 7 end \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/control-flow.txt b/yknjs/highlight.js/test/markup/pony/control-flow.txt new file mode 100644 index 0000000..b77f06a --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/control-flow.txt @@ -0,0 +1,21 @@ +if a == b and b == a then + env.out.print("they are the same") +elseif a > b or b < a then + env.out.print("a is bigger") +else + env.out.print("b bigger") +end + +while count <= 10 do + env.out.print(count.string()) + count = count + 1 +end + +for name in ["Bob"; "Fred"; "Sarah"].values() do + env.out.print(name) +end + +repeat + env.out.print("hello!") + counter = counter + 1 +until counter > 7 end \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/creator.expect.txt b/yknjs/highlight.js/test/markup/pony/creator.expect.txt new file mode 100644 index 0000000..fa15843 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/creator.expect.txt @@ -0,0 +1,3 @@ +new create(env: Env, name: String) => + _env = env + _name = name \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/creator.txt b/yknjs/highlight.js/test/markup/pony/creator.txt new file mode 100644 index 0000000..44013ff --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/creator.txt @@ -0,0 +1,3 @@ +new create(env: Env, name: String) => + _env = env + _name = name \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/iterface-trait.expect.txt b/yknjs/highlight.js/test/markup/pony/iterface-trait.expect.txt new file mode 100644 index 0000000..6a91001 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/iterface-trait.expect.txt @@ -0,0 +1,9 @@ +interface Iterator[A: A] + fun has_next(): Bool + fun next(): T? + +trait UnitTest + fun name(): String + fun ref set_up(h: TestHelper) ? => + None + fun apply(h: TestHelper) ? \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/iterface-trait.txt b/yknjs/highlight.js/test/markup/pony/iterface-trait.txt new file mode 100644 index 0000000..7f4e135 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/iterface-trait.txt @@ -0,0 +1,9 @@ +interface Iterator[A: A] + fun has_next(): Bool + fun next(): T? + +trait UnitTest + fun name(): String + fun ref set_up(h: TestHelper) ? => + None + fun apply(h: TestHelper) ? \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/lambda.expect.txt b/yknjs/highlight.js/test/markup/pony/lambda.expect.txt new file mode 100644 index 0000000..543b1e1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/lambda.expect.txt @@ -0,0 +1 @@ +{(foo: I32)(bar): String => (foo + bar).string()} diff --git a/yknjs/highlight.js/test/markup/pony/lambda.txt b/yknjs/highlight.js/test/markup/pony/lambda.txt new file mode 100644 index 0000000..327d779 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/lambda.txt @@ -0,0 +1 @@ +{(foo: I32)(bar): String => (foo + bar).string()} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/match.expect.txt b/yknjs/highlight.js/test/markup/pony/match.expect.txt new file mode 100644 index 0000000..44f23e3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/match.expect.txt @@ -0,0 +1,8 @@ +match foo +| true => "it's true" +| "bar" => "it's bar" +| let x: I32 if x > 3 => "it's greater than 3" +| let x: I32 => "it's less than or equal to 3" +else +"I don't know what it is" +end \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/match.txt b/yknjs/highlight.js/test/markup/pony/match.txt new file mode 100644 index 0000000..874bf09 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/match.txt @@ -0,0 +1,8 @@ +match foo +| true => "it's true" +| "bar" => "it's bar" +| let x: I32 if x > 3 => "it's greater than 3" +| let x: I32 => "it's less than or equal to 3" +else +"I don't know what it is" +end \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/method.expect.txt b/yknjs/highlight.js/test/markup/pony/method.expect.txt new file mode 100644 index 0000000..f4418b5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/method.expect.txt @@ -0,0 +1,8 @@ +fun foo(bar: String): String => + bar + "baz" + +new create(hunger: I32) => + _hunger = hunger + +be feed(food: I32) => + _hunger = _hunger - food \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/method.txt b/yknjs/highlight.js/test/markup/pony/method.txt new file mode 100644 index 0000000..1af3bcb --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/method.txt @@ -0,0 +1,8 @@ +fun foo(bar: String): String => + bar + "baz" + +new create(hunger: I32) => + _hunger = hunger + +be feed(food: I32) => + _hunger = _hunger - food \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/objects.expect.txt b/yknjs/highlight.js/test/markup/pony/objects.expect.txt new file mode 100644 index 0000000..34d5359 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/objects.expect.txt @@ -0,0 +1,11 @@ +primitive I32 is SignedInteger + +actor Main + +class ref List[A: A] is Seq[A] ref + +object is Hashable + +object iso + +primitive Foo is Bar iso \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/objects.txt b/yknjs/highlight.js/test/markup/pony/objects.txt new file mode 100644 index 0000000..c7be3d6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/objects.txt @@ -0,0 +1,11 @@ +primitive I32 is SignedInteger + +actor Main + +class ref List[A: A] is Seq[A] ref + +object is Hashable + +object iso + +primitive Foo is Bar iso \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/prime.expect.txt b/yknjs/highlight.js/test/markup/pony/prime.expect.txt new file mode 100644 index 0000000..1e4cbc8 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/prime.expect.txt @@ -0,0 +1,2 @@ +new create(name': String) => + name = name' + 'a' \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/prime.txt b/yknjs/highlight.js/test/markup/pony/prime.txt new file mode 100644 index 0000000..fdea080 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/prime.txt @@ -0,0 +1,2 @@ +new create(name': String) => + name = name' + 'a' diff --git a/yknjs/highlight.js/test/markup/pony/triple-quote.expect.txt b/yknjs/highlight.js/test/markup/pony/triple-quote.expect.txt new file mode 100644 index 0000000..9d862f4 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/triple-quote.expect.txt @@ -0,0 +1,5 @@ +""" +A triple quoted string +* Goes several lines +* Keeps formatting +""" \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/pony/triple-quote.txt b/yknjs/highlight.js/test/markup/pony/triple-quote.txt new file mode 100644 index 0000000..9294230 --- /dev/null +++ b/yknjs/highlight.js/test/markup/pony/triple-quote.txt @@ -0,0 +1,5 @@ +""" +A triple quoted string +* Goes several lines +* Keeps formatting +""" \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/powershell/apos-herestring.expect.txt b/yknjs/highlight.js/test/markup/powershell/apos-herestring.expect.txt new file mode 100644 index 0000000..8323231 --- /dev/null +++ b/yknjs/highlight.js/test/markup/powershell/apos-herestring.expect.txt @@ -0,0 +1,11 @@ +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +'@ + +This SHOULDNT be a part of the above strings span. + +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string'@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/powershell/apos-herestring.txt b/yknjs/highlight.js/test/markup/powershell/apos-herestring.txt new file mode 100644 index 0000000..704be67 --- /dev/null +++ b/yknjs/highlight.js/test/markup/powershell/apos-herestring.txt @@ -0,0 +1,11 @@ +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +'@ + +This SHOULDNT be a part of the above strings span. + +@' The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string'@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/powershell/quote-herestring.expect.txt b/yknjs/highlight.js/test/markup/powershell/quote-herestring.expect.txt new file mode 100644 index 0000000..3095015 --- /dev/null +++ b/yknjs/highlight.js/test/markup/powershell/quote-herestring.expect.txt @@ -0,0 +1,11 @@ +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +"@ + +This SHOULDNT be a part of the above strings span. + +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string"@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/powershell/quote-herestring.txt b/yknjs/highlight.js/test/markup/powershell/quote-herestring.txt new file mode 100644 index 0000000..5f352dc --- /dev/null +++ b/yknjs/highlight.js/test/markup/powershell/quote-herestring.txt @@ -0,0 +1,11 @@ +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +"@ + +This SHOULDNT be a part of the above strings span. + +@" The wild cat jumped over the $height-tall fence. + He did so with grace. +break-end-of-string"@ + +This SHOULD be a part of the above strings span. \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/properties/syntax.expect.txt b/yknjs/highlight.js/test/markup/properties/syntax.expect.txt new file mode 100644 index 0000000..45b473a --- /dev/null +++ b/yknjs/highlight.js/test/markup/properties/syntax.expect.txt @@ -0,0 +1,14 @@ +# comment + # comment +! comment + ! comment +key=val +key = val +key:val +key : val +key val +key val +key = val\ + val +key\ key\:\= val +key diff --git a/yknjs/highlight.js/test/markup/properties/syntax.txt b/yknjs/highlight.js/test/markup/properties/syntax.txt new file mode 100644 index 0000000..76a4a2b --- /dev/null +++ b/yknjs/highlight.js/test/markup/properties/syntax.txt @@ -0,0 +1,14 @@ +# comment + # comment +! comment + ! comment +key=val +key = val +key:val +key : val +key val +key val +key = val\ + val +key\ key\:\= val +key diff --git a/yknjs/highlight.js/test/markup/protobuf/message-message.expect.txt b/yknjs/highlight.js/test/markup/protobuf/message-message.expect.txt new file mode 100644 index 0000000..a2d827b --- /dev/null +++ b/yknjs/highlight.js/test/markup/protobuf/message-message.expect.txt @@ -0,0 +1,7 @@ +message Container { + message Message { + required int64 id = 1; + } + repeated Message messages = 1; + optional int32 number = 2; +} diff --git a/yknjs/highlight.js/test/markup/protobuf/message-message.txt b/yknjs/highlight.js/test/markup/protobuf/message-message.txt new file mode 100644 index 0000000..c4b6667 --- /dev/null +++ b/yknjs/highlight.js/test/markup/protobuf/message-message.txt @@ -0,0 +1,7 @@ +message Container { + message Message { + required int64 id = 1; + } + repeated Message messages = 1; + optional int32 number = 2; +} diff --git a/yknjs/highlight.js/test/markup/python/escaped-quotes.expect.txt b/yknjs/highlight.js/test/markup/python/escaped-quotes.expect.txt new file mode 100644 index 0000000..baabb66 --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/escaped-quotes.expect.txt @@ -0,0 +1,43 @@ +'''text \''' text''' +u'''text \''' text''' +b'''text \''' text''' +r'''text \''' text''' +ur'''text \''' text''' +br'''text \''' text''' + +"""text \""" text""" +u"""text \""" text""" +b"""text \""" text""" +r"""text \""" text""" +ur"""text \""" text""" +br"""text \""" text""" + +f'''text \''' text''' +fr'''text \''' text''' +rf'''text \''' text''' + +f"""text \""" text""" +fr"""text \""" text""" +rf"""text \""" text""" + +u'text \' text' +r'text \' text' +ur'text \' text' + +u"text \" text" +r"text \" text" +ur"text \" text" + +b'text \' text' +br'text \' text' + +b"text \" text" +br"text \" text" + +f'text \' text' +fr'text \' text' +rf'text \' text' + +f"text \" text" +fr"text \" text" +rf"text \" text" \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/python/escaped-quotes.txt b/yknjs/highlight.js/test/markup/python/escaped-quotes.txt new file mode 100644 index 0000000..68040c9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/escaped-quotes.txt @@ -0,0 +1,43 @@ +'''text \''' text''' +u'''text \''' text''' +b'''text \''' text''' +r'''text \''' text''' +ur'''text \''' text''' +br'''text \''' text''' + +"""text \""" text""" +u"""text \""" text""" +b"""text \""" text""" +r"""text \""" text""" +ur"""text \""" text""" +br"""text \""" text""" + +f'''text \''' text''' +fr'''text \''' text''' +rf'''text \''' text''' + +f"""text \""" text""" +fr"""text \""" text""" +rf"""text \""" text""" + +u'text \' text' +r'text \' text' +ur'text \' text' + +u"text \" text" +r"text \" text" +ur"text \" text" + +b'text \' text' +br'text \' text' + +b"text \" text" +br"text \" text" + +f'text \' text' +fr'text \' text' +rf'text \' text' + +f"text \" text" +fr"text \" text" +rf"text \" text" \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/python/f-strings.expect.txt b/yknjs/highlight.js/test/markup/python/f-strings.expect.txt new file mode 100644 index 0000000..7453e27 --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/f-strings.expect.txt @@ -0,0 +1,10 @@ +f'{name}' +f"{name + 5}" +>>> f""" +... { +... name +... } +... """ +rf"{name}" +fr"{name}" +f"{name + f'{name}'}" diff --git a/yknjs/highlight.js/test/markup/python/f-strings.txt b/yknjs/highlight.js/test/markup/python/f-strings.txt new file mode 100644 index 0000000..cc28a84 --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/f-strings.txt @@ -0,0 +1,10 @@ +f'{name}' +f"{name + 5}" +>>> f""" +... { +... name +... } +... """ +rf"{name}" +fr"{name}" +f"{name + f'{name}'}" diff --git a/yknjs/highlight.js/test/markup/python/function-header.expect.txt b/yknjs/highlight.js/test/markup/python/function-header.expect.txt new file mode 100644 index 0000000..cf3c8e5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/function-header.expect.txt @@ -0,0 +1,2 @@ +def f(x: int) -> None: + pass diff --git a/yknjs/highlight.js/test/markup/python/function-header.txt b/yknjs/highlight.js/test/markup/python/function-header.txt new file mode 100644 index 0000000..793e3be --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/function-header.txt @@ -0,0 +1,2 @@ +def f(x: int) -> None: + pass diff --git a/yknjs/highlight.js/test/markup/python/matrix-multiplication.expect.txt b/yknjs/highlight.js/test/markup/python/matrix-multiplication.expect.txt new file mode 100644 index 0000000..97323a1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/matrix-multiplication.expect.txt @@ -0,0 +1,7 @@ +@meta +class C: + + @decorator + def f(self, H, V, beta, r): + S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r) + return S diff --git a/yknjs/highlight.js/test/markup/python/matrix-multiplication.txt b/yknjs/highlight.js/test/markup/python/matrix-multiplication.txt new file mode 100644 index 0000000..1dfff4c --- /dev/null +++ b/yknjs/highlight.js/test/markup/python/matrix-multiplication.txt @@ -0,0 +1,7 @@ +@meta +class C: + + @decorator + def f(self, H, V, beta, r): + S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r) + return S diff --git a/yknjs/highlight.js/test/markup/reasonml/functions.expect.txt b/yknjs/highlight.js/test/markup/reasonml/functions.expect.txt new file mode 100644 index 0000000..bd4ad81 --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/functions.expect.txt @@ -0,0 +1,22 @@ +/* This is a simple function */ +let greet = (name) => "Hello World"; + +let body = `Plain("uploaded " ++ cacheServiceConfig.desc ++ "configuration data into cache on S3"); + +let getCacheConfigByEnv = + ( + environment: environment, + cacheServiceConfig: Js.Dict.t(cachingServiceConfig) + ) => + switch (cacheServiceConfig) { + | Some(config) => config + | None => + raise(InvalidEnvironment("Caching Service Coinfiguration is missing")) + }; + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/functions.txt b/yknjs/highlight.js/test/markup/reasonml/functions.txt new file mode 100644 index 0000000..f03ce9e --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/functions.txt @@ -0,0 +1,22 @@ +/* This is a simple function */ +let greet = (name) => "Hello World"; + +let body = `Plain("uploaded " ++ cacheServiceConfig.desc ++ "configuration data into cache on S3"); + +let getCacheConfigByEnv = + ( + environment: environment, + cacheServiceConfig: Js.Dict.t(cachingServiceConfig) + ) => + switch (cacheServiceConfig) { + | Some(config) => config + | None => + raise(InvalidEnvironment("Caching Service Coinfiguration is missing")) + }; + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/literals.expect.txt b/yknjs/highlight.js/test/markup/reasonml/literals.expect.txt new file mode 100644 index 0000000..ac88232 --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/literals.expect.txt @@ -0,0 +1,41 @@ +let i = 14; +let i = (-14); +let i = 1000; +let i = 0b100; +let i = 0x1FF; +let i = 0o777; +let i64 = 128L; +let i64 = 0b10L; +let i32 = 32l; +let i32 = 0x12l; +let nat = 10n; +let nat = 0o644n; +let f = 5.; +let f = 5.1; +let f = 1e+1; +let f = 1e1; +let f = 1e-1; +let f = 1024e12; +let f = 1L; + +let f = 23.0 +. 1.0; +let f = 2 / 23 * 1; +let f = 2.0 /. 23.0 *. 1.0; +let exp = 2.0 ** 2.0; + +let structual = true == false; +let reference = true === false; + +let b = true || false; +let l = []; +let a = [||]; +let arr = [|1, 2, 3|]; +let b = [item1, item2, ...theRest]; +let () = ignore(b); + +let str = "a" ++ "b"; + +let c = 'a'; +let c = '\xFF'; +let c = '\128'; +let c = '\n'; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/literals.txt b/yknjs/highlight.js/test/markup/reasonml/literals.txt new file mode 100644 index 0000000..d0f624d --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/literals.txt @@ -0,0 +1,41 @@ +let i = 14; +let i = (-14); +let i = 1000; +let i = 0b100; +let i = 0x1FF; +let i = 0o777; +let i64 = 128L; +let i64 = 0b10L; +let i32 = 32l; +let i32 = 0x12l; +let nat = 10n; +let nat = 0o644n; +let f = 5.; +let f = 5.1; +let f = 1e+1; +let f = 1e1; +let f = 1e-1; +let f = 1024e12; +let f = 1L; + +let f = 23.0 +. 1.0; +let f = 2 / 23 * 1; +let f = 2.0 /. 23.0 *. 1.0; +let exp = 2.0 ** 2.0; + +let structual = true == false; +let reference = true === false; + +let b = true || false; +let l = []; +let a = [||]; +let arr = [|1, 2, 3|]; +let b = [item1, item2, ...theRest]; +let () = ignore(b); + +let str = "a" ++ "b"; + +let c = 'a'; +let c = '\xFF'; +let c = '\128'; +let c = '\n'; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/modules.expect.txt b/yknjs/highlight.js/test/markup/reasonml/modules.expect.txt new file mode 100644 index 0000000..cff5a61 --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/modules.expect.txt @@ -0,0 +1,19 @@ +let decode = json => + Json.Decode.{ + query: json |> field("query", string), + cacheKey: json |> field("cacheKey", string), + desc: json |> field("desc", string), + lambda: json |> field("lambda", string), + }; + +Some.Bucket.Of.( + let value = stuff(); +); + +let value = Some.Bucket.Of.stuff(); + +module type RewiredModule = { + type t = { + name: string + }; +}; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/modules.txt b/yknjs/highlight.js/test/markup/reasonml/modules.txt new file mode 100644 index 0000000..014ac4e --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/modules.txt @@ -0,0 +1,19 @@ +let decode = json => + Json.Decode.{ + query: json |> field("query", string), + cacheKey: json |> field("cacheKey", string), + desc: json |> field("desc", string), + lambda: json |> field("lambda", string), + }; + +Some.Bucket.Of.( + let value = stuff(); +); + +let value = Some.Bucket.Of.stuff(); + +module type RewiredModule = { + type t = { + name: string + }; +}; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/pattern-matching.expect.txt b/yknjs/highlight.js/test/markup/reasonml/pattern-matching.expect.txt new file mode 100644 index 0000000..8ce0a3d --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/pattern-matching.expect.txt @@ -0,0 +1,20 @@ +let message = + switch (person1) { + | School.Teacher => "Hello teacher!" + | School.Director => "Hello director!" + }; + +let message = + School.( + switch (person1) { + | Teacher => "Hello teacher!" + | Director => "Hello director!" + } + ); + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/reasonml/pattern-matching.txt b/yknjs/highlight.js/test/markup/reasonml/pattern-matching.txt new file mode 100644 index 0000000..af87fa6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/reasonml/pattern-matching.txt @@ -0,0 +1,20 @@ +let message = + switch (person1) { + | School.Teacher => "Hello teacher!" + | School.Director => "Hello director!" + }; + +let message = + School.( + switch (person1) { + | Teacher => "Hello teacher!" + | Director => "Hello director!" + } + ); + +let readCacheServiceConfigAndDecode = (configJson) => + switch (configJson |> Js.Json.decodeObject) { + | None => raise(Json.Decode.DecodeError("Invalid Cache Config")) + | Some(data) => + data |> Js.Dict.map((. json) => CachingServiceConfig.decode(json)) + }; diff --git a/yknjs/highlight.js/test/markup/ruby/gemfile.expect.txt b/yknjs/highlight.js/test/markup/ruby/gemfile.expect.txt new file mode 100644 index 0000000..6051fc8 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/gemfile.expect.txt @@ -0,0 +1,3 @@ +gem "gem_name1", ">= 4.1" + +gem "gem_name2", "~> 4.1" diff --git a/yknjs/highlight.js/test/markup/ruby/gemfile.txt b/yknjs/highlight.js/test/markup/ruby/gemfile.txt new file mode 100644 index 0000000..bab6a60 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/gemfile.txt @@ -0,0 +1,3 @@ +gem "gem_name1", ">= 4.1" + +gem "gem_name2", "~> 4.1" diff --git a/yknjs/highlight.js/test/markup/ruby/heredoc.expect.txt b/yknjs/highlight.js/test/markup/ruby/heredoc.expect.txt new file mode 100644 index 0000000..18e27a5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/heredoc.expect.txt @@ -0,0 +1,8 @@ +def foo() + msg = <<-HTML + <div> + <h4>#{bar}</h4> + </div> + HTML + +def baz() diff --git a/yknjs/highlight.js/test/markup/ruby/heredoc.txt b/yknjs/highlight.js/test/markup/ruby/heredoc.txt new file mode 100644 index 0000000..15a8f08 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/heredoc.txt @@ -0,0 +1,8 @@ +def foo() + msg = <<-HTML +
    +

    #{bar}

    +
    + HTML + +def baz() diff --git a/yknjs/highlight.js/test/markup/ruby/prompt.expect.txt b/yknjs/highlight.js/test/markup/ruby/prompt.expect.txt new file mode 100644 index 0000000..b4634e6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/prompt.expect.txt @@ -0,0 +1,23 @@ +2.0.0p0 :001 > ['some'] + => ["some"] +2.0.0p0 :002 > if true +2.0.0p0 :003?> "yop" +2.0.0p0 :004?> end + => "yop" + +jruby-1.7.16 :001 > "RVM-Format" + +>> obj = OpenStruct.new :integer => 987, :symbol => :so_great +=> #<OpenStruct integer=987, symbol=:so_great> +>> [obj,obj,obj] +=> [#<OpenStruct integer=987, symbol=:so_great>, #<OpenStruct integer=987, symbol=:so_great>, #<OpenStruct integer=987, symbol=:so_great>] +>> {1 => obj, 2 => obj} +=> {1=>#<OpenStruct integer=987, symbol=:so_great>, 2=>#<OpenStruct integer=987, symbol=:so_great>} +>> if 10 > 20 +>> "YEAH" +>> else +?> "NO" +>> end +=> "NO" + +irb(main):002:0> test = 1 diff --git a/yknjs/highlight.js/test/markup/ruby/prompt.txt b/yknjs/highlight.js/test/markup/ruby/prompt.txt new file mode 100644 index 0000000..9ef7be6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/prompt.txt @@ -0,0 +1,23 @@ +2.0.0p0 :001 > ['some'] + => ["some"] +2.0.0p0 :002 > if true +2.0.0p0 :003?> "yop" +2.0.0p0 :004?> end + => "yop" + +jruby-1.7.16 :001 > "RVM-Format" + +>> obj = OpenStruct.new :integer => 987, :symbol => :so_great +=> # +>> [obj,obj,obj] +=> [#, #, #] +>> {1 => obj, 2 => obj} +=> {1=>#, 2=>#} +>> if 10 > 20 +>> "YEAH" +>> else +?> "NO" +>> end +=> "NO" + +irb(main):002:0> test = 1 diff --git a/yknjs/highlight.js/test/markup/ruby/regexes.expect.txt b/yknjs/highlight.js/test/markup/ruby/regexes.expect.txt new file mode 100644 index 0000000..0c10838 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/regexes.expect.txt @@ -0,0 +1,5 @@ +str =~ /^(?:foo)$/ +str =~ %r{foo|bar|buz$} +str =~ %r!foo|bar$! +str =~ %r[foo|bar$] +str =~ %r(\(foo|bar\)$) diff --git a/yknjs/highlight.js/test/markup/ruby/regexes.txt b/yknjs/highlight.js/test/markup/ruby/regexes.txt new file mode 100644 index 0000000..9d31e03 --- /dev/null +++ b/yknjs/highlight.js/test/markup/ruby/regexes.txt @@ -0,0 +1,5 @@ +str =~ /^(?:foo)$/ +str =~ %r{foo|bar|buz$} +str =~ %r!foo|bar$! +str =~ %r[foo|bar$] +str =~ %r(\(foo|bar\)$) diff --git a/yknjs/highlight.js/test/markup/rust/comments.expect.txt b/yknjs/highlight.js/test/markup/rust/comments.expect.txt new file mode 100644 index 0000000..bdc3090 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/comments.expect.txt @@ -0,0 +1,3 @@ +/* rust has +/* nested /* block */ */ +*/ comments diff --git a/yknjs/highlight.js/test/markup/rust/comments.txt b/yknjs/highlight.js/test/markup/rust/comments.txt new file mode 100644 index 0000000..d265d56 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/comments.txt @@ -0,0 +1,3 @@ +/* rust has +/* nested /* block */ */ +*/ comments diff --git a/yknjs/highlight.js/test/markup/rust/numbers.expect.txt b/yknjs/highlight.js/test/markup/rust/numbers.expect.txt new file mode 100644 index 0000000..64d7954 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/numbers.expect.txt @@ -0,0 +1,13 @@ +123; +123usize; +123_usize; +0xff00; +0xff_u8; +0b1111111110010000; +0b1111_1111_1001_0000_i32; +0o764317; +0o764317_u16; +123.0; +0.1; +0.1f32; +12E+99_f64; diff --git a/yknjs/highlight.js/test/markup/rust/numbers.txt b/yknjs/highlight.js/test/markup/rust/numbers.txt new file mode 100644 index 0000000..798e8b7 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/numbers.txt @@ -0,0 +1,13 @@ +123; +123usize; +123_usize; +0xff00; +0xff_u8; +0b1111111110010000; +0b1111_1111_1001_0000_i32; +0o764317; +0o764317_u16; +123.0; +0.1; +0.1f32; +12E+99_f64; diff --git a/yknjs/highlight.js/test/markup/rust/strings.expect.txt b/yknjs/highlight.js/test/markup/rust/strings.expect.txt new file mode 100644 index 0000000..c36dd7c --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/strings.expect.txt @@ -0,0 +1,14 @@ +'a'; +'\n'; +'\x1A'; +'\u12AS'; +'\U1234ASDF'; +b'a'; + +"hello"; +b"hello"; + +r"hello"; +r###"world"###; +r##" "### +"# "##; diff --git a/yknjs/highlight.js/test/markup/rust/strings.txt b/yknjs/highlight.js/test/markup/rust/strings.txt new file mode 100644 index 0000000..5a3da73 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/strings.txt @@ -0,0 +1,14 @@ +'a'; +'\n'; +'\x1A'; +'\u12AS'; +'\U1234ASDF'; +b'a'; + +"hello"; +b"hello"; + +r"hello"; +r###"world"###; +r##" "### +"# "##; diff --git a/yknjs/highlight.js/test/markup/rust/traits.expect.txt b/yknjs/highlight.js/test/markup/rust/traits.expect.txt new file mode 100644 index 0000000..2a96d67 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/traits.expect.txt @@ -0,0 +1,3 @@ +fn sqr(i: i32) { i * i } +trait Minimum : Copy {} +pub trait Builder where Self: Sized + Iterator<Item=Event> {} diff --git a/yknjs/highlight.js/test/markup/rust/traits.txt b/yknjs/highlight.js/test/markup/rust/traits.txt new file mode 100644 index 0000000..1a5b20d --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/traits.txt @@ -0,0 +1,3 @@ +fn sqr(i: i32) { i * i } +trait Minimum : Copy {} +pub trait Builder where Self: Sized + Iterator {} diff --git a/yknjs/highlight.js/test/markup/rust/types.expect.txt b/yknjs/highlight.js/test/markup/rust/types.expect.txt new file mode 100644 index 0000000..65ca8fd --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/types.expect.txt @@ -0,0 +1,4 @@ +type A: Trait; +type A; +type A = B; +type R<T> = m::R<T, ConcreteError> diff --git a/yknjs/highlight.js/test/markup/rust/types.txt b/yknjs/highlight.js/test/markup/rust/types.txt new file mode 100644 index 0000000..b8644e4 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/types.txt @@ -0,0 +1,4 @@ +type A: Trait; +type A; +type A = B; +type R = m::R diff --git a/yknjs/highlight.js/test/markup/rust/variables.expect.txt b/yknjs/highlight.js/test/markup/rust/variables.expect.txt new file mode 100644 index 0000000..a601118 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/variables.expect.txt @@ -0,0 +1,3 @@ +let foo; +let mut bar; +let _foo_bar; diff --git a/yknjs/highlight.js/test/markup/rust/variables.txt b/yknjs/highlight.js/test/markup/rust/variables.txt new file mode 100644 index 0000000..26420c1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/rust/variables.txt @@ -0,0 +1,3 @@ +let foo; +let mut bar; +let _foo_bar; diff --git a/yknjs/highlight.js/test/markup/scala/case-classes.expect.txt b/yknjs/highlight.js/test/markup/scala/case-classes.expect.txt new file mode 100644 index 0000000..162499f --- /dev/null +++ b/yknjs/highlight.js/test/markup/scala/case-classes.expect.txt @@ -0,0 +1,3 @@ +abstract class Vertical extends CaseJeu +case class Haut(name: String) extends Vertical +case class Bas(name: String) extends Vertical diff --git a/yknjs/highlight.js/test/markup/scala/case-classes.txt b/yknjs/highlight.js/test/markup/scala/case-classes.txt new file mode 100644 index 0000000..7b41555 --- /dev/null +++ b/yknjs/highlight.js/test/markup/scala/case-classes.txt @@ -0,0 +1,3 @@ +abstract class Vertical extends CaseJeu +case class Haut(name: String) extends Vertical +case class Bas(name: String) extends Vertical diff --git a/yknjs/highlight.js/test/markup/scheme/lambda.expect.txt b/yknjs/highlight.js/test/markup/scheme/lambda.expect.txt new file mode 100644 index 0000000..12c5b8e --- /dev/null +++ b/yknjs/highlight.js/test/markup/scheme/lambda.expect.txt @@ -0,0 +1 @@ +(lambda (x y z) (+ y z)) diff --git a/yknjs/highlight.js/test/markup/scheme/lambda.txt b/yknjs/highlight.js/test/markup/scheme/lambda.txt new file mode 100644 index 0000000..bcc4840 --- /dev/null +++ b/yknjs/highlight.js/test/markup/scheme/lambda.txt @@ -0,0 +1 @@ +(lambda (x y z) (+ y z)) diff --git a/yknjs/highlight.js/test/markup/scheme/quoted.expect.txt b/yknjs/highlight.js/test/markup/scheme/quoted.expect.txt new file mode 100644 index 0000000..a5bb8a8 --- /dev/null +++ b/yknjs/highlight.js/test/markup/scheme/quoted.expect.txt @@ -0,0 +1 @@ +(scheme 'a '(a quoted (list)) `(quoted)) diff --git a/yknjs/highlight.js/test/markup/scheme/quoted.txt b/yknjs/highlight.js/test/markup/scheme/quoted.txt new file mode 100644 index 0000000..8b44e05 --- /dev/null +++ b/yknjs/highlight.js/test/markup/scheme/quoted.txt @@ -0,0 +1 @@ +(scheme 'a '(a quoted (list)) `(quoted)) diff --git a/yknjs/highlight.js/test/markup/sql/interval.expect.txt b/yknjs/highlight.js/test/markup/sql/interval.expect.txt new file mode 100644 index 0000000..77073bf --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/interval.expect.txt @@ -0,0 +1,17 @@ +SELECT + CURRENT_TIMESTAMP + - INTERVAL 2 YEARS + + INTERVAL 1 MONTH + - INTERVAL 3 DAYS + + INTERVAL 10 HOURS + + interval 30 MINUTES + - INTERVAL 20 SECOND AS past_timestamp +FROM VALUES ("dummy"); + +WITH ts AS ( + SELECT CURRENT_TIMESTAMP AS now FROM VALUES ('dummy') + ) +SELECT + now - INTERVAL 1 DAY - INTERVAL 2 HOURS - INTERVAL 3 MINUTES - INTERVAL 4 SECONDS AS LONG_VERSION, + now - INTERVAL '1 2:3:4.100' DAY TO SECOND AS SHORT_VERSION +FROM ts; diff --git a/yknjs/highlight.js/test/markup/sql/interval.txt b/yknjs/highlight.js/test/markup/sql/interval.txt new file mode 100644 index 0000000..9f1657d --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/interval.txt @@ -0,0 +1,17 @@ +SELECT + CURRENT_TIMESTAMP + - INTERVAL 2 YEARS + + INTERVAL 1 MONTH + - INTERVAL 3 DAYS + + INTERVAL 10 HOURS + + interval 30 MINUTES + - INTERVAL 20 SECOND AS past_timestamp +FROM VALUES ("dummy"); + +WITH ts AS ( + SELECT CURRENT_TIMESTAMP AS now FROM VALUES ('dummy') + ) +SELECT + now - INTERVAL 1 DAY - INTERVAL 2 HOURS - INTERVAL 3 MINUTES - INTERVAL 4 SECONDS AS LONG_VERSION, + now - INTERVAL '1 2:3:4.100' DAY TO SECOND AS SHORT_VERSION +FROM ts; diff --git a/yknjs/highlight.js/test/markup/sql/join.expect.txt b/yknjs/highlight.js/test/markup/sql/join.expect.txt new file mode 100644 index 0000000..2389a7c --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/join.expect.txt @@ -0,0 +1,17 @@ +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + ANTI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; + +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + LEFT SEMI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; diff --git a/yknjs/highlight.js/test/markup/sql/join.txt b/yknjs/highlight.js/test/markup/sql/join.txt new file mode 100644 index 0000000..1383197 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/join.txt @@ -0,0 +1,17 @@ +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + ANTI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; + +SELECT + left_table.col1 AS l_col1, + left_table.col2 AS l_col2 +FROM + VALUES (0, 10), (1, 11), (2, 12), (3,13), (4, 14), (5, 14) AS left_table + LEFT SEMI JOIN + VALUES (0, 10), (2, 12), (4, 14), (6, 16) AS right_table + ON left_table.col1 = right_table.col1; diff --git a/yknjs/highlight.js/test/markup/sql/keywords.expect.txt b/yknjs/highlight.js/test/markup/sql/keywords.expect.txt new file mode 100644 index 0000000..b0e7270 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/keywords.expect.txt @@ -0,0 +1 @@ +select * from t where t.select is null; diff --git a/yknjs/highlight.js/test/markup/sql/keywords.txt b/yknjs/highlight.js/test/markup/sql/keywords.txt new file mode 100644 index 0000000..57ff166 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/keywords.txt @@ -0,0 +1 @@ +select * from t where t.select is null; diff --git a/yknjs/highlight.js/test/markup/sql/lateral-view.expect.txt b/yknjs/highlight.js/test/markup/sql/lateral-view.expect.txt new file mode 100644 index 0000000..006b309 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/lateral-view.expect.txt @@ -0,0 +1,7 @@ +SELECT + master_child.col1 AS master_id, + child_table.child_id +FROM VALUES + ( 1 , ARRAY(1,2,3)), + (2, ARRAY(4,5,6)) AS master_child +LATERAL VIEW EXPLODE(master_child.col2) child_table AS child_id; diff --git a/yknjs/highlight.js/test/markup/sql/lateral-view.txt b/yknjs/highlight.js/test/markup/sql/lateral-view.txt new file mode 100644 index 0000000..9a152f3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/lateral-view.txt @@ -0,0 +1,7 @@ +SELECT + master_child.col1 AS master_id, + child_table.child_id +FROM VALUES + ( 1 , ARRAY(1,2,3)), + (2, ARRAY(4,5,6)) AS master_child +LATERAL VIEW EXPLODE(master_child.col2) child_table AS child_id; diff --git a/yknjs/highlight.js/test/markup/sql/numeric-types.expect.txt b/yknjs/highlight.js/test/markup/sql/numeric-types.expect.txt new file mode 100644 index 0000000..2f5e035 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/numeric-types.expect.txt @@ -0,0 +1 @@ +SELECT CAST(32768 AS TINYINT) FROM VALUES('dummy'); diff --git a/yknjs/highlight.js/test/markup/sql/numeric-types.txt b/yknjs/highlight.js/test/markup/sql/numeric-types.txt new file mode 100644 index 0000000..ed7cec3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/numeric-types.txt @@ -0,0 +1 @@ +SELECT CAST(32768 AS TINYINT) FROM VALUES('dummy'); diff --git a/yknjs/highlight.js/test/markup/sql/set-operator.expect.txt b/yknjs/highlight.js/test/markup/sql/set-operator.expect.txt new file mode 100644 index 0000000..1c90ba5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/set-operator.expect.txt @@ -0,0 +1 @@ +SELECT * FROM VALUES 1, 2 ,3 UNION ALL VALUES 1, 2, 3; diff --git a/yknjs/highlight.js/test/markup/sql/set-operator.txt b/yknjs/highlight.js/test/markup/sql/set-operator.txt new file mode 100644 index 0000000..2fce4ac --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/set-operator.txt @@ -0,0 +1 @@ +SELECT * FROM VALUES 1, 2 ,3 UNION ALL VALUES 1, 2, 3; diff --git a/yknjs/highlight.js/test/markup/sql/tablesample.expect.txt b/yknjs/highlight.js/test/markup/sql/tablesample.expect.txt new file mode 100644 index 0000000..cb17d70 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/tablesample.expect.txt @@ -0,0 +1,5 @@ +SELECT * FROM orders TABLESAMPLE (500 ROWS); + +SELECT * FROM customers TABLESAMPLE (25 PERCENT); + +SELECT * FROM employees TABLESAMPLE (BUCKET 2 OUT OF 10); diff --git a/yknjs/highlight.js/test/markup/sql/tablesample.txt b/yknjs/highlight.js/test/markup/sql/tablesample.txt new file mode 100644 index 0000000..b9e50c1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/tablesample.txt @@ -0,0 +1,5 @@ +SELECT * FROM orders TABLESAMPLE (500 ROWS); + +SELECT * FROM customers TABLESAMPLE (25 PERCENT); + +SELECT * FROM employees TABLESAMPLE (BUCKET 2 OUT OF 10); diff --git a/yknjs/highlight.js/test/markup/sql/values-statement.expect.txt b/yknjs/highlight.js/test/markup/sql/values-statement.expect.txt new file mode 100644 index 0000000..91a0d6f --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/values-statement.expect.txt @@ -0,0 +1,7 @@ +VALUES 1, 2 , 3; + +VALUES + (1, 'Spock'), + (2,'Kirk') , + (3, 'McCoy'), + (4,'Scotty'); diff --git a/yknjs/highlight.js/test/markup/sql/values-statement.txt b/yknjs/highlight.js/test/markup/sql/values-statement.txt new file mode 100644 index 0000000..0245c70 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/values-statement.txt @@ -0,0 +1,7 @@ +VALUES 1, 2 , 3; + +VALUES + (1, 'Spock'), + (2,'Kirk') , + (3, 'McCoy'), + (4,'Scotty'); diff --git a/yknjs/highlight.js/test/markup/sql/window-function.expect.txt b/yknjs/highlight.js/test/markup/sql/window-function.expect.txt new file mode 100644 index 0000000..a6882aa --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/window-function.expect.txt @@ -0,0 +1,23 @@ +SELECT * +FROM ( + SELECT + posts.col1 AS emp_id, + posts.col2 AS dept_id, + posts.col3 AS posts, + DENSE_RANK() OVER post_ranking AS rank + FROM VALUES + (1, 1 ,100), + (2, 1 ,50), + (8, 1 ,250), + (3, 2 ,200), + (4, 2 ,300), + (9, 2 ,1000), + (5, 3 ,300), + (6, 3 ,100), + (7, 3 ,400) AS posts + WINDOW post_ranking AS ( + PARTITION BY posts.col2 + ORDER BY posts.col3 DESC + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +) +WHERE rank <= 2; diff --git a/yknjs/highlight.js/test/markup/sql/window-function.txt b/yknjs/highlight.js/test/markup/sql/window-function.txt new file mode 100644 index 0000000..a3dbf70 --- /dev/null +++ b/yknjs/highlight.js/test/markup/sql/window-function.txt @@ -0,0 +1,23 @@ +SELECT * +FROM ( + SELECT + posts.col1 AS emp_id, + posts.col2 AS dept_id, + posts.col3 AS posts, + DENSE_RANK() OVER post_ranking AS rank + FROM VALUES + (1, 1 ,100), + (2, 1 ,50), + (8, 1 ,250), + (3, 2 ,200), + (4, 2 ,300), + (9, 2 ,1000), + (5, 3 ,300), + (6, 3 ,100), + (7, 3 ,400) AS posts + WINDOW post_ranking AS ( + PARTITION BY posts.col2 + ORDER BY posts.col3 DESC + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +) +WHERE rank <= 2; diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-errorline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-errorline.expect.txt new file mode 100644 index 0000000..bf91c68 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-errorline.expect.txt @@ -0,0 +1,2 @@ +error: test simplename +error: test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-errorline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-errorline.txt new file mode 100644 index 0000000..2203d79 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-errorline.txt @@ -0,0 +1,2 @@ +error: test simplename +error: test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-failureline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-failureline.expect.txt new file mode 100644 index 0000000..b570feb --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-failureline.expect.txt @@ -0,0 +1,4 @@ +failure: test simplename1 +failure test simplename1 +failure: test simple name1 +failure test simple name1 diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-failureline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-failureline.txt new file mode 100644 index 0000000..495838c --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-failureline.txt @@ -0,0 +1,4 @@ +failure: test simplename1 +failure test simplename1 +failure: test simple name1 +failure test simple name1 diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-progressline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-progressline.expect.txt new file mode 100644 index 0000000..d72d157 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-progressline.expect.txt @@ -0,0 +1,7 @@ +progress: +5 +progress: +12 +progress: 29 +progress: -3 +progress: -91 +progress: push +progress: pop diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-progressline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-progressline.txt new file mode 100644 index 0000000..157114c --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-progressline.txt @@ -0,0 +1,7 @@ +progress: +5 +progress: +12 +progress: 29 +progress: -3 +progress: -91 +progress: push +progress: pop diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-skipline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-skipline.expect.txt new file mode 100644 index 0000000..7d34d4c --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-skipline.expect.txt @@ -0,0 +1,3 @@ +skip test simplename +skip: test simple name +skip test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-skipline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-skipline.txt new file mode 100644 index 0000000..e90c933 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-skipline.txt @@ -0,0 +1,3 @@ +skip test simplename +skip: test simple name +skip test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-successline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-successline.expect.txt new file mode 100644 index 0000000..f3e3ea0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-successline.expect.txt @@ -0,0 +1,8 @@ +success test simplename1 +success: test simplename2 +successful test simplename3 +successful: test simplename4 +success test simple name1 +success: test simple name2 +successful test simple name3 +successful: test simple name4 diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-successline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-successline.txt new file mode 100644 index 0000000..00b29e0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-successline.txt @@ -0,0 +1,8 @@ +success test simplename1 +success: test simplename2 +successful test simplename3 +successful: test simplename4 +success test simple name1 +success: test simple name2 +successful test simple name3 +successful: test simple name4 diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-tagline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-tagline.expect.txt new file mode 100644 index 0000000..cf91f36 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-tagline.expect.txt @@ -0,0 +1,5 @@ +tags: fuzz unit beta functional +tags: -functional basic -beta +tags: -unit +tags: unit +tags: ddd diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-tagline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-tagline.txt new file mode 100644 index 0000000..6e8d521 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-tagline.txt @@ -0,0 +1,5 @@ +tags: fuzz unit beta functional +tags: -functional basic -beta +tags: -unit +tags: unit +tags: ddd diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-testline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-testline.expect.txt new file mode 100644 index 0000000..f60f1a8 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-testline.expect.txt @@ -0,0 +1,10 @@ +test: test basicsuite1 +testing: test basicsuite1 +test test basicsuite1 +testing test basicsuite1 +test: test basic suite1 +testing: test basic suite1 +test test basic suite1 +testing test basic suite1 +testing test basic +test test 222 diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-testline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-testline.txt new file mode 100644 index 0000000..c11fd6d --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-testline.txt @@ -0,0 +1,10 @@ +test: test basicsuite1 +testing: test basicsuite1 +test test basicsuite1 +testing test basicsuite1 +test: test basic suite1 +testing: test basic suite1 +test test basic suite1 +testing test basic suite1 +testing test basic +test test 222 diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-timeline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-timeline.expect.txt new file mode 100644 index 0000000..897ca50 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-timeline.expect.txt @@ -0,0 +1,3 @@ +time: 2016-03-13 18:12:37.231080Z +time: 1917-10-25 09:05:37.231080Z +time: 1984-03-24 07:02:09.231080Z diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-timeline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-timeline.txt new file mode 100644 index 0000000..1bd6510 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-timeline.txt @@ -0,0 +1,3 @@ +time: 2016-03-13 18:12:37.231080Z +time: 1917-10-25 09:05:37.231080Z +time: 1984-03-24 07:02:09.231080Z diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.expect.txt new file mode 100644 index 0000000..e773e46 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.expect.txt @@ -0,0 +1,3 @@ +uxsuccess test simplename +uxsuccess: test simple name +uxsuccess test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.txt new file mode 100644 index 0000000..399a254 --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-uxsuccessline.txt @@ -0,0 +1,3 @@ +uxsuccess test simplename +uxsuccess: test simple name +uxsuccess test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-xfailline.expect.txt b/yknjs/highlight.js/test/markup/subunit/subunit-xfailline.expect.txt new file mode 100644 index 0000000..944c83f --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-xfailline.expect.txt @@ -0,0 +1,3 @@ +xfail test simplename +xfail: test simple name +xfail test simple name diff --git a/yknjs/highlight.js/test/markup/subunit/subunit-xfailline.txt b/yknjs/highlight.js/test/markup/subunit/subunit-xfailline.txt new file mode 100644 index 0000000..de0fabb --- /dev/null +++ b/yknjs/highlight.js/test/markup/subunit/subunit-xfailline.txt @@ -0,0 +1,3 @@ +xfail test simplename +xfail: test simple name +xfail test simple name diff --git a/yknjs/highlight.js/test/markup/swift/functions.expect.txt b/yknjs/highlight.js/test/markup/swift/functions.expect.txt new file mode 100644 index 0000000..a83afdf --- /dev/null +++ b/yknjs/highlight.js/test/markup/swift/functions.expect.txt @@ -0,0 +1,10 @@ +protocol Protocol { + func f1() + func f2() +} + +class MyClass { + func f() { + return true + } +} diff --git a/yknjs/highlight.js/test/markup/swift/functions.txt b/yknjs/highlight.js/test/markup/swift/functions.txt new file mode 100644 index 0000000..cfd64ae --- /dev/null +++ b/yknjs/highlight.js/test/markup/swift/functions.txt @@ -0,0 +1,10 @@ +protocol Protocol { + func f1() + func f2() +} + +class MyClass { + func f() { + return true + } +} diff --git a/yknjs/highlight.js/test/markup/swift/multiline-string.expect.txt b/yknjs/highlight.js/test/markup/swift/multiline-string.expect.txt new file mode 100644 index 0000000..452c44b --- /dev/null +++ b/yknjs/highlight.js/test/markup/swift/multiline-string.expect.txt @@ -0,0 +1,3 @@ +var string = """ + var a = not actually code +""" \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/swift/multiline-string.txt b/yknjs/highlight.js/test/markup/swift/multiline-string.txt new file mode 100644 index 0000000..56db376 --- /dev/null +++ b/yknjs/highlight.js/test/markup/swift/multiline-string.txt @@ -0,0 +1,3 @@ +var string = """ + var a = not actually code +""" \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/tap/basic.expect.txt b/yknjs/highlight.js/test/markup/tap/basic.expect.txt new file mode 100644 index 0000000..b0788be --- /dev/null +++ b/yknjs/highlight.js/test/markup/tap/basic.expect.txt @@ -0,0 +1,5 @@ +1..4 +ok 1 - Input file opened +not ok 2 - First line of the input valid +ok 3 - Read the rest of the file +not ok 4 - Summarized correctly # TODO Not written yet diff --git a/yknjs/highlight.js/test/markup/tap/basic.txt b/yknjs/highlight.js/test/markup/tap/basic.txt new file mode 100644 index 0000000..a0e46dd --- /dev/null +++ b/yknjs/highlight.js/test/markup/tap/basic.txt @@ -0,0 +1,5 @@ +1..4 +ok 1 - Input file opened +not ok 2 - First line of the input valid +ok 3 - Read the rest of the file +not ok 4 - Summarized correctly # TODO Not written yet diff --git a/yknjs/highlight.js/test/markup/tap/without-numbers.expect.txt b/yknjs/highlight.js/test/markup/tap/without-numbers.expect.txt new file mode 100644 index 0000000..2df4830 --- /dev/null +++ b/yknjs/highlight.js/test/markup/tap/without-numbers.expect.txt @@ -0,0 +1,6 @@ +1..6 +not ok +ok +not ok +ok +ok diff --git a/yknjs/highlight.js/test/markup/tap/without-numbers.txt b/yknjs/highlight.js/test/markup/tap/without-numbers.txt new file mode 100644 index 0000000..1b9be5a --- /dev/null +++ b/yknjs/highlight.js/test/markup/tap/without-numbers.txt @@ -0,0 +1,6 @@ +1..6 +not ok +ok +not ok +ok +ok diff --git a/yknjs/highlight.js/test/markup/tap/yaml-block.expect.txt b/yknjs/highlight.js/test/markup/tap/yaml-block.expect.txt new file mode 100644 index 0000000..9ec1463 --- /dev/null +++ b/yknjs/highlight.js/test/markup/tap/yaml-block.expect.txt @@ -0,0 +1,26 @@ +TAP version 13 +ok - created Board +ok +ok +ok +ok +ok +ok +ok + --- + message: "Board layout" + severity: comment + dump: + board: + - ' 16G 05C ' + - ' G N C C C G ' + - ' G C + ' + - '10C 01G 03C ' + - 'R N G G A G C C C ' + - ' R G C + ' + - ' 01G 17C 00C ' + - ' G A G G N R R N R ' + - ' G R G ' + ... +ok - board has 7 tiles + starter tile +1..9 diff --git a/yknjs/highlight.js/test/markup/tap/yaml-block.txt b/yknjs/highlight.js/test/markup/tap/yaml-block.txt new file mode 100644 index 0000000..23503b9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/tap/yaml-block.txt @@ -0,0 +1,26 @@ +TAP version 13 +ok - created Board +ok +ok +ok +ok +ok +ok +ok + --- + message: "Board layout" + severity: comment + dump: + board: + - ' 16G 05C ' + - ' G N C C C G ' + - ' G C + ' + - '10C 01G 03C ' + - 'R N G G A G C C C ' + - ' R G C + ' + - ' 01G 17C 00C ' + - ' G A G G N R R N R ' + - ' G R G ' + ... +ok - board has 7 tiles + starter tile +1..9 diff --git a/yknjs/highlight.js/test/markup/twig/filter_with_underscore.expect.txt b/yknjs/highlight.js/test/markup/twig/filter_with_underscore.expect.txt new file mode 100644 index 0000000..b08eb55 --- /dev/null +++ b/yknjs/highlight.js/test/markup/twig/filter_with_underscore.expect.txt @@ -0,0 +1 @@ +{{ "string with spaces"|url_encode }} diff --git a/yknjs/highlight.js/test/markup/twig/filter_with_underscore.txt b/yknjs/highlight.js/test/markup/twig/filter_with_underscore.txt new file mode 100644 index 0000000..14f61f0 --- /dev/null +++ b/yknjs/highlight.js/test/markup/twig/filter_with_underscore.txt @@ -0,0 +1 @@ +{{ "string with spaces"|url_encode }} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/twig/template_tags.expect.txt b/yknjs/highlight.js/test/markup/twig/template_tags.expect.txt new file mode 100644 index 0000000..a4840a2 --- /dev/null +++ b/yknjs/highlight.js/test/markup/twig/template_tags.expect.txt @@ -0,0 +1,12 @@ +{% if posts|length %} + {% for article in articles %} + &lt;div&gt; + {{ article.title|upper() }} + + {# outputs 'WELCOME' #} + &lt;/div&gt; + {% endfor %} +{% endif %} + +{% set user = json_encode(user) %} + diff --git a/yknjs/highlight.js/test/markup/twig/template_tags.txt b/yknjs/highlight.js/test/markup/twig/template_tags.txt new file mode 100644 index 0000000..23bd8ab --- /dev/null +++ b/yknjs/highlight.js/test/markup/twig/template_tags.txt @@ -0,0 +1,11 @@ +{% if posts|length %} + {% for article in articles %} + <div> + {{ article.title|upper() }} + + {# outputs 'WELCOME' #} + </div> + {% endfor %} +{% endif %} + +{% set user = json_encode(user) %} diff --git a/yknjs/highlight.js/test/markup/typescript/class.expect.txt b/yknjs/highlight.js/test/markup/typescript/class.expect.txt new file mode 100644 index 0000000..ff99191 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/class.expect.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/yknjs/highlight.js/test/markup/typescript/class.txt b/yknjs/highlight.js/test/markup/typescript/class.txt new file mode 100644 index 0000000..47fa67c --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/class.txt @@ -0,0 +1,11 @@ +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} diff --git a/yknjs/highlight.js/test/markup/typescript/decorator-factories.expect.txt b/yknjs/highlight.js/test/markup/typescript/decorator-factories.expect.txt new file mode 100644 index 0000000..08582b3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/decorator-factories.expect.txt @@ -0,0 +1,13 @@ +@foo('foo') +export class MyClass { + @baz(123) + private myAttribute: string; + + constructor(@bar(true) private x, + @bar(qux(quux(true))) private y) { } + + @bar() + private myMethod(@bar() z) { + console.log('Hello world.'); + } +} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/typescript/decorator-factories.txt b/yknjs/highlight.js/test/markup/typescript/decorator-factories.txt new file mode 100644 index 0000000..c8081c6 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/decorator-factories.txt @@ -0,0 +1,13 @@ +@foo('foo') +export class MyClass { + @baz(123) + private myAttribute: string; + + constructor(@bar(true) private x, + @bar(qux(quux(true))) private y) { } + + @bar() + private myMethod(@bar() z) { + console.log('Hello world.'); + } +} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/typescript/functions.expect.txt b/yknjs/highlight.js/test/markup/typescript/functions.expect.txt new file mode 100644 index 0000000..efff5b5 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/functions.expect.txt @@ -0,0 +1,11 @@ +var noop = function() {}; + +var identity = function(foo) { + return foo; +}; + +function println(value: string); + +function getArray(): number[] { + return [1, 2]; +} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/typescript/functions.txt b/yknjs/highlight.js/test/markup/typescript/functions.txt new file mode 100644 index 0000000..5e4f9a9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/functions.txt @@ -0,0 +1,11 @@ +var noop = function() {}; + +var identity = function(foo) { + return foo; +}; + +function println(value: string); + +function getArray(): number[] { + return [1, 2]; +} diff --git a/yknjs/highlight.js/test/markup/typescript/jsx.expect.txt b/yknjs/highlight.js/test/markup/typescript/jsx.expect.txt new file mode 100644 index 0000000..8d3c418 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/jsx.expect.txt @@ -0,0 +1,41 @@ +export function getModuleInstanceState(node: Node): ModuleInstanceState { + // A module is uninstantiated if it contains only + // 1. interface declarations, type alias declarations + if (node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) { + return ModuleInstanceState.NonInstantiated; + } + // 2. const enum declarations + else if (isConstEnumDeclaration(node)) { + return ModuleInstanceState.ConstEnumOnly; + } + // 3. non-exported import declarations + else if ((node.kind === SyntaxKind.ImportDeclaration || node.kind === SyntaxKind.ImportEqualsDeclaration) && !(node.flags & NodeFlags.Export)) { + return ModuleInstanceState.NonInstantiated; + } + // 4. other uninstantiated module declarations. + else if (node.kind === SyntaxKind.ModuleBlock) { + let state = ModuleInstanceState.NonInstantiated; + forEachChild(node, n => { + switch (getModuleInstanceState(n)) { + case ModuleInstanceState.NonInstantiated: + // child is non-instantiated - continue searching + return false; + case ModuleInstanceState.ConstEnumOnly: + // child is const enum only - record state and continue searching + state = ModuleInstanceState.ConstEnumOnly; + return false; + case ModuleInstanceState.Instantiated: + // child is instantiated - record state and stop + state = ModuleInstanceState.Instantiated; + return true; + } + }); + return state; + } + else if (node.kind === SyntaxKind.ModuleDeclaration) { + return getModuleInstanceState((<ModuleDeclaration>node).body); + } + else { + return ModuleInstanceState.Instantiated; + } +} diff --git a/yknjs/highlight.js/test/markup/typescript/jsx.txt b/yknjs/highlight.js/test/markup/typescript/jsx.txt new file mode 100644 index 0000000..72d8fe3 --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/jsx.txt @@ -0,0 +1,41 @@ +export function getModuleInstanceState(node: Node): ModuleInstanceState { + // A module is uninstantiated if it contains only + // 1. interface declarations, type alias declarations + if (node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) { + return ModuleInstanceState.NonInstantiated; + } + // 2. const enum declarations + else if (isConstEnumDeclaration(node)) { + return ModuleInstanceState.ConstEnumOnly; + } + // 3. non-exported import declarations + else if ((node.kind === SyntaxKind.ImportDeclaration || node.kind === SyntaxKind.ImportEqualsDeclaration) && !(node.flags & NodeFlags.Export)) { + return ModuleInstanceState.NonInstantiated; + } + // 4. other uninstantiated module declarations. + else if (node.kind === SyntaxKind.ModuleBlock) { + let state = ModuleInstanceState.NonInstantiated; + forEachChild(node, n => { + switch (getModuleInstanceState(n)) { + case ModuleInstanceState.NonInstantiated: + // child is non-instantiated - continue searching + return false; + case ModuleInstanceState.ConstEnumOnly: + // child is const enum only - record state and continue searching + state = ModuleInstanceState.ConstEnumOnly; + return false; + case ModuleInstanceState.Instantiated: + // child is instantiated - record state and stop + state = ModuleInstanceState.Instantiated; + return true; + } + }); + return state; + } + else if (node.kind === SyntaxKind.ModuleDeclaration) { + return getModuleInstanceState((node).body); + } + else { + return ModuleInstanceState.Instantiated; + } +} diff --git a/yknjs/highlight.js/test/markup/typescript/module-id.expect.txt b/yknjs/highlight.js/test/markup/typescript/module-id.expect.txt new file mode 100644 index 0000000..ae1092f --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/module-id.expect.txt @@ -0,0 +1,14 @@ +@Component({ + selector: 'my-example', + directives: [SomeDirective], + templateUrl: './my-example.component.html', + moduleId: module.id, + styles: [` + .my-example { + padding: 5px; + } + `] +}) +export class MyExampleComponent { + someProp: string = "blah"; +} diff --git a/yknjs/highlight.js/test/markup/typescript/module-id.txt b/yknjs/highlight.js/test/markup/typescript/module-id.txt new file mode 100644 index 0000000..ed0ebbb --- /dev/null +++ b/yknjs/highlight.js/test/markup/typescript/module-id.txt @@ -0,0 +1,14 @@ +@Component({ + selector: 'my-example', + directives: [SomeDirective], + templateUrl: './my-example.component.html', + moduleId: module.id, + styles: [` + .my-example { + padding: 5px; + } + `] +}) +export class MyExampleComponent { + someProp: string = "blah"; +} \ No newline at end of file diff --git a/yknjs/highlight.js/test/markup/verilog/misc.expect.txt b/yknjs/highlight.js/test/markup/verilog/misc.expect.txt new file mode 100644 index 0000000..e665ae1 --- /dev/null +++ b/yknjs/highlight.js/test/markup/verilog/misc.expect.txt @@ -0,0 +1,37 @@ +`timescale 1ns / 1ps + +/** + * counter: a generic clearable up-counter + */ + +module counter + #(parameter WIDTH=64) + ( + input clk, + input ce, + input arst_n, + output reg [WIDTH-1:0] q + ); + + // some child + clock_buffer #(WIDTH) buffer_inst ( + .clk(clk), + .ce(ce), + .reset(arst_n) + ); + + // Simple gated up-counter with async clear + + always @(posedge clk or negedge arst_n) begin + if (arst_n == 1'b0) begin + q <= {WIDTH {1'b0}}; + end + else begin + q <= q; + if (ce == 1'b1) begin + q <= q + 1; + end + end + end + +endmodule diff --git a/yknjs/highlight.js/test/markup/verilog/misc.txt b/yknjs/highlight.js/test/markup/verilog/misc.txt new file mode 100644 index 0000000..5db8cfd --- /dev/null +++ b/yknjs/highlight.js/test/markup/verilog/misc.txt @@ -0,0 +1,37 @@ +`timescale 1ns / 1ps + +/** + * counter: a generic clearable up-counter + */ + +module counter + #(parameter WIDTH=64) + ( + input clk, + input ce, + input arst_n, + output reg [WIDTH-1:0] q + ); + + // some child + clock_buffer #(WIDTH) buffer_inst ( + .clk(clk), + .ce(ce), + .reset(arst_n) + ); + + // Simple gated up-counter with async clear + + always @(posedge clk or negedge arst_n) begin + if (arst_n == 1'b0) begin + q <= {WIDTH {1'b0}}; + end + else begin + q <= q; + if (ce == 1'b1) begin + q <= q + 1; + end + end + end + +endmodule diff --git a/yknjs/highlight.js/test/markup/verilog/numbers.expect.txt b/yknjs/highlight.js/test/markup/verilog/numbers.expect.txt new file mode 100644 index 0000000..d29935f --- /dev/null +++ b/yknjs/highlight.js/test/markup/verilog/numbers.expect.txt @@ -0,0 +1,8 @@ +a = 'hff; +A = 'HFF; +b = 8'h33; +B = 8'H33; +c = 12; +d = 'o755; +e = 8'b1001_0001; +f = 8'b1111zzzx; diff --git a/yknjs/highlight.js/test/markup/verilog/numbers.txt b/yknjs/highlight.js/test/markup/verilog/numbers.txt new file mode 100644 index 0000000..d8a2406 --- /dev/null +++ b/yknjs/highlight.js/test/markup/verilog/numbers.txt @@ -0,0 +1,8 @@ +a = 'hff; +A = 'HFF; +b = 8'h33; +B = 8'H33; +c = 12; +d = 'o755; +e = 8'b1001_0001; +f = 8'b1111zzzx; diff --git a/yknjs/highlight.js/test/markup/vim/strings-comments.expect.txt b/yknjs/highlight.js/test/markup/vim/strings-comments.expect.txt new file mode 100644 index 0000000..77ba698 --- /dev/null +++ b/yknjs/highlight.js/test/markup/vim/strings-comments.expect.txt @@ -0,0 +1,4 @@ +" comment +let one = "string" " comment +let two = "crazy +\ string with a \" quote" diff --git a/yknjs/highlight.js/test/markup/vim/strings-comments.txt b/yknjs/highlight.js/test/markup/vim/strings-comments.txt new file mode 100644 index 0000000..d0be92d --- /dev/null +++ b/yknjs/highlight.js/test/markup/vim/strings-comments.txt @@ -0,0 +1,4 @@ +" comment +let one = "string" " comment +let two = "crazy +\ string with a \" quote" diff --git a/yknjs/highlight.js/test/markup/x86asm/labels-directives.expect.txt b/yknjs/highlight.js/test/markup/x86asm/labels-directives.expect.txt new file mode 100644 index 0000000..801d661 --- /dev/null +++ b/yknjs/highlight.js/test/markup/x86asm/labels-directives.expect.txt @@ -0,0 +1,6 @@ + .cfi_startproc +_ZN3lib13is_whitespace17h28afa23272bf056bE: + .align 16, 0x90 + ja .Lfunc_end0 +.Lfunc_end0: + ret diff --git a/yknjs/highlight.js/test/markup/x86asm/labels-directives.txt b/yknjs/highlight.js/test/markup/x86asm/labels-directives.txt new file mode 100644 index 0000000..127e6e9 --- /dev/null +++ b/yknjs/highlight.js/test/markup/x86asm/labels-directives.txt @@ -0,0 +1,6 @@ + .cfi_startproc +_ZN3lib13is_whitespace17h28afa23272bf056bE: + .align 16, 0x90 + ja .Lfunc_end0 +.Lfunc_end0: + ret diff --git a/yknjs/highlight.js/test/markup/xml/space-attributes.expect.txt b/yknjs/highlight.js/test/markup/xml/space-attributes.expect.txt new file mode 100644 index 0000000..560fc87 --- /dev/null +++ b/yknjs/highlight.js/test/markup/xml/space-attributes.expect.txt @@ -0,0 +1,3 @@ +<img src ="/pics/foo.jpg"> +<img src= "/pics/foo.jpg"> +<img src = "/pics/foo.jpg"> diff --git a/yknjs/highlight.js/test/markup/xml/space-attributes.txt b/yknjs/highlight.js/test/markup/xml/space-attributes.txt new file mode 100644 index 0000000..fb633af --- /dev/null +++ b/yknjs/highlight.js/test/markup/xml/space-attributes.txt @@ -0,0 +1,3 @@ + + + diff --git a/yknjs/highlight.js/test/markup/xml/unquoted-attributes.expect.txt b/yknjs/highlight.js/test/markup/xml/unquoted-attributes.expect.txt new file mode 100644 index 0000000..621a51f --- /dev/null +++ b/yknjs/highlight.js/test/markup/xml/unquoted-attributes.expect.txt @@ -0,0 +1,9 @@ +<img src="/pics/foo.jpg"> +<img src='/pics/foo.jpg'> +<img src=/pics/foo.jpg> +<img src=/pics/> +<img src=/pics /> +<img alt=''/> +<img alt/> +<img alt=''> +<img alt> diff --git a/yknjs/highlight.js/test/markup/xml/unquoted-attributes.txt b/yknjs/highlight.js/test/markup/xml/unquoted-attributes.txt new file mode 100644 index 0000000..cd19065 --- /dev/null +++ b/yknjs/highlight.js/test/markup/xml/unquoted-attributes.txt @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/yknjs/highlight.js/test/markup/xquery/computed_inbuilt.expect.txt b/yknjs/highlight.js/test/markup/xquery/computed_inbuilt.expect.txt new file mode 100644 index 0000000..a902c95 --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/computed_inbuilt.expect.txt @@ -0,0 +1,9 @@ +xquery version "3.1"; +let $root := element {fn:node-name($e)} + {$e/@*, 2 * fn:data($e)} + +for $node in root($root) +return + element root { root ($node)/text(), attribute root {'root'}, +element not-root{attribute type{"root"}, root($root)} +} diff --git a/yknjs/highlight.js/test/markup/xquery/computed_inbuilt.txt b/yknjs/highlight.js/test/markup/xquery/computed_inbuilt.txt new file mode 100644 index 0000000..2b2ea91 --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/computed_inbuilt.txt @@ -0,0 +1,9 @@ +xquery version "3.1"; +let $root := element {fn:node-name($e)} + {$e/@*, 2 * fn:data($e)} + +for $node in root($root) +return + element root { root ($node)/text(), attribute root {'root'}, +element not-root{attribute type{"root"}, root($root)} +} diff --git a/yknjs/highlight.js/test/markup/xquery/direct_method.expect.txt b/yknjs/highlight.js/test/markup/xquery/direct_method.expect.txt new file mode 100644 index 0000000..34b756f --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/direct_method.expect.txt @@ -0,0 +1,12 @@ +xquery version "3.1"; +let $var := <root n="x1">"rooting" out 1 or 2 root causes</root> +return + <result name="test"> + disable highlight for a name such as root { + for $name in $var + return + $name as xs:string + } + return to unhighlighted order of things. + <test type="{$name}">"rooting" out root causes</test> + </result> diff --git a/yknjs/highlight.js/test/markup/xquery/direct_method.txt b/yknjs/highlight.js/test/markup/xquery/direct_method.txt new file mode 100644 index 0000000..689a314 --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/direct_method.txt @@ -0,0 +1,12 @@ +xquery version "3.1"; +let $var := "rooting" out 1 or 2 root causes +return + + disable highlight for a name such as root { + for $name in $var + return + $name as xs:string + } + return to unhighlighted order of things. + "rooting" out root causes + diff --git a/yknjs/highlight.js/test/markup/xquery/function_body.expect.txt b/yknjs/highlight.js/test/markup/xquery/function_body.expect.txt new file mode 100644 index 0000000..a8eb56b --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/function_body.expect.txt @@ -0,0 +1,11 @@ +declare function local:test ($node as node()) as element(div) { +for $n in $node +return + element div { switch($n) + case 'abc' return 'OK' + default return 2 + } +}; +for $x in 1 to 3 +return + local:test(<test>abc</test>) diff --git a/yknjs/highlight.js/test/markup/xquery/function_body.txt b/yknjs/highlight.js/test/markup/xquery/function_body.txt new file mode 100644 index 0000000..b710dfb --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/function_body.txt @@ -0,0 +1,11 @@ +declare function local:test ($node as node()) as element(div) { +for $n in $node +return + element div { switch($n) + case 'abc' return 'OK' + default return 2 + } +}; +for $x in 1 to 3 +return + local:test(abc) diff --git a/yknjs/highlight.js/test/markup/xquery/prolog_declarations.expect.txt b/yknjs/highlight.js/test/markup/xquery/prolog_declarations.expect.txt new file mode 100644 index 0000000..08f101c --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/prolog_declarations.expect.txt @@ -0,0 +1,22 @@ +xquery version "3.1"; +(:~ + : @author Duncan Paterson + : @version 1.0:) + +module namespace app="http://none"; + +import module namespace config="http://config" at "config.xqm"; (: schema :) + + +declare copy-namespaces no-preserve, inherit; +(: switch to preserve, no-inherit:) + +declare %private variable $app:maxItems := 12; +declare context item := doc("catalog.xml"); + +declare %templates:wrap-all function app:helloworld($node as node(), $model as map(*), $name as xs:string?) { + if ($name) then + <p>Hello {$name}!</p> + else + () +}; diff --git a/yknjs/highlight.js/test/markup/xquery/prolog_declarations.txt b/yknjs/highlight.js/test/markup/xquery/prolog_declarations.txt new file mode 100644 index 0000000..f7d40de --- /dev/null +++ b/yknjs/highlight.js/test/markup/xquery/prolog_declarations.txt @@ -0,0 +1,22 @@ +xquery version "3.1"; +(:~ + : @author Duncan Paterson + : @version 1.0:) + +module namespace app="http://none"; + +import module namespace config="http://config" at "config.xqm"; (: schema :) + + +declare copy-namespaces no-preserve, inherit; +(: switch to preserve, no-inherit:) + +declare %private variable $app:maxItems := 12; +declare context item := doc("catalog.xml"); + +declare %templates:wrap-all function app:helloworld($node as node(), $model as map(*), $name as xs:string?) { + if ($name) then +

    Hello {$name}!

    + else + () +}; diff --git a/yknjs/highlight.js/test/markup/yaml/string.expect.txt b/yknjs/highlight.js/test/markup/yaml/string.expect.txt new file mode 100644 index 0000000..4980e5c --- /dev/null +++ b/yknjs/highlight.js/test/markup/yaml/string.expect.txt @@ -0,0 +1,7 @@ +key: value +key: 'some value' +key: "some value" +key: | + multi-string + value +key: true diff --git a/yknjs/highlight.js/test/markup/yaml/string.txt b/yknjs/highlight.js/test/markup/yaml/string.txt new file mode 100644 index 0000000..db9b389 --- /dev/null +++ b/yknjs/highlight.js/test/markup/yaml/string.txt @@ -0,0 +1,7 @@ +key: value +key: 'some value' +key: "some value" +key: | + multi-string + value +key: true diff --git a/yknjs/highlight.js/test/markup/yaml/tag.expect.txt b/yknjs/highlight.js/test/markup/yaml/tag.expect.txt new file mode 100644 index 0000000..dbc5645 --- /dev/null +++ b/yknjs/highlight.js/test/markup/yaml/tag.expect.txt @@ -0,0 +1,4 @@ +key: !!builtintagname test +key: !localtagname test +key: "!notatag" +key: '!!notatageither' diff --git a/yknjs/highlight.js/test/markup/yaml/tag.txt b/yknjs/highlight.js/test/markup/yaml/tag.txt new file mode 100644 index 0000000..35f3615 --- /dev/null +++ b/yknjs/highlight.js/test/markup/yaml/tag.txt @@ -0,0 +1,4 @@ +key: !!builtintagname test +key: !localtagname test +key: "!notatag" +key: '!!notatageither' diff --git a/yknjs/highlight.js/test/mocha.opts b/yknjs/highlight.js/test/mocha.opts new file mode 100644 index 0000000..dcb2ddb --- /dev/null +++ b/yknjs/highlight.js/test/mocha.opts @@ -0,0 +1,6 @@ +--require should +--reporter spec +--ui bdd +--bail +--check-leaks +--inline-diffs diff --git a/yknjs/highlight.js/test/special/buildClassName.js b/yknjs/highlight.js/test/special/buildClassName.js new file mode 100644 index 0000000..4915f59 --- /dev/null +++ b/yknjs/highlight.js/test/special/buildClassName.js @@ -0,0 +1,39 @@ +'use strict'; + +let _ = require('lodash'); + +describe('block class names', function() { + before(function() { + const testHTML = document.querySelectorAll('#build-classname .hljs'); + + this.blocks = _.map(testHTML, 'className'); + }); + + it('should add language class name to block', function() { + const expected = 'some-class hljs xml', + actual = this.blocks[0]; + + actual.should.equal(expected); + }); + + it('should not clutter block class (first)', function () { + const expected = 'hljs some-class xml', + actual = this.blocks[1]; + + actual.should.equal(expected); + }); + + it('should not clutter block class (last)', function () { + const expected = 'some-class hljs xml', + actual = this.blocks[2]; + + actual.should.equal(expected); + }); + + it('should not clutter block class (spaces around)', function () { + const expected = 'hljs some-class xml', + actual = this.blocks[3]; + + actual.should.equal(expected); + }); +}); diff --git a/yknjs/highlight.js/test/special/customMarkup.js b/yknjs/highlight.js/test/special/customMarkup.js new file mode 100644 index 0000000..4ace5e7 --- /dev/null +++ b/yknjs/highlight.js/test/special/customMarkup.js @@ -0,0 +1,43 @@ +'use strict'; + +let _ = require('lodash'); +let utility = require('../utility'); + +describe('custom markup', function() { + before(function() { + const testHTML = document.querySelectorAll('#custom-markup .hljs'); + + this.blocks = _.map(testHTML, 'innerHTML'); + }); + + it('should replace tabs', function() { + const filename = utility.buildPath('fixtures', 'expect', + 'tabreplace.txt'), + actual = this.blocks[0]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should keep custom markup', function() { + const filename = utility.buildPath('fixtures', 'expect', + 'custommarkup.txt'), + actual = this.blocks[1]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should keep custom markup and replace tabs', function() { + const filename = utility.buildPath('fixtures', 'expect', + 'customtabreplace.txt'), + actual = this.blocks[2]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should keep the same amount of void elements (
    ,
    , ...)', function() { + const filename = utility.buildPath('fixtures', 'expect', 'brInPre.txt'), + actual = this.blocks[3]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); +}); diff --git a/yknjs/highlight.js/test/special/endsWithParentVariants.js b/yknjs/highlight.js/test/special/endsWithParentVariants.js new file mode 100644 index 0000000..ce222a9 --- /dev/null +++ b/yknjs/highlight.js/test/special/endsWithParentVariants.js @@ -0,0 +1,19 @@ +'use strict'; + +let utility = require('../utility'); + +describe('ends with parent variants', function() { + before(function() { + const filename = utility.buildPath('fixtures', 'expect', 'endsWithParentVariants.txt'), + testHTML = document.querySelectorAll('#ends-with-parent-variants .hljs'); + + return utility.setupFile(filename, 'utf-8', this, testHTML); + }); + + it('should end on all variants', function() { + const actual = this.blocks[0]; + + actual.should.equal(this.expected); + }); + +}); diff --git a/yknjs/highlight.js/test/special/explicitLanguage.js b/yknjs/highlight.js/test/special/explicitLanguage.js new file mode 100644 index 0000000..e527879 --- /dev/null +++ b/yknjs/highlight.js/test/special/explicitLanguage.js @@ -0,0 +1,44 @@ +'use strict'; + +let utility = require('../utility'); + +describe('explicit language class', function() { + before(function() { + const filename = utility.buildPath('fixtures', 'expect', 'explicit1.txt'), + testHTML = document.querySelectorAll('#explicit-language .hljs'); + + return utility.setupFile(filename, 'utf-8', this, testHTML); + }); + + it('should highlight block with language in code tag', function() { + const actual = this.blocks[0]; + + actual.should.equal(this.expected); + }); + + it('should highlight block with language in pre tag', function() { + const actual = this.blocks[1]; + + actual.should.equal(this.expected); + }); + + it('should highlight using html 5 style (language-*)', function() { + const actual = this.blocks[2]; + + actual.should.equal(this.expected); + }); + + it('should highlight with shortened prefix (lang-)', function() { + const filename = utility.buildPath('fixtures', 'expect', 'explicit2.txt'), + actual = this.blocks[3]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); + + it('should highlight if classname contains uppercase symbols', function() { + const filename = utility.buildPath('fixtures', 'expect', 'explicit2.txt'), + actual = this.blocks[4]; + + return utility.expectedFile(filename, 'utf-8', actual); + }); +}); diff --git a/yknjs/highlight.js/test/special/index.js b/yknjs/highlight.js/test/special/index.js new file mode 100644 index 0000000..8313a31 --- /dev/null +++ b/yknjs/highlight.js/test/special/index.js @@ -0,0 +1,45 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let hljs = require('../../build'); +let { JSDOM } = require('jsdom'); +let readFile = bluebird.promisify(require('fs').readFile); +let utility = require('../utility'); + +describe('special cases tests', function() { + before(function() { + const filename = utility.buildPath('fixtures', 'index.html'); + + return readFile(filename, 'utf-8') + .then(page => new JSDOM(page)) + .then(({ window }) => { + let blocks; + + // Allows hljs to use document + global.document = window.document; + + // Special language to test endsWithParentVariants + hljs.registerLanguage('nested', require('../fixtures/nested.js')); + + // Setup hljs environment + hljs.configure({ tabReplace: ' ' }); + hljs.initHighlighting(); + + // Setup hljs for non-`
    ` tests
    +        hljs.configure({ useBR: true });
    +
    +        blocks = document.querySelectorAll('.code');
    +        _.each(blocks, hljs.highlightBlock);
    +      });
    +  });
    +
    +  require('./explicitLanguage');
    +  require('./customMarkup');
    +  require('./languageAlias');
    +  require('./noHighlight');
    +  require('./subLanguages');
    +  require('./buildClassName');
    +  require('./useBr');
    +  require('./endsWithParentVariants')
    +});
    diff --git a/yknjs/highlight.js/test/special/languageAlias.js b/yknjs/highlight.js/test/special/languageAlias.js
    new file mode 100644
    index 0000000..c2f9db2
    --- /dev/null
    +++ b/yknjs/highlight.js/test/special/languageAlias.js
    @@ -0,0 +1,20 @@
    +'use strict';
    +
    +let _       = require('lodash');
    +let utility = require('../utility');
    +
    +describe('language alias', function() {
    +  before(function() {
    +    const testHTML = document.querySelectorAll('#language-alias .hljs');
    +
    +    this.blocks = _.map(testHTML, 'innerHTML');
    +  });
    +
    +  it('should highlight as aliased language', function() {
    +    const filename = utility.buildPath('fixtures', 'expect',
    +                                       'languagealias.txt'),
    +          actual   = this.blocks[0];
    +
    +    return utility.expectedFile(filename, 'utf-8', actual);
    +  });
    +});
    diff --git a/yknjs/highlight.js/test/special/noHighlight.js b/yknjs/highlight.js/test/special/noHighlight.js
    new file mode 100644
    index 0000000..9d51195
    --- /dev/null
    +++ b/yknjs/highlight.js/test/special/noHighlight.js
    @@ -0,0 +1,88 @@
    +'use strict';
    +
    +let _ = require('lodash');
    +
    +describe('no highlighting', function() {
    +  before(function() {
    +    const testHTML = document.querySelectorAll('#no-highlight pre');
    +
    +    this.blocks   = _.map(testHTML, 'children[0].innerHTML');
    +    this.expected = {
    +      html:   '<div id="contents">\n  ' +
    +              '<p>Hello, World!\n</div>',
    +      python: 'for x in [1, 2, 3]: count(x)',
    +      javascript: 'var x = ' +
    +                  '\'foo\';'
    +    };
    +  });
    +
    +  it('should keep block unchanged (nohighlight)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[0];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (no-highlight)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[1];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (plain)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[2];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (text)', function() {
    +    const expected = this.expected.html,
    +          actual   = this.blocks[3];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should skip pre tags without a child code tag', function() {
    +    const expected = 'Computer output',
    +          actual   = this.blocks[4];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (unsupported language)', function() {
    +    const expected = this.expected.python,
    +          actual   = this.blocks[5];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (unsupported lang)', function() {
    +    const expected = this.expected.python,
    +          actual   = this.blocks[6];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should keep block unchanged (unsupported prefixed language)', function() {
    +    const expected = this.expected.python,
    +          actual   = this.blocks[7];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should highlight class names containing text at the start', function() {
    +    const expected = this.expected.javascript,
    +          actual   = this.blocks[8];
    +
    +    actual.should.equal(expected);
    +  });
    +
    +  it('should highlight class names containing text at the end', function() {
    +    const expected = this.expected.javascript,
    +          actual   = this.blocks[9];
    +
    +    actual.should.equal(expected);
    +  });
    +});
    diff --git a/yknjs/highlight.js/test/special/subLanguages.js b/yknjs/highlight.js/test/special/subLanguages.js
    new file mode 100644
    index 0000000..c7e458a
    --- /dev/null
    +++ b/yknjs/highlight.js/test/special/subLanguages.js
    @@ -0,0 +1,17 @@
    +'use strict';
    +
    +let utility = require('../utility');
    +
    +describe('sub-languages', function() {
    +  before(function() {
    +    this.block = document.querySelector('#sublanguages');
    +  });
    +
    +  it('should highlight XML with PHP and JavaScript', function() {
    +    const filename = utility.buildPath('fixtures', 'expect',
    +                                     'sublanguages.txt'),
    +          actual   = this.block.innerHTML;
    +
    +    return utility.expectedFile(filename, 'utf-8', actual);
    +  });
    +});
    diff --git a/yknjs/highlight.js/test/special/useBr.js b/yknjs/highlight.js/test/special/useBr.js
    new file mode 100644
    index 0000000..70e2cc3
    --- /dev/null
    +++ b/yknjs/highlight.js/test/special/useBr.js
    @@ -0,0 +1,30 @@
    +'use strict';
    +
    +let utility = require('../utility');
    +
    +describe('use br', function() {
    +  before(function() {
    +    const filename = utility.buildPath('fixtures', 'expect', 'useBr.txt'),
    +          testHTML = document.querySelectorAll('#use-br .hljs');
    +
    +    return utility.setupFile(filename, 'utf-8', this, testHTML);
    +  });
    +
    +  it('should respect 
    tags', function() { + const actual = this.blocks[0]; + + actual.should.equal(this.expected); + }); + + it('should ignore literal new lines', function() { + const actual = this.blocks[1]; + + actual.should.equal(this.expected); + }); + + it('should recognize xml-style
    ', function() { + const actual = this.blocks[2]; + + actual.should.equal(this.expected); + }); +}); diff --git a/yknjs/highlight.js/test/tools.js b/yknjs/highlight.js/test/tools.js new file mode 100644 index 0000000..7b188f0 --- /dev/null +++ b/yknjs/highlight.js/test/tools.js @@ -0,0 +1,40 @@ +'use strict'; + +let utility = require('../tools/utility'), + bluebird = require('bluebird'), + path = require('path'), + readFile = bluebird.promisify(require('fs').readFile); + +describe("minification tools", () => { + it("should replace API calls with minified names", () => { + let content = "hljs.COMMENT(); hj.NUMBER_MODE == 0; a = hljs.endRe"; + content.replace(utility.regex.replaces, utility.replaceClassNames).should.equal( + "hljs.C(); hj.NM == 0; a = hljs.eR" + ); + }); + + it("should replace API calls with minified names and protect declarations", () => { + let content = "hj.NUMBER_MODE == 0; hljs.COMMENT = 1; a = hljs.endRe"; + content.replace(utility.regex.replaces, utility.replaceClassNames).should.equal( + "hj.NM == 0; hljs.C = hljs.COMMENT = 1; a = hljs.eR" + ); + }); + + it("should NOT protect non-public member declarations", () => { + let content = "hljs.endRe = 3;"; + content.replace(utility.regex.replaces, utility.replaceClassNames).should.equal( + "hljs.eR = 3;" + ); + }); + + it("should assign API_REPLACES to the REPLACES dictionary in the highlight.js code", (done) => { + readFile(path.join(__dirname, "../src/highlight.js"), 'utf-8').then(function(content) { + "abc".should.containEql("bc"); + content.should.not.containEql("var API_REPLACES = " + JSON.stringify(utility.REPLACES)); + content.replace(utility.regex.apiReplacesFrom, utility.regex.apiReplacesTo) + .should + .containEql("var API_REPLACES = " + JSON.stringify(utility.REPLACES)); + done(); + }); + }); +}); \ No newline at end of file diff --git a/yknjs/highlight.js/test/utility.js b/yknjs/highlight.js/test/utility.js new file mode 100644 index 0000000..967b170 --- /dev/null +++ b/yknjs/highlight.js/test/utility.js @@ -0,0 +1,29 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let readFile = bluebird.promisify(require('fs').readFile); +let path = require('path'); + +// Build a path relative to `test/` +exports.buildPath = function() { + const args = _.slice(arguments, 0), + paths = [__dirname].concat(args); + + return path.join.apply(this, paths); +}; + +exports.numberToString = _.method('toString'); + +exports.expectedFile = function(filename, encoding, actual) { + return readFile(filename, encoding) + .then(expected => actual.trim().should.equal(expected.trim())); +}; + +exports.setupFile = function(filename, encoding, that, testHTML) { + return readFile(filename, encoding) + .then(expected => { + that.expected = expected.trim(); + that.blocks = _.map(testHTML, 'innerHTML'); + }); +}; diff --git a/yknjs/highlight.js/tools/all.js b/yknjs/highlight.js/tools/all.js new file mode 100644 index 0000000..6168be0 --- /dev/null +++ b/yknjs/highlight.js/tools/all.js @@ -0,0 +1,34 @@ +'use strict'; + +let _ = require('lodash'); +let path = require('path'); +let cdn = require('./cdn'); +let node = require('./node'); +let browser = require('./browser'); + +function newBuildDirectory(dir, subdir) { + const build = path.join(dir.build, subdir); + + return { build: build }; +} + +module.exports = function(commander, dir) { + let data = {}; + + _.each(['cdn', 'node', 'browser'], function(target) { + const newDirectory = newBuildDirectory(dir, target), + directory = _.defaults(newDirectory, dir), + options = _.defaults({ target: target }, commander); + + data[target] = { + directory: directory, + commander: options + }; + }); + + return [].concat( + cdn(data.cdn.commander, data.cdn.directory), + node(data.node.commander, data.node.directory), + browser(data.browser.commander, data.browser.directory) + ); +}; diff --git a/yknjs/highlight.js/tools/browser.js b/yknjs/highlight.js/tools/browser.js new file mode 100644 index 0000000..6f7186c --- /dev/null +++ b/yknjs/highlight.js/tools/browser.js @@ -0,0 +1,165 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let readFile = bluebird.promisify(require('fs').readFile); +let path = require('path'); + +let registry = require('./tasks'); +let utility = require('./utility'); + +let directory; + +function templateAllFunc(blobs) { + const name = path.join('demo', 'index.html'); + + blobs = _.compact(blobs); + + return bluebird.join( + readFile(name), + utility.getStyleNames(), + (template, styles) => ({ template, path, blobs, styles }) + ); +} + +function copyDocs() { + const input = path.join(directory.root, 'docs', '*.rst'), + output = path.join(directory.build, 'docs'); + + return { + startLog: { task: ['log', 'Copying documentation.'] }, + read: { requires: 'startLog', task: ['glob', utility.glob(input)] }, + writeLog: { requires: 'read', task: ['log', 'Writing documentation.'] }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function generateDemo(filterCB, readArgs) { + let styleDir = path.join('src', 'styles'), + staticArgs = utility.glob(path.join('demo', '*.min.{js,css}')), + imageArgs = utility.glob(path.join(styleDir, '*.{png,jpg}'), + 'binary'), + stylesArgs = utility.glob(path.join(styleDir, '*.css')), + demoRoot = path.join(directory.build, 'demo'), + templateArgs = { callback: templateAllFunc }, + destArgs = { + dir: path.join(demoRoot, 'styles'), + encoding: 'binary' + }; + + return { + logStart: { task: ['log', 'Generating demo.'] }, + readLanguages: { requires: 'logStart', task: ['glob', readArgs] }, + filterSnippets: { requires: 'readLanguages', task: ['filter', filterCB] }, + readSnippet: { requires: 'filterSnippets', task: 'readSnippet' }, + template: { + requires: 'readSnippet', + task: ['templateAll', templateArgs] + }, + write: { + requires: 'template', + task: ['write', path.join(demoRoot, 'index.html')] + }, + readStatic: { requires: 'logStart', task: ['glob', staticArgs] }, + writeStatic: { requires: 'readStatic', task: ['dest', demoRoot] }, + readStyles: { requires: 'logStart', task: ['glob', stylesArgs] }, + compressStyles: { requires: 'readStyles', task: 'cssminify' }, + writeStyles: { requires: 'compressStyles', task: ['dest', destArgs] }, + readImages: { requires: 'logStart', task: ['glob', imageArgs] }, + writeImages: { requires:'readImages', task: ['dest', destArgs] }, + readDemoJS: { + requires: 'logStart', + task: ['read', path.join('demo', 'demo.js')] + }, + minifyDemoJS: { requires: 'readDemoJS', task: 'jsminify' }, + writeDemoJS: { requires: 'minifyDemoJS', task: ['dest', demoRoot] }, + readDemoCSS: { + requires: 'logStart', + task: ['read', path.join('demo', 'style.css')] + }, + minifyDemoCSS: { requires: 'readDemoCSS', task: 'cssminify' }, + writeDemoCSS: { requires: 'minifyDemoCSS', task: ['dest', demoRoot] } + }; +} + +module.exports = function(commander, dir) { + directory = dir; + + let hljsExt, output, requiresTask, tasks, + replace = utility.replace, + regex = utility.regex, + replaceClassNames = utility.replaceClassNames, + + coreFile = path.join('src', 'highlight.js'), + languages = utility.glob(path.join('src', 'languages', '*.js')), + filterCB = utility.buildFilterCallback(commander.args), + replaceArgs = replace(regex.header, ''), + templateArgs = + 'hljs.registerLanguage(\'<%= name %>\', <%= content %>);\n'; + + tasks = { + startLog: { task: ['log', 'Building highlight.js pack file.'] }, + readCore: { requires: 'startLog', task: ['read', coreFile] }, + read: { requires: 'startLog', task: ['glob', languages] }, + filter: { requires: 'read', task: ['filter', filterCB] }, + reorder: { requires: 'filter', task: 'reorderDeps' }, + replace: { requires: 'reorder', task: ['replace', replaceArgs] }, + template: { requires: 'replace', task: ['template', templateArgs] }, + packageFiles: { + requires: ['readCore', 'template'], + task: 'packageFiles' + } + }; + requiresTask = 'packageFiles'; + + if(commander.compress || commander.target === 'cdn') { + tasks.compresslog = { + requires: requiresTask, + task: ['log', 'Compressing highlight.js pack file.'] + }; + + tasks.replace2 = { + requires: 'compresslog', + task: [ 'replaceSkippingStrings' + , replace(regex.replaces, replaceClassNames) + ] + }; + + tasks.replace3 = { + requires: 'replace2', + task: ['replace', replace(regex.classname, '$1.className')] + }; + + tasks.replace4 = { + requires: 'replace3', + task: ['replace', replace(regex.apiReplacesFrom, regex.apiReplacesTo)] + }; + + tasks.minify = { requires: 'replace4', task: 'jsminify' }; + requiresTask = 'minify'; + } + + tasks.insertLicenseTag = { + requires: requiresTask, + task: 'insertLicenseTag' + }; + + tasks.writelog = { + requires: 'insertLicenseTag', + task: ['log', 'Writing highlight.js pack file.'] + }; + + hljsExt = commander.target === 'cdn' ? 'min' : 'pack'; + output = path.join(directory.build, `highlight.${hljsExt}.js`); + + tasks.write = { + requires: 'writelog', + task: ['write', output] + }; + + tasks = (commander.target === 'browser') + ? [copyDocs(), generateDemo(filterCB, languages), tasks] + : [tasks]; + + return utility.toQueue(tasks, registry); +}; diff --git a/yknjs/highlight.js/tools/build.js b/yknjs/highlight.js/tools/build.js new file mode 100644 index 0000000..d399551 --- /dev/null +++ b/yknjs/highlight.js/tools/build.js @@ -0,0 +1,89 @@ +// For the basic introductions on using this build script, see: +// +// +// +// Otherwise, lets explain what each build target does in more detail, for +// those that wish to know before running this script. +// +// Build Targets +// ------------- +// +// * browser +// +// The default target. This will package up the core `highlight.js` along +// with all the language definitions into the file `highlight.pack.js` -- +// which will be compressed without including the option to disable it. It +// also builds the documentation for our readthedocs page, mentioned +// above, along with a local instance of the demo at: +// +// . +// +// * cdn +// +// This will package up the core `highlight.js` along with all the +// language definitions into the file `highlight.min.js` and compresses +// all languages and styles into separate files. Since the target is for +// CDNs -- like cdnjs and jsdelivr -- it doesn't matter if you put the +// option to disable compression, this target is always be compressed. Do +// keep in mind that we don't keep the build results in the main +// repository; however, there is a separate repository for those that want +// the CDN builds without using a third party site or building it +// themselves. For those curious, head over to: +// +// +// +// * node +// +// This build will transform the library into a CommonJS module. It +// includes the generation of an `index.js` file that will be the main +// file imported for use with Node.js or browserify. Do note that this +// includes all languages by default and it might be too heavy to use for +// browserify. Luckily, you can easily do two things to make the build +// smaller; either specify the specific language/category you need or you +// can use the browser or cdn builds and it will work like any CommonJS +// file. Also with the CommonJS module, it includes the documentation for +// our readthedocs page and the uncompressed styles. Getting this build is +// pretty easy as it is the one that gets published to npm with the +// standard `npm install highlight.js`, but you can also visit the package +// page at: +// +// +// +// * all +// +// Builds every target and places the results into a sub-directory based +// off of the target name relative to the `build` directory; for example, +// "node" with go into `build/node`, "cdn" will go into `build/cdn`, +// "browser" will go into `build/browser` and so forth. +// +// All build targets will end up in the `build` directory. + +'use strict'; + +let commander = require('commander'); +let path = require('path'); +let Queue = require('gear').Queue; +let registry = require('./tasks'); + +let build, dir = {}; + +commander + .usage('[options] [...]') + .option('-n, --no-compress', 'Disable compression') + .option('-t, --target ', 'Build for target ' + + '[all, browser, cdn, node]', + /^(browser|cdn|node|all)$/i, 'browser') + .parse(process.argv); + +commander.target = commander.target.toLowerCase(); + +build = require(`./${commander.target}`); +dir.root = path.dirname(__dirname); +dir.build = path.join(dir.root, 'build'); + +new Queue({ registry: registry }) + .clean(dir.build) + .log('Starting build.') + .series(build(commander, dir)) + .log('Finished build.') + .run(); diff --git a/yknjs/highlight.js/tools/cdn.js b/yknjs/highlight.js/tools/cdn.js new file mode 100644 index 0000000..3d93c9c --- /dev/null +++ b/yknjs/highlight.js/tools/cdn.js @@ -0,0 +1,88 @@ +'use strict'; + +let path = require('path'); + +let browserBuild = require('./browser'); +let registry = require('./tasks'); +let utility = require('./utility'); + +let directory; + +function moveLanguages() { + let input = path.join(directory.root, 'src', 'languages', '*.js'), + output = path.join(directory.build, 'languages'), + regex = utility.regex, + replace = utility.replace, + + replaceArgs = replace(regex.header, ''), + template = 'hljs.registerLanguage(\'<%= name %>\','+ + ' <%= content %>);\n'; + + return { + startLog: { task: ['log', 'Building language files.'] }, + read: { + requires: 'startLog', + task: ['glob', utility.glob(input)] + }, + replace: { requires: 'read', task: ['replace', replaceArgs] }, + template: { requires: 'replace', task: ['template', template] }, + replace2: { + requires: 'template', + task: [ 'replaceSkippingStrings' + , replace(regex.replaces, utility.replaceClassNames) + ] + }, + replace3: { + requires: 'replace2', + task: ['replace', replace(regex.classname, '$1.className')] + }, + compressLog: { + requires: 'replace3', + task: ['log', 'Compressing languages files.'] + }, + minify: { requires: 'compressLog', task: 'jsminify' }, + rename: { requires: 'minify', task: ['rename', { extname: '.min.js' }] }, + writeLog: { + requires: 'rename', + task: ['log', 'Writing language files.'] + }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function moveStyles() { + const css = path.join(directory.root, 'src', 'styles', '*.css'), + images = path.join(directory.root, 'src', 'styles', '*.{jpg,png}'), + output = path.join(directory.build, 'styles'), + options = { dir: output, encoding: 'binary' }; + + return { + startLog: { task: ['log', 'Building style files.'] }, + readCSS: { requires: 'startLog', task: ['glob', utility.glob(css)] }, + readImages: { + requires: 'startLog', + task: ['glob', utility.glob(images, 'binary')] + }, + compressLog: { + requires: 'readCSS', + task: ['log', 'Compressing style files.'] + }, + minify: { requires: 'compressLog', task: 'cssminify' }, + rename: { + requires: 'minify', + task: ['rename', { extname: '.min.css' }] + }, + writeLog: { + requires: ['rename', 'readImages'], + task: ['log', 'Writing style files.'] + }, + write: { requires: 'writeLog', task: ['dest', options] } + }; +} + +module.exports = function(commander, dir) { + directory = dir; + + return utility.toQueue([moveLanguages(), moveStyles()], registry) + .concat(browserBuild(commander, dir)); +}; diff --git a/yknjs/highlight.js/tools/codeformat.js b/yknjs/highlight.js/tools/codeformat.js new file mode 100644 index 0000000..e6c5727 --- /dev/null +++ b/yknjs/highlight.js/tools/codeformat.js @@ -0,0 +1,47 @@ +'use strict'; + +var _ = require('lodash'); +var bluebird = require('bluebird'); +var path = require('path'); +var glob = bluebird.promisify(require('glob')); +var fs = require('fs'); +var readFile = bluebird.promisify(fs.readFile); +var writeFile = bluebird.promisify(fs.writeFile); +var beautify = require('js-beautify').js_beautify; + +var beautify_options = { + "indent_size": 2, + "indent_char": " ", + "eol": "\n", + "indent_level": 0, + "indent_with_tabs": false, + "preserve_newlines": true, + "max_preserve_newlines": 10, + "jslint_happy": false, + "space_after_anon_function": false, + "brace_style": "collapse", + "keep_array_indentation": false, + "keep_function_indentation": false, + "space_before_conditional": true, + "break_chained_methods": false, + "eval_code": false, + "end_with_newline": true +}; + +console.log("Starting formatting."); + +var sources = path.join('src', 'languages', '*.js'); + +bluebird.map(glob(sources), function (name) { + var basename = path.basename(name, '.js'); + + return readFile(name).then(function (blob) { + return beautify(blob.toString(), beautify_options); + }).then(function (blob) { + return writeFile(name, blob).then(function () { + console.log(" ✓ " + basename); + }); + }); +}).then(function () { + console.log("Finished formatting."); +}); diff --git a/yknjs/highlight.js/tools/developer.html b/yknjs/highlight.js/tools/developer.html new file mode 100644 index 0000000..91d8753 --- /dev/null +++ b/yknjs/highlight.js/tools/developer.html @@ -0,0 +1,107 @@ + + + + + highlight.js developer + + + + + + +

    highlight.js developer

    + +
    +
    + +

    + + Language: +

    +
    +
    +

    Rendered in ... ms [...]

    +
    ...
    +
    +
    +

    Markup +

    ...
    +
    +
    + + + + + + + diff --git a/yknjs/highlight.js/tools/keywordsformat.js b/yknjs/highlight.js/tools/keywordsformat.js new file mode 100644 index 0000000..85d5b22 --- /dev/null +++ b/yknjs/highlight.js/tools/keywordsformat.js @@ -0,0 +1,18 @@ +/** Example */ + +var all = 'keywords here'; + +var output = '', line = ''; +all.forEach(function (item) { + if (12 + 1 + line.length + 1 + item.length + 4 > 120) { + output += "\n" + " '" + line + " ' +"; + line = ''; + return; + } + if (line) { + line = line + ' ' + item; + } else { + line = item; + } +}); +console.log(output); diff --git a/yknjs/highlight.js/tools/node.js b/yknjs/highlight.js/tools/node.js new file mode 100644 index 0000000..c29ff2b --- /dev/null +++ b/yknjs/highlight.js/tools/node.js @@ -0,0 +1,141 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let path = require('path'); + +let packageJSON = require('../package'); +let registry = require('./tasks'); +let utility = require('./utility'); + +let directory, filterCB, + languages = utility.glob(path.join('src', 'languages', '*.js')), + header = utility.regex.header; + +function templateAllFunc(blobs) { + const names = _.map(blobs, blob => path.basename(blob.name, '.js')); + + return bluebird.resolve({ names: names }); +} + +function buildLanguages() { + let input = languages, + output = path.join(directory.build, 'lib', 'languages'), + + replaceArgs = utility.replace(header, ''), + template = 'module.exports = <%= content %>;'; + + return { + logStart: { task: ['log', 'Building language files.'] }, + read: { requires: 'logStart', task: ['glob', input] }, + filter: { requires: 'read', task: ['filter', filterCB] }, + replace: { requires: 'filter', task: ['replace', replaceArgs] }, + template: { requires: 'replace', task: ['template', template] }, + writeLog: { + requires: 'template', + task: ['log', 'Writing language files.'] + }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function buildCore() { + const input = path.join(directory.root, 'src', 'highlight.js'), + output = path.join(directory.build, 'lib'); + + return { + startLog: { task: ['log', 'Building core file.'] }, + read: { requires: 'startLog', task: ['read', input] }, + writeLog: { requires: 'read', task: ['log', 'Writing core file.'] }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function buildIndex() { + let input = languages, + output = path.join(directory.build, 'lib', 'index.js'), + + templateArgs = { + template: [ 'var hljs = require(\'./highlight\');\n' + , '<% _.each(names, function(name) { %>' + + 'hljs.registerLanguage(\'<%= name %>\', ' + + 'require(\'./languages/<%= name %>\'));' + , '<% }); %>' + , 'module.exports = hljs;' + ].join('\n'), + callback: templateAllFunc + }; + + return { + startLog: { task: ['log', 'Building index file.'] }, + read: { requires: 'startLog', task: ['glob', input] }, + filter: { requires: 'read', task: ['filter', filterCB] }, + reorder: { requires: 'filter', task: 'reorderDeps' }, + template: { requires: 'reorder', task: ['templateAll', templateArgs] }, + writeLog: { requires: 'template', task: ['log', 'Writing index file.'] }, + write: { requires: 'writeLog', task: ['write', output] } + }; +} + +function copyMetaFiles() { + let docs = path.join('docs', '*.rst'), + glob = `{README.md,LICENSE,${docs}}`, + + input = utility.glob(path.join(directory.root, glob)), + output = { dir: directory.build, base: '.' }; + + return { + startLog: { task: ['log', 'Copying meta files.'] }, + read: { requires: 'startLog', task: ['glob', input] }, + writeLog: { requires: 'read', task: ['log', 'Writing meta files.'] }, + write: { requires: 'writeLog', task: ['dest', output] } + }; +} + +function buildStyles() { + let input = path.join(directory.root, 'src', 'styles', '*'), + output = path.join(directory.build, 'styles'), + options = { encoding: 'binary', dir: output }; + + return { + startLog: { task: ['log', 'Building style files.'] }, + read: { + requires: 'startLog', + task: ['glob', utility.glob(input, 'binary')] + }, + writeLog: { requires: 'read', task: ['log', 'Writing style files.'] }, + write: { requires: 'writeLog', task: ['dest', options] } + }; +} + +function buildPackageFile() { + const input = path.join(directory.root, 'AUTHORS.en.txt'), + output = path.join(directory.build, 'package.json'); + + return { + startLog: { task: ['log', 'Building package.json file.'] }, + read: { requires: 'startLog', task: ['read', input] }, + build: { requires: 'read', task: ['buildPackage', packageJSON] }, + writeLog: { + requires: 'build', + task: ['log', 'Writing package.json file.'] + }, + write: { requires: 'writeLog', task: ['write', output] } + }; +} + +module.exports = function(commander, dir) { + directory = dir; + filterCB = utility.buildFilterCallback(commander.args); + + let tasks = [ + buildLanguages(), + buildCore(), + buildIndex(), + buildStyles(), + copyMetaFiles(), + buildPackageFile() + ]; + + return utility.toQueue(tasks, registry); +}; diff --git a/yknjs/highlight.js/tools/tasks.js b/yknjs/highlight.js/tools/tasks.js new file mode 100644 index 0000000..de1a6ac --- /dev/null +++ b/yknjs/highlight.js/tools/tasks.js @@ -0,0 +1,248 @@ +'use strict'; + +let _ = require('lodash'); +let del = require('del'); +let gear = require('gear'); +let path = require('path'); +let utility = require('./utility'); + +let parseHeader = utility.parseHeader; +let tasks = require('gear-lib'); + +tasks.clean = function(directories, blobs, done) { + directories = _.isString(directories) ? [directories] : directories; + + return del(directories).then(() => done(null, blobs)); +}; +tasks.clean.type = 'collect'; + +// Depending on the languages required for the current language being +// processed, this task reorders it's dependencies first then include the +// language. +tasks.reorderDeps = function(options, blobs, done) { + let buffer = {}, + newBlobOrder = []; + + _.each(blobs, function(blob) { + let basename = path.basename(blob.name), + fileInfo = parseHeader(blob.result), + extra = { blob: blob, processed: false }; + + buffer[basename] = _.merge(extra, fileInfo || {}); + }); + + function pushInBlob(object) { + if(!object.processed) { + object.processed = true; + newBlobOrder.push(object.blob); + } + } + + _.each(buffer, function(buf) { + let object; + + if(buf.Requires) { + _.each(buf.Requires, function(language) { + object = buffer[language]; + pushInBlob(object); + }); + } + + pushInBlob(buf); + }); + + done(null, newBlobOrder); +}; +tasks.reorderDeps.type = 'collect'; + +tasks.template = function(template, blob, done) { + template = template || ''; + + let filename = path.basename(blob.name), + basename = path.basename(filename, '.js'), + content = _.template(template)({ + name: basename, + filename: filename, + content: blob.result.trim() + }); + + return done(null, new gear.Blob(content, blob)); +}; + +tasks.templateAll = function(options, blobs, done) { + return options.callback(blobs) + .then(function(data) { + let template = options.template || data.template, + content = _.template(template)(data); + + return done(null, [new gear.Blob(content)]); + }) + .catch(done); +}; +tasks.templateAll.type = 'collect'; + +tasks.rename = function(options, blob, done) { + options = options || {}; + + let name = blob.name, + ext = new RegExp(path.extname(name) + '$'); + + name = name.replace(ext, options.extname); + + return done(null, new gear.Blob(blob.result, { name: name })); +}; + +// Adds the contributors from `AUTHORS.en.txt` onto the `package.json` file +// and moves the result into the `build` directory. +tasks.buildPackage = function(json, blob, done) { + let result, + lines = blob.result.split(/\r?\n/), + regex = /^- (.*) <(.*)>$/; + + json.contributors = _.transform(lines, function(result, line) { + let matches = line.match(regex); + + if(matches) { + result.push({ + name: matches[1], + email: matches[2] + }); + } + }, []); + + result = JSON.stringify(json, null, ' '); + + return done(null, new gear.Blob(result, blob)); +}; + +// Mainly for replacing the keys of `utility.REPLACES` for it's values while +// skipping over strings, regular expressions, or comments. However, this is +// pretty generic so long as you use the `utility.replace` function, you can +// replace a regular expression with a string. +tasks.replaceSkippingStrings = function(params, blob, done) { + let content = blob.result, + length = content.length, + offset = 0, + + replace = params.replace || '', + regex = params.regex, + starts = /\/\/|['"\/]/, + + result = [], + chunk, end, match, start, terminator; + + while(offset < length) { + chunk = content.slice(offset); + match = chunk.match(starts); + end = match ? match.index : length; + + chunk = content.slice(offset, end + offset); + result.push(chunk.replace(regex, replace)); + + offset += end; + + if(match) { + // We found a starter sequence: either a `//` or a "quote" + // In the case of `//` our terminator is the end of line. + // Otherwise it's either a matching quote or an escape symbol. + terminator = match[0] !== '//' ? new RegExp(`[${match[0]}\\\\]`) + : /$/m; + start = offset; + offset += 1; + + while(true) { + chunk = content.slice(offset); + match = chunk.match(terminator); + + if(!match) { + return done('Unmatched quote'); + } + + if(match[0] === '\\') { + offset += match.index + 2; + } else { + offset += match.index + 1; + result.push(content.slice(start, offset)); + break; + } + } + } + } + + return done(null, new gear.Blob(result.join(''), blob)); +}; + +tasks.filter = function(callback, blobs, done) { + let filteredBlobs = _.filter(blobs, callback); + + // Re-add in blobs required from header definition + _.each(filteredBlobs, function(blob) { + let dirname = path.dirname(blob.name), + content = blob.result, + fileInfo = parseHeader(content); + + if(fileInfo && fileInfo.Requires) { + _.each(fileInfo.Requires, function(language) { + let filename = `${dirname}/${language}`, + fileFound = _.find(filteredBlobs, { name: filename }); + + if(!fileFound) { + filteredBlobs.push( + _.find(blobs, { name: filename })); + } + }); + } + }); + + return done(null, filteredBlobs); +}; +tasks.filter.type = 'collect'; + +tasks.readSnippet = function(options, blob, done) { + let name = path.basename(blob.name, '.js'), + fileInfo = parseHeader(blob.result), + snippetName = path.join('test', 'detect', name, 'default.txt'); + + function onRead(error, blob) { + if(error) return done(error); // ignore missing snippets + + let meta = { name: `${name}.js`, fileInfo: fileInfo }; + + return done(null, new gear.Blob(blob.result, meta)); + } + + gear.Blob.readFile(snippetName, 'utf8', onRead, false); +}; + +tasks.insertLicenseTag = function(options, blob, done) { + let hljsVersion = require('../package').version, + licenseTag = `/*! highlight.js v${hljsVersion} | ` + + `BSD3 License | git.io/hljslicense */\n`; + + return done(null, new gear.Blob(licenseTag + blob.result, blob)); +}; + +// Packages up included languages into the core `highlight.js` and moves the +// result into the `build` directory. +tasks.packageFiles = function(options, blobs, done) { + let content, + coreFile = _.head(blobs), + languages = _.tail(blobs), + + lines = coreFile.result + .replace(utility.regex.header, '') + .split('\n\n'), + lastLine = _.last(lines), + langStr = _.reduce(languages, (str, language) => + `${str + language.result}\n`, ''); + + lines[lines.length - 1] = langStr.trim(); + + lines = lines.concat(lastLine); + content = lines.join('\n\n'); + + return done(null, [new gear.Blob(content)]); +}; +tasks.packageFiles.type = 'collect'; + +module.exports = new gear.Registry({ tasks: tasks }); diff --git a/yknjs/highlight.js/tools/utility.js b/yknjs/highlight.js/tools/utility.js new file mode 100644 index 0000000..debd266 --- /dev/null +++ b/yknjs/highlight.js/tools/utility.js @@ -0,0 +1,180 @@ +'use strict'; + +let _ = require('lodash'); +let bluebird = require('bluebird'); +let glob = bluebird.promisify(require('glob')); +let path = require('path'); + +let Queue = require('gear').Queue; + +let regex = {}, + headerRegex = /^\s*\/\*((.|\r?\n)*?)\*/; + +const REPLACES = { + 'case_insensitive': 'cI', + 'lexemes': 'l', + 'contains': 'c', + 'keywords': 'k', + 'subLanguage': 'sL', + 'className': 'cN', + 'begin': 'b', + 'beginKeywords': 'bK', + 'end': 'e', + 'endsWithParent': 'eW', + 'illegal': 'i', + 'excludeBegin': 'eB', + 'excludeEnd': 'eE', + 'returnBegin': 'rB', + 'returnEnd': 'rE', + 'relevance': 'r', + 'variants': 'v', + + 'IDENT_RE': 'IR', + 'UNDERSCORE_IDENT_RE': 'UIR', + 'NUMBER_RE': 'NR', + 'C_NUMBER_RE': 'CNR', + 'BINARY_NUMBER_RE': 'BNR', + 'RE_STARTERS_RE': 'RSR', + 'BACKSLASH_ESCAPE': 'BE', + 'APOS_STRING_MODE': 'ASM', + 'QUOTE_STRING_MODE': 'QSM', + 'PHRASAL_WORDS_MODE': 'PWM', + 'C_LINE_COMMENT_MODE': 'CLCM', + 'C_BLOCK_COMMENT_MODE': 'CBCM', + 'HASH_COMMENT_MODE': 'HCM', + 'NUMBER_MODE': 'NM', + 'C_NUMBER_MODE': 'CNM', + 'BINARY_NUMBER_MODE': 'BNM', + 'CSS_NUMBER_MODE': 'CSSNM', + 'REGEXP_MODE': 'RM', + 'TITLE_MODE': 'TM', + 'UNDERSCORE_TITLE_MODE': 'UTM', + 'COMMENT': 'C', + + 'beginRe': 'bR', + 'endRe': 'eR', + 'illegalRe': 'iR', + 'lexemesRe': 'lR', + 'terminators': 't', + 'terminator_end': 'tE' +}; + +regex.replaces = new RegExp( + `(?:([\\w\\d]+)\\.(${Object.keys(REPLACES).filter(r => r.toUpperCase() === r).join('|')})\\s*=(?!=)|\\b(${Object.keys(REPLACES).join('|')})\\b)`, 'g'); + +regex.classname = /(block|parentNode)\.cN/g; + +regex.header = /^\s*(\/\*((.|\r?\n)*?)\*\/)?\s*/; + +regex.apiReplacesFrom = /\bvar\s*API_REPLACES\b/; +regex.apiReplacesTo = `var API_REPLACES = ${JSON.stringify(REPLACES)}`; + +function replace(from, to) { + return { regex: from, replace: to }; +} + +function replaceClassNames(match, gDeclObj, gDeclKey) { + if(gDeclObj) + return replaceAndSaveClassNames(gDeclObj, gDeclKey); + else + return REPLACES[match]; +} + +function replaceAndSaveClassNames(obj, key) { + return `${obj}.${REPLACES[key]} = ${obj}.${key} =`; +} + +// All meta data, for each language definition, it store within the headers +// of each file in `src/languages`. `parseHeader` extracts that data and +// turns it into a useful object -- mainly for categories and what language +// this definition requires. +function parseHeader(content) { + let headers, + match = content.match(headerRegex); + + if (!match) { + return null; + } + + headers = _.compact(match[1].split('\n')); + + return _.reduce(headers, function(result, header) { + let keyVal = header.trim().split(': '), + key = keyVal[0], + value = keyVal[1] || ''; + + if(key !== 'Description' && key !== 'Language') { + value = value.split(/\s*,\s*/); + } + + result[key] = value; + + return result; + }, {}); +} + +function filterByQualifiers(blob, languages, categories) { + if(_.isEmpty(languages) && _.isEmpty(categories)) return true; + + let language = path.basename(blob.name, '.js'), + fileInfo = parseHeader(blob.result), + containsCategory = _.partial(_.includes, categories); + + if(!fileInfo) return false; + + let fileCategories = fileInfo.Category || []; + + return _.includes(languages, language) || + _.some(fileCategories, containsCategory); +} + +// For the filter task in `tools/tasks.js`, this function will look for +// categories and languages specificed from the CLI. +function buildFilterCallback(qualifiers) { + const result = _.partition(qualifiers, { 0: ':' }), + languages = result[1], + categories = _.map(result[0], category => category.slice(1)); + + return blob => filterByQualifiers(blob, languages, categories); +} + +function globDefaults(pattern, encoding) { + encoding = encoding || 'utf8'; + + // The limit option is a fix for issue #636 when the build script would + // EMFILE error for those systems who had a limit of open files per + // process. + // + // + return { pattern: pattern, limit: 50, encoding: encoding }; +} + +function getStyleNames() { + let stylesDir = 'src/styles/', + options = { ignore: `${stylesDir}default.css` }; + + return glob(`${stylesDir}*.css`, options) + .map(function(style) { + let basename = path.basename(style, '.css'), + name = _.startCase(basename), + pathName = path.relative('src', style); + + return { path: pathName, name: name }; + }); +} + +function toQueue(tasks, registry) { + return _.map(tasks, task => new Queue({ registry }).tasks(task)); +} + +module.exports = { + buildFilterCallback: buildFilterCallback, + getStyleNames: getStyleNames, + glob: globDefaults, + parseHeader: parseHeader, + regex: regex, + replace: replace, + replaceClassNames: replaceClassNames, + toQueue: toQueue, + REPLACES: REPLACES +}; diff --git a/yknjs/images/.placeholder b/yknjs/images/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/yknjs/index.html b/yknjs/index.html new file mode 100644 index 0000000..3965008 --- /dev/null +++ b/yknjs/index.html @@ -0,0 +1,59 @@ + + + Presentation Title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + diff --git a/yknjs/markdown/.placeholder b/yknjs/markdown/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/yknjs/markdown/00-intro.md b/yknjs/markdown/00-intro.md new file mode 100644 index 0000000..b9da10c --- /dev/null +++ b/yknjs/markdown/00-intro.md @@ -0,0 +1,11 @@ +# Presentation Title +You know nothing, Jon Snow! OpenStack troubleshooting from a beginner's perspective. + +* * * + +Elena Lindqvist | [@elenalindq](https://twitter.com/elenalindq) + +2020 Open Infrastructure Summit | Oct 19-23, 2020 + + +How to tackle troubleshooting an OpenStack problem, from defining the problem, finding and testing a solution, to documenting the solution and sharing it with the world. diff --git a/yknjs/qrcode-replace.js b/yknjs/qrcode-replace.js new file mode 100644 index 0000000..d71d216 --- /dev/null +++ b/yknjs/qrcode-replace.js @@ -0,0 +1,13 @@ +Reveal.addEventListener('ready', function(event) { + /* Grab all links with class="qrcode" and iterate over them */ + document.querySelectorAll('a.qrcode').forEach(function(a) { + a.text = ''; + var qr = new QRCode(a, { + text: a.href, + width : 400, + height : 400, + colorDark : "#000000", + colorLight : "rgba(255,255,255,0)", + }); + }); +}); diff --git a/yknjs/qrcodejs/.gitignore b/yknjs/qrcodejs/.gitignore new file mode 100644 index 0000000..f4bd643 --- /dev/null +++ b/yknjs/qrcodejs/.gitignore @@ -0,0 +1,4 @@ +.DS_Store + +.idea +.project diff --git a/yknjs/qrcodejs/LICENSE b/yknjs/qrcodejs/LICENSE new file mode 100644 index 0000000..93c3323 --- /dev/null +++ b/yknjs/qrcodejs/LICENSE @@ -0,0 +1,14 @@ +The MIT License (MIT) +--------------------- +Copyright (c) 2012 davidshimjs + +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. \ No newline at end of file diff --git a/yknjs/qrcodejs/README.md b/yknjs/qrcodejs/README.md new file mode 100644 index 0000000..5e2d2dc --- /dev/null +++ b/yknjs/qrcodejs/README.md @@ -0,0 +1,46 @@ +# QRCode.js +QRCode.js is javascript library for making QRCode. QRCode.js supports Cross-browser with HTML5 Canvas and table tag in DOM. +QRCode.js has no dependencies. + +## Basic Usages +``` +
    + +``` + +or with some options + +``` +
    + +``` + +and you can use some methods + +``` +qrcode.clear(); // clear the code. +qrcode.makeCode("http://naver.com"); // make another code. +``` + +## Browser Compatibility +IE6~10, Chrome, Firefox, Safari, Opera, Mobile Safari, Android, Windows Mobile, ETC. + +## License +MIT License + +## Contact +twitter @davidshimjs + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/davidshimjs/qrcodejs/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + diff --git a/yknjs/qrcodejs/bower.json b/yknjs/qrcodejs/bower.json new file mode 100644 index 0000000..0509be6 --- /dev/null +++ b/yknjs/qrcodejs/bower.json @@ -0,0 +1,18 @@ +{ + "name": "qrcode.js", + "version": "0.0.1", + "homepage": "https://github.com/davidshimjs/qrcodejs", + "authors": [ + "Sangmin Shim", "Sangmin Shim (http://jaguarjs.com)" + ], + "description": "Cross-browser QRCode generator for javascript", + "main": "qrcode.js", + "ignore": [ + "bower_components", + "node_modules", + "index.html", + "index.svg", + "jquery.min.js", + "qrcode.min.js" + ] +} diff --git a/yknjs/qrcodejs/index-svg.html b/yknjs/qrcodejs/index-svg.html new file mode 100644 index 0000000..025a135 --- /dev/null +++ b/yknjs/qrcodejs/index-svg.html @@ -0,0 +1,47 @@ + + + + Cross-Browser QRCode generator for Javascript + + + + + + + + + + + + + diff --git a/yknjs/qrcodejs/index.html b/yknjs/qrcodejs/index.html new file mode 100644 index 0000000..fc16f3d --- /dev/null +++ b/yknjs/qrcodejs/index.html @@ -0,0 +1,44 @@ + + + +Cross-Browser QRCode generator for Javascript + + + + + + +
    +
    + + + \ No newline at end of file diff --git a/yknjs/qrcodejs/index.svg b/yknjs/qrcodejs/index.svg new file mode 100644 index 0000000..fabe56a --- /dev/null +++ b/yknjs/qrcodejs/index.svg @@ -0,0 +1,37 @@ + + + + + +
    + +
    + + + +
    +
    diff --git a/yknjs/qrcodejs/jquery.min.js b/yknjs/qrcodejs/jquery.min.js new file mode 100644 index 0000000..2740cc4 --- /dev/null +++ b/yknjs/qrcodejs/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v1.8.3 jquery.com | jquery.org/license */ +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
    a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
    t
    ",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
    ",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
    ",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

    ",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
    ","
    "]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
    ").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.ajQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/yknjs/qrcodejs/qrcode.js b/yknjs/qrcodejs/qrcode.js new file mode 100644 index 0000000..5507c15 --- /dev/null +++ b/yknjs/qrcodejs/qrcode.js @@ -0,0 +1,614 @@ +/** + * @fileoverview + * - Using the 'QRCode for Javascript library' + * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. + * - this library has no dependencies. + * + * @author davidshimjs + * @see http://www.d-project.com/ + * @see http://jeromeetienne.github.com/jquery-qrcode/ + */ +var QRCode; + +(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + this.parsedData = []; + + // Added to support UTF-8 Characters + for (var i = 0, l = this.data.length; i < l; i++) { + var byteArray = []; + var code = this.data.charCodeAt(i); + + if (code > 0x10000) { + byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); + byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); + byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[3] = 0x80 | (code & 0x3F); + } else if (code > 0x800) { + byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); + byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[2] = 0x80 | (code & 0x3F); + } else if (code > 0x80) { + byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); + byteArray[1] = 0x80 | (code & 0x3F); + } else { + byteArray[0] = code; + } + + this.parsedData.push(byteArray); + } + + this.parsedData = Array.prototype.concat.apply([], this.parsedData); + + if (this.parsedData.length != this.data.length) { + this.parsedData.unshift(191); + this.parsedData.unshift(187); + this.parsedData.unshift(239); + } + } + + QR8bitByte.prototype = { + getLength: function (buffer) { + return this.parsedData.length; + }, + write: function (buffer) { + for (var i = 0, l = this.parsedData.length; i < l; i++) { + buffer.put(this.parsedData[i], 8); + } + } + }; + + function QRCodeModel(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = []; + } + + QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} + return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);} + if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} + this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} + return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} + for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} + for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} + this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);} + var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} + this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} + row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error("code length overflow. (" + +buffer.getLengthInBits() + +">" + +totalDataCount*8 + +")");} + if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} + while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} + while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD1,8);} + return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}} + var totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} + return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} + return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} + return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}} + for(var row=0;row=256){n-=255;} + return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} + if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} + this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; + + function _isSupportCanvas() { + return typeof CanvasRenderingContext2D != "undefined"; + } + + // android 2.x doesn't support Data-URI spec + function _getAndroid() { + var android = false; + var sAgent = navigator.userAgent; + + if (/android/i.test(sAgent)) { // android + android = true; + var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); + + if (aMat && aMat[1]) { + android = parseFloat(aMat[1]); + } + } + + return android; + } + + var svgDrawer = (function() { + + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + + this.clear(); + + function makeSVG(tag, attrs) { + var el = document.createElementNS('http://www.w3.org/2000/svg', tag); + for (var k in attrs) + if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); + return el; + } + + var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); + svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + _el.appendChild(svg); + + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + if (oQRCode.isDark(row, col)) { + var child = makeSVG("use", {"x": String(col), "y": String(row)}); + child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") + svg.appendChild(child); + } + } + } + }; + Drawing.prototype.clear = function () { + while (this._el.hasChildNodes()) + this._el.removeChild(this._el.lastChild); + }; + return Drawing; + })(); + + var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; + + // Drawing in DOM by using Table tag + var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + var aHTML = ['
    ']; + + for (var row = 0; row < nCount; row++) { + aHTML.push(''); + + for (var col = 0; col < nCount; col++) { + aHTML.push(''); + } + + aHTML.push(''); + } + + aHTML.push('
    '); + _el.innerHTML = aHTML.join(''); + + // Fix the margin values as real size. + var elTable = _el.childNodes[0]; + var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; + var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; + + if (nLeftMarginTable > 0 && nTopMarginTable > 0) { + elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; + } + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._el.innerHTML = ''; + }; + + return Drawing; + })() : (function () { // Drawing in Canvas + function _onMakeImage() { + this._elImage.src = this._elCanvas.toDataURL("image/png"); + this._elImage.style.display = "block"; + this._elCanvas.style.display = "none"; + } + + // Android 2.1 bug workaround + // http://code.google.com/p/android/issues/detail?id=5141 + if (this._android && this._android <= 2.1) { + var factor = 1 / window.devicePixelRatio; + var drawImage = CanvasRenderingContext2D.prototype.drawImage; + CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + if (("nodeName" in image) && /img/i.test(image.nodeName)) { + for (var i = arguments.length - 1; i >= 1; i--) { + arguments[i] = arguments[i] * factor; + } + } else if (typeof dw == "undefined") { + arguments[1] *= factor; + arguments[2] *= factor; + arguments[3] *= factor; + arguments[4] *= factor; + } + + drawImage.apply(this, arguments); + }; + } + + /** + * Check whether the user's browser supports Data URI or not + * + * @private + * @param {Function} fSuccess Occurs if it supports Data URI + * @param {Function} fFail Occurs if it doesn't support Data URI + */ + function _safeSetDataURI(fSuccess, fFail) { + var self = this; + self._fFail = fFail; + self._fSuccess = fSuccess; + + // Check it just once + if (self._bSupportDataURI === null) { + var el = document.createElement("img"); + var fOnError = function() { + self._bSupportDataURI = false; + + if (self._fFail) { + self._fFail.call(self); + } + }; + var fOnSuccess = function() { + self._bSupportDataURI = true; + + if (self._fSuccess) { + self._fSuccess.call(self); + } + }; + + el.onabort = fOnError; + el.onerror = fOnError; + el.onload = fOnSuccess; + el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. + return; + } else if (self._bSupportDataURI === true && self._fSuccess) { + self._fSuccess.call(self); + } else if (self._bSupportDataURI === false && self._fFail) { + self._fFail.call(self); + } + }; + + /** + * Drawing QRCode by using canvas + * + * @constructor + * @param {HTMLElement} el + * @param {Object} htOption QRCode Options + */ + var Drawing = function (el, htOption) { + this._bIsPainted = false; + this._android = _getAndroid(); + + this._htOption = htOption; + this._elCanvas = document.createElement("canvas"); + this._elCanvas.width = htOption.width; + this._elCanvas.height = htOption.height; + el.appendChild(this._elCanvas); + this._el = el; + this._oContext = this._elCanvas.getContext("2d"); + this._bIsPainted = false; + this._elImage = document.createElement("img"); + this._elImage.alt = "Scan me!"; + this._elImage.style.display = "none"; + this._el.appendChild(this._elImage); + this._bSupportDataURI = null; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _elImage = this._elImage; + var _oContext = this._oContext; + var _htOption = this._htOption; + + var nCount = oQRCode.getModuleCount(); + var nWidth = _htOption.width / nCount; + var nHeight = _htOption.height / nCount; + var nRoundedWidth = Math.round(nWidth); + var nRoundedHeight = Math.round(nHeight); + + _elImage.style.display = "none"; + this.clear(); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + var bIsDark = oQRCode.isDark(row, col); + var nLeft = col * nWidth; + var nTop = row * nHeight; + _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.lineWidth = 1; + _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.fillRect(nLeft, nTop, nWidth, nHeight); + + // 안티 앨리어싱 방지 처리 + _oContext.strokeRect( + Math.floor(nLeft) + 0.5, + Math.floor(nTop) + 0.5, + nRoundedWidth, + nRoundedHeight + ); + + _oContext.strokeRect( + Math.ceil(nLeft) - 0.5, + Math.ceil(nTop) - 0.5, + nRoundedWidth, + nRoundedHeight + ); + } + } + + this._bIsPainted = true; + }; + + /** + * Make the image from Canvas if the browser supports Data URI. + */ + Drawing.prototype.makeImage = function () { + if (this._bIsPainted) { + _safeSetDataURI.call(this, _onMakeImage); + } + }; + + /** + * Return whether the QRCode is painted or not + * + * @return {Boolean} + */ + Drawing.prototype.isPainted = function () { + return this._bIsPainted; + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); + this._bIsPainted = false; + }; + + /** + * @private + * @param {Number} nNumber + */ + Drawing.prototype.round = function (nNumber) { + if (!nNumber) { + return nNumber; + } + + return Math.floor(nNumber * 1000) / 1000; + }; + + return Drawing; + })(); + + /** + * Get the type by string length + * + * @private + * @param {String} sText + * @param {Number} nCorrectLevel + * @return {Number} type + */ + function _getTypeNumber(sText, nCorrectLevel) { + var nType = 1; + var length = _getUTF8Length(sText); + + for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { + var nLimit = 0; + + switch (nCorrectLevel) { + case QRErrorCorrectLevel.L : + nLimit = QRCodeLimitLength[i][0]; + break; + case QRErrorCorrectLevel.M : + nLimit = QRCodeLimitLength[i][1]; + break; + case QRErrorCorrectLevel.Q : + nLimit = QRCodeLimitLength[i][2]; + break; + case QRErrorCorrectLevel.H : + nLimit = QRCodeLimitLength[i][3]; + break; + } + + if (length <= nLimit) { + break; + } else { + nType++; + } + } + + if (nType > QRCodeLimitLength.length) { + throw new Error("Too long data"); + } + + return nType; + } + + function _getUTF8Length(sText) { + var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); + return replacedText.length + (replacedText.length != sText ? 3 : 0); + } + + /** + * @class QRCode + * @constructor + * @example + * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); + * + * @example + * var oQRCode = new QRCode("test", { + * text : "http://naver.com", + * width : 128, + * height : 128 + * }); + * + * oQRCode.clear(); // Clear the QRCode. + * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. + * + * @param {HTMLElement|String} el target element or 'id' attribute of element. + * @param {Object|String} vOption + * @param {String} vOption.text QRCode link data + * @param {Number} [vOption.width=256] + * @param {Number} [vOption.height=256] + * @param {String} [vOption.colorDark="#000000"] + * @param {String} [vOption.colorLight="#ffffff"] + * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] + */ + QRCode = function (el, vOption) { + this._htOption = { + width : 256, + height : 256, + typeNumber : 4, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRErrorCorrectLevel.H + }; + + if (typeof vOption === 'string') { + vOption = { + text : vOption + }; + } + + // Overwrites options + if (vOption) { + for (var i in vOption) { + this._htOption[i] = vOption[i]; + } + } + + if (typeof el == "string") { + el = document.getElementById(el); + } + + if (this._htOption.useSVG) { + Drawing = svgDrawer; + } + + this._android = _getAndroid(); + this._el = el; + this._oQRCode = null; + this._oDrawing = new Drawing(this._el, this._htOption); + + if (this._htOption.text) { + this.makeCode(this._htOption.text); + } + }; + + /** + * Make the QRCode + * + * @param {String} sText link data + */ + QRCode.prototype.makeCode = function (sText) { + this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); + this._oQRCode.addData(sText); + this._oQRCode.make(); + this._el.title = sText; + this._oDrawing.draw(this._oQRCode); + this.makeImage(); + }; + + /** + * Make the Image from Canvas element + * - It occurs automatically + * - Android below 3 doesn't support Data-URI spec. + * + * @private + */ + QRCode.prototype.makeImage = function () { + if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { + this._oDrawing.makeImage(); + } + }; + + /** + * Clear the QRCode + */ + QRCode.prototype.clear = function () { + this._oDrawing.clear(); + }; + + /** + * @name QRCode.CorrectLevel + */ + QRCode.CorrectLevel = QRErrorCorrectLevel; +})(); diff --git a/yknjs/qrcodejs/qrcode.min.js b/yknjs/qrcodejs/qrcode.min.js new file mode 100644 index 0000000..993e88f --- /dev/null +++ b/yknjs/qrcodejs/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
    "),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/yknjs/reveal-config.js b/yknjs/reveal-config.js new file mode 100644 index 0000000..c92fd1f --- /dev/null +++ b/yknjs/reveal-config.js @@ -0,0 +1,41 @@ +// Full list of configuration options available here: +// https://github.com/hakimel/reveal.js#configuration +Reveal.initialize({ + + controls: false, + + progress: true, + history: true, + center: true, + showNotes: false, + + transition: 'fade', + + + menu: { + themes: false, + transitions: false, + openButton: false, + openSlideNumber: true, + markers: true + }, + + + + + + // Optional libraries used to extend on reveal.js + dependencies: [ + { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } }, + { src: 'reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: 'reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, + { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } }, + { src: 'reveal.js/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }, + + + { src: 'reveal.js-menu/menu.js', async: true, condition: function() { return !!document.body.classList; } }, + + + ] +}); diff --git a/yknjs/reveal.js-menu/CONTRIBUTING.md b/yknjs/reveal.js-menu/CONTRIBUTING.md new file mode 100644 index 0000000..37ee6a7 --- /dev/null +++ b/yknjs/reveal.js-menu/CONTRIBUTING.md @@ -0,0 +1,9 @@ +## Contributing + +### Bug Reports +When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. + +### Pull Requests +- Should follow the coding style of the file you work in +- Should be made towards the **dev branch** +- Should be submitted from a feature/topic branch (not your master) diff --git a/yknjs/reveal.js-menu/LICENSE b/yknjs/reveal.js-menu/LICENSE new file mode 100644 index 0000000..8097948 --- /dev/null +++ b/yknjs/reveal.js-menu/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2015 Greg Denehy + +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. \ No newline at end of file diff --git a/yknjs/reveal.js-menu/README.md b/yknjs/reveal.js-menu/README.md new file mode 100644 index 0000000..773ed14 --- /dev/null +++ b/yknjs/reveal.js-menu/README.md @@ -0,0 +1,334 @@ +# reveal.js-menu + +A slideout menu plugin for [Reveal.js](https://github.com/hakimel/reveal.js) to quickly jump to any slide by title. Also optionally change the theme and set the default transition. [Check out the live demo](https://denehyg.github.io/reveal.js-menu) + +## Installation + +### Bower + +Download and install the package in your project: + +```bower install reveal.js-menu``` + +Add the plugin to the dependencies in your presentation, as below. + +```javascript +Reveal.initialize({ + // ... + + dependencies: [ + // ... + + { src: 'bower_components/reveal.js-menu/menu.js' } + ] +}); +``` + +### npm + +Download and install the package in your project: + +```npm install --save reveal.js-menu``` + +Add the plugin to the dependencies in your presentation, as below. + +```javascript +Reveal.initialize({ + // ... + + dependencies: [ + // ... + + { src: 'node_modules/reveal.js-menu/menu.js' } + ] +}); +``` + +### Manual + +Copy this repository into the plugins folder of your reveal.js presentation, ie ```plugins/menu```. + +Add the plugin to the dependencies in your presentation, as below. + +```javascript +Reveal.initialize({ + // ... + + dependencies: [ + // ... + + { src: 'plugin/menu/menu.js' } + ] +}); +``` + +## Configuration + +You can configure the menu for your presentation by providing a ```menu``` option in the reveal.js initialization options. Note that all config values are optional and will default as specified below. + +```javascript +Reveal.initialize({ + // ... + + menu: { + // Specifies which side of the presentation the menu will + // be shown. Use 'left' or 'right'. + side: 'left', + + // Specifies the width of the menu. + // Can be one of the following: + // 'normal', 'wide', 'third', 'half', 'full', or + // any valid css length value + width: 'normal', + + // Add slide numbers to the titles in the slide list. + // Use 'true' or format string (same as reveal.js slide numbers) + numbers: false, + + // Specifies which slide elements will be used for generating + // the slide titles in the menu. The default selects the first + // heading element found in the slide, but you can specify any + // valid css selector and the text from the first matching + // element will be used. + // Note: that a section data-menu-title attribute or an element + // with a menu-title class will take precedence over this option + titleSelector: 'h1, h2, h3, h4, h5, h6', + + // If slides do not have a matching title, attempt to use the + // start of the text content as the title instead + useTextContentForMissingTitles: false, + + // Hide slides from the menu that do not have a title. + // Set to 'true' to only list slides with titles. + hideMissingTitles: false, + + // Adds markers to the slide titles to indicate the + // progress through the presentation. Set to 'false' + // to hide the markers. + markers: true, + + // Specify custom panels to be included in the menu, by + // providing an array of objects with 'title', 'icon' + // properties, and either a 'src' or 'content' property. + custom: false, + + // Specifies the themes that will be available in the themes + // menu panel. Set to 'true' to show the themes menu panel + // with the default themes list. Alternatively, provide an + // array to specify the themes to make available in the + // themes menu panel, for example... + // [ + // { name: 'Black', theme: 'css/theme/black.css' }, + // { name: 'White', theme: 'css/theme/white.css' }, + // { name: 'League', theme: 'css/theme/league.css' } + // ] + themes: false, + + // Specifies the path to the default theme files. If your + // presentation uses a different path to the standard reveal + // layout then you need to provide this option, but only + // when 'themes' is set to 'true'. If you provide your own + // list of themes or 'themes' is set to 'false' the + // 'themesPath' option is ignored. + themesPath: 'css/theme/', + + // Specifies if the transitions menu panel will be shown. + // Set to 'true' to show the transitions menu panel with + // the default transitions list. Alternatively, provide an + // array to specify the transitions to make available in + // the transitions panel, for example... + // ['None', 'Fade', 'Slide'] + transitions: false, + + // Adds a menu button to the slides to open the menu panel. + // Set to 'false' to hide the button. + openButton: true, + + // If 'true' allows the slide number in the presentation to + // open the menu panel. The reveal.js slideNumber option must + // be displayed for this to take effect + openSlideNumber: false, + + // If true allows the user to open and navigate the menu using + // the keyboard. Standard keyboard interaction with reveal + // will be disabled while the menu is open. + keyboard: true, + + // Normally the menu will close on user actions such as + // selecting a menu item, or clicking the presentation area. + // If 'true', the sticky option will leave the menu open + // until it is explicitly closed, that is, using the close + // button or pressing the ESC or m key (when the keyboard + // interaction option is enabled). + sticky: false, + + // If 'true' standard menu items will be automatically opened + // when navigating using the keyboard. Note: this only takes + // effect when both the 'keyboard' and 'sticky' options are enabled. + autoOpen: true, + + // If 'true' the menu will not be created until it is explicitly + // requested by calling RevealMenu.init(). Note this will delay + // the creation of all menu panels, including custom panels, and + // the menu button. + delayInit: false, + + // If 'true' the menu will be shown when the menu is initialised. + openOnInit: false, + + // By default the menu will load it's own font-awesome library + // icons. If your presentation needs to load a different + // font-awesome library the 'loadIcons' option can be set to false + // and the menu will not attempt to load the font-awesome library. + loadIcons: true + }, + +}); +``` + +### Themes Stylesheet + +If you are using the themes panel you need to ensure the theme stylesheet in the presentation uses the ```id="theme"``` attribute. For example... +```html + +``` + +## Slide Titles + +The slide titles used in the menu can be supplied explicitly or are taken directly from the presentation, using the following rules... + +###### 1. The section's ```data-menu-title``` attribute. +If the slide's section element contains a ```data-menu-title``` attribute this will be used for the slide title in the menu. For example... + +```html +
    +

    Title

    +

    ...

    +
    +``` + +###### 2. Any element with the class ```menu-title```. +If the slide's section contains an element with the class ```menu-title``` then the element's text will be used for the title. The first such element found will be used if there are more than one. Note the element need not be displayed to be used. For example... + +```html +
    +

    Title

    + +

    ...

    +
    +``` + +###### 3. The first heading found or a custom element selector +The ```titleSelector``` option can be used to customise the elements that will be used to generate the slide titles in the menu. The default option selects the first heading element found in the slide. For example... + +```html +
    +

    This will be the slide title in the menu

    +

    Title

    +

    ...

    +
    +``` + +Any valid CSS selector should work but note the selector will only be applied to elements contained within the slide section. You could use the ```'h1'``` selector to only use level 1 headings or ```'p'``` to use the first paragraph element. For example, ```titleSelector: 'p.lead'``` would be used like this... + +```html +
    +

    Title

    +

    This will be the slide title in the menu

    +

    ...

    +
    +``` + +Using ```titleSelector: ''``` will ignore all elements and no title will be provided, unless the slide section contains a ```data-menu-title``` attribute or an element with the ```menu-title``` class. + +###### 4. No title is provided +If no title can be found using the above methods, a default title incorporating the slide number will be used. For example, the following would result in a slide title in the format of 'Slide 12'... + +```html +
    +

    ...

    +
    +``` + +If the ```hideMissingTitles``` option is set to ```true```, however, the slide will not be listed in the menu. + + +## Custom Menu Panels + +Additional custom panels can be added the menu using the ```custom``` option. + +```javascript +Reveal.initialize({ + // ... + + menu: { + // ... + + custom: [ + { title: 'Links', icon: '', src: 'links.html' }, + { title: 'About', icon: '', content: '

    This slidedeck is created with reveal.js

    ' } + ] + } +}); +``` + +```title``` and ```icon``` are used for the toolbar buttons at the top of the menu. There are two approaches you can use to provide content for the panels... + +* You can provide a URL in ```src``` to load html from another file. +* Alternatively, you can provide html in ```content``` and this will be added to the custom panel. + +###### Custom slide menu items + +You can provide menu items in your custom panels using the following format. This allows you to define your own navigation links for your presentation. + +```html +

    Links

    + +``` + +You are not limited to linking to presentation slides. You can provide any link you wish. + +```html +

    External Links

    + +``` + +Using menu items enables keyboard navigation of your links as with the other panels. However, you don't have to use menu items for your links. You can simply provide standard links and unordered lists in your html. Notice you can provide your custom menu items mixed with other html if you wish. + + +## Ready Event + +A 'menu-ready' event is fired when reveal.js-menu has loaded all non-async dependencies and is ready to start navigating. + +```javascript +Reveal.addEventListener( 'menu-ready', function( event ) { + // your code +} ); +``` + +## API + +The `RevealMenu` object exposes a JavaScript API for controlling the menu: + +| Function | Description | +|--------------------------|---------------| +| toggle(event) | Toggles the open state of the menu, ie open if it is closed, and close if it is open | +| openMenu(event) | Opens the menu | +| closeMenu(event, force) | Closes the menu. To force the menu to close (ie when `sticky` option is `true`) call `closeMenu(null, true)` | +| openPanel(event, ref) | Opens the menu to a specific panel, passing the name of the panel or the panel element itself | +| isOpen() | Returns true if the menu is open | +| init() | Initialises the menu if it has not already been initialised. Used in conjunction with the `delayInit` option | +| isInit() | Returns true if the menu has been initialised | + + +## License + +MIT licensed + +Copyright (C) 2015 Greg Denehy diff --git a/yknjs/reveal.js-menu/bower.json b/yknjs/reveal.js-menu/bower.json new file mode 100644 index 0000000..1baac36 --- /dev/null +++ b/yknjs/reveal.js-menu/bower.json @@ -0,0 +1,10 @@ +{ + "name": "reveal.js-menu", + "version": "1.2.0", + "homepage": "https://denehyg.github.io/reveal.js-menu", + "authors": ["Greg Denehy"], + "description": "A slideout menu for navigating reveal.js presentations", + "keywords": ["reveal", "menu"], + "license": "MIT, Copyright (C) 2016 Greg Denehy", + "ignore": ["**/.*", "node_modules", "bower_components", "test", "tests"] +} diff --git a/yknjs/reveal.js-menu/font-awesome/LICENSE.txt b/yknjs/reveal.js-menu/font-awesome/LICENSE.txt new file mode 100644 index 0000000..28c1c4b --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/LICENSE.txt @@ -0,0 +1,34 @@ +Font Awesome Free License +------------------------- + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license. + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) +In the Font Awesome Free download, the CC BY 4.0 license applies to all icons +packaged as SVG and JS file types. + +# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) +In the Font Awesome Free download, the SIL OLF license applies to all icons +packaged as web and desktop font files. + +# Code: MIT License (https://opensource.org/licenses/MIT) +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +# Attribution +Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +# Brand Icons +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/yknjs/reveal.js-menu/font-awesome/css/all.css b/yknjs/reveal.js-menu/font-awesome/css/all.css new file mode 100644 index 0000000..7fec2e3 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/all.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/css/brands.css b/yknjs/reveal.js-menu/font-awesome/css/brands.css new file mode 100644 index 0000000..2d9e4c6 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/brands.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/css/fontawesome.css b/yknjs/reveal.js-menu/font-awesome/css/fontawesome.css new file mode 100644 index 0000000..68b26ef --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/fontawesome.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/css/regular.css b/yknjs/reveal.js-menu/font-awesome/css/regular.css new file mode 100644 index 0000000..02b22fa --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/regular.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/css/solid.css b/yknjs/reveal.js-menu/font-awesome/css/solid.css new file mode 100644 index 0000000..aed56a2 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/solid.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/css/svg-with-js.css b/yknjs/reveal.js-menu/font-awesome/css/svg-with-js.css new file mode 100644 index 0000000..504203d --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/svg-with-js.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;transform:scale(.25);transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;transform:scale(.25);transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;transform:scale(.25);transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/css/v4-shims.css b/yknjs/reveal.js-menu/font-awesome/css/v4-shims.css new file mode 100644 index 0000000..b10f655 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/v4-shims.css @@ -0,0 +1,2170 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa.fa-glass:before { + content: "\f000"; } + +.fa.fa-meetup { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-star-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-o:before { + content: "\f005"; } + +.fa.fa-remove:before { + content: "\f00d"; } + +.fa.fa-close:before { + content: "\f00d"; } + +.fa.fa-gear:before { + content: "\f013"; } + +.fa.fa-trash-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-trash-o:before { + content: "\f2ed"; } + +.fa.fa-file-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-o:before { + content: "\f15b"; } + +.fa.fa-clock-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-clock-o:before { + content: "\f017"; } + +.fa.fa-arrow-circle-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-down:before { + content: "\f358"; } + +.fa.fa-arrow-circle-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-up:before { + content: "\f35b"; } + +.fa.fa-play-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-play-circle-o:before { + content: "\f144"; } + +.fa.fa-repeat:before { + content: "\f01e"; } + +.fa.fa-rotate-right:before { + content: "\f01e"; } + +.fa.fa-refresh:before { + content: "\f021"; } + +.fa.fa-list-alt { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-dedent:before { + content: "\f03b"; } + +.fa.fa-video-camera:before { + content: "\f03d"; } + +.fa.fa-picture-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-picture-o:before { + content: "\f03e"; } + +.fa.fa-photo { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-photo:before { + content: "\f03e"; } + +.fa.fa-image { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-image:before { + content: "\f03e"; } + +.fa.fa-pencil:before { + content: "\f303"; } + +.fa.fa-map-marker:before { + content: "\f3c5"; } + +.fa.fa-pencil-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-pencil-square-o:before { + content: "\f044"; } + +.fa.fa-share-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-share-square-o:before { + content: "\f14d"; } + +.fa.fa-check-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-check-square-o:before { + content: "\f14a"; } + +.fa.fa-arrows:before { + content: "\f0b2"; } + +.fa.fa-times-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-times-circle-o:before { + content: "\f057"; } + +.fa.fa-check-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-check-circle-o:before { + content: "\f058"; } + +.fa.fa-mail-forward:before { + content: "\f064"; } + +.fa.fa-eye { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-eye-slash { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-warning:before { + content: "\f071"; } + +.fa.fa-calendar:before { + content: "\f073"; } + +.fa.fa-arrows-v:before { + content: "\f338"; } + +.fa.fa-arrows-h:before { + content: "\f337"; } + +.fa.fa-bar-chart { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bar-chart:before { + content: "\f080"; } + +.fa.fa-bar-chart-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bar-chart-o:before { + content: "\f080"; } + +.fa.fa-twitter-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gears:before { + content: "\f085"; } + +.fa.fa-thumbs-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-up:before { + content: "\f164"; } + +.fa.fa-thumbs-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-down:before { + content: "\f165"; } + +.fa.fa-heart-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-heart-o:before { + content: "\f004"; } + +.fa.fa-sign-out:before { + content: "\f2f5"; } + +.fa.fa-linkedin-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-linkedin-square:before { + content: "\f08c"; } + +.fa.fa-thumb-tack:before { + content: "\f08d"; } + +.fa.fa-external-link:before { + content: "\f35d"; } + +.fa.fa-sign-in:before { + content: "\f2f6"; } + +.fa.fa-github-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-lemon-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-lemon-o:before { + content: "\f094"; } + +.fa.fa-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-square-o:before { + content: "\f0c8"; } + +.fa.fa-bookmark-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bookmark-o:before { + content: "\f02e"; } + +.fa.fa-twitter { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook:before { + content: "\f39e"; } + +.fa.fa-facebook-f { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook-f:before { + content: "\f39e"; } + +.fa.fa-github { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-credit-card { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-feed:before { + content: "\f09e"; } + +.fa.fa-hdd-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hdd-o:before { + content: "\f0a0"; } + +.fa.fa-hand-o-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-right:before { + content: "\f0a4"; } + +.fa.fa-hand-o-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-left:before { + content: "\f0a5"; } + +.fa.fa-hand-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-up:before { + content: "\f0a6"; } + +.fa.fa-hand-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-down:before { + content: "\f0a7"; } + +.fa.fa-arrows-alt:before { + content: "\f31e"; } + +.fa.fa-group:before { + content: "\f0c0"; } + +.fa.fa-chain:before { + content: "\f0c1"; } + +.fa.fa-scissors:before { + content: "\f0c4"; } + +.fa.fa-files-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-files-o:before { + content: "\f0c5"; } + +.fa.fa-floppy-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-floppy-o:before { + content: "\f0c7"; } + +.fa.fa-navicon:before { + content: "\f0c9"; } + +.fa.fa-reorder:before { + content: "\f0c9"; } + +.fa.fa-pinterest { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus:before { + content: "\f0d5"; } + +.fa.fa-money { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-money:before { + content: "\f3d1"; } + +.fa.fa-unsorted:before { + content: "\f0dc"; } + +.fa.fa-sort-desc:before { + content: "\f0dd"; } + +.fa.fa-sort-asc:before { + content: "\f0de"; } + +.fa.fa-linkedin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-linkedin:before { + content: "\f0e1"; } + +.fa.fa-rotate-left:before { + content: "\f0e2"; } + +.fa.fa-legal:before { + content: "\f0e3"; } + +.fa.fa-tachometer:before { + content: "\f3fd"; } + +.fa.fa-dashboard:before { + content: "\f3fd"; } + +.fa.fa-comment-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-comment-o:before { + content: "\f075"; } + +.fa.fa-comments-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-comments-o:before { + content: "\f086"; } + +.fa.fa-flash:before { + content: "\f0e7"; } + +.fa.fa-clipboard { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-paste { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-paste:before { + content: "\f328"; } + +.fa.fa-lightbulb-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-lightbulb-o:before { + content: "\f0eb"; } + +.fa.fa-exchange:before { + content: "\f362"; } + +.fa.fa-cloud-download:before { + content: "\f381"; } + +.fa.fa-cloud-upload:before { + content: "\f382"; } + +.fa.fa-bell-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bell-o:before { + content: "\f0f3"; } + +.fa.fa-cutlery:before { + content: "\f2e7"; } + +.fa.fa-file-text-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-text-o:before { + content: "\f15c"; } + +.fa.fa-building-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-building-o:before { + content: "\f1ad"; } + +.fa.fa-hospital-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hospital-o:before { + content: "\f0f8"; } + +.fa.fa-tablet:before { + content: "\f3fa"; } + +.fa.fa-mobile:before { + content: "\f3cd"; } + +.fa.fa-mobile-phone:before { + content: "\f3cd"; } + +.fa.fa-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-circle-o:before { + content: "\f111"; } + +.fa.fa-mail-reply:before { + content: "\f3e5"; } + +.fa.fa-github-alt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-folder-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-folder-o:before { + content: "\f07b"; } + +.fa.fa-folder-open-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-folder-open-o:before { + content: "\f07c"; } + +.fa.fa-smile-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-smile-o:before { + content: "\f118"; } + +.fa.fa-frown-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-frown-o:before { + content: "\f119"; } + +.fa.fa-meh-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-meh-o:before { + content: "\f11a"; } + +.fa.fa-keyboard-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-keyboard-o:before { + content: "\f11c"; } + +.fa.fa-flag-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-flag-o:before { + content: "\f024"; } + +.fa.fa-mail-reply-all:before { + content: "\f122"; } + +.fa.fa-star-half-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-half-o:before { + content: "\f089"; } + +.fa.fa-star-half-empty { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-half-empty:before { + content: "\f089"; } + +.fa.fa-star-half-full { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-half-full:before { + content: "\f089"; } + +.fa.fa-code-fork:before { + content: "\f126"; } + +.fa.fa-chain-broken:before { + content: "\f127"; } + +.fa.fa-shield:before { + content: "\f3ed"; } + +.fa.fa-calendar-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-o:before { + content: "\f133"; } + +.fa.fa-maxcdn { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-html5 { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-css3 { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ticket:before { + content: "\f3ff"; } + +.fa.fa-minus-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-minus-square-o:before { + content: "\f146"; } + +.fa.fa-level-up:before { + content: "\f3bf"; } + +.fa.fa-level-down:before { + content: "\f3be"; } + +.fa.fa-pencil-square:before { + content: "\f14b"; } + +.fa.fa-external-link-square:before { + content: "\f360"; } + +.fa.fa-compass { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down:before { + content: "\f150"; } + +.fa.fa-toggle-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-down:before { + content: "\f150"; } + +.fa.fa-caret-square-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-up:before { + content: "\f151"; } + +.fa.fa-toggle-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-up:before { + content: "\f151"; } + +.fa.fa-caret-square-o-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-right:before { + content: "\f152"; } + +.fa.fa-toggle-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-right:before { + content: "\f152"; } + +.fa.fa-eur:before { + content: "\f153"; } + +.fa.fa-euro:before { + content: "\f153"; } + +.fa.fa-gbp:before { + content: "\f154"; } + +.fa.fa-usd:before { + content: "\f155"; } + +.fa.fa-dollar:before { + content: "\f155"; } + +.fa.fa-inr:before { + content: "\f156"; } + +.fa.fa-rupee:before { + content: "\f156"; } + +.fa.fa-jpy:before { + content: "\f157"; } + +.fa.fa-cny:before { + content: "\f157"; } + +.fa.fa-rmb:before { + content: "\f157"; } + +.fa.fa-yen:before { + content: "\f157"; } + +.fa.fa-rub:before { + content: "\f158"; } + +.fa.fa-ruble:before { + content: "\f158"; } + +.fa.fa-rouble:before { + content: "\f158"; } + +.fa.fa-krw:before { + content: "\f159"; } + +.fa.fa-won:before { + content: "\f159"; } + +.fa.fa-btc { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin:before { + content: "\f15a"; } + +.fa.fa-file-text:before { + content: "\f15c"; } + +.fa.fa-sort-alpha-asc:before { + content: "\f15d"; } + +.fa.fa-sort-alpha-desc:before { + content: "\f15e"; } + +.fa.fa-sort-amount-asc:before { + content: "\f160"; } + +.fa.fa-sort-amount-desc:before { + content: "\f161"; } + +.fa.fa-sort-numeric-asc:before { + content: "\f162"; } + +.fa.fa-sort-numeric-desc:before { + content: "\f163"; } + +.fa.fa-youtube-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-youtube { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-xing { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-xing-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play:before { + content: "\f167"; } + +.fa.fa-dropbox { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stack-overflow { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-instagram { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-flickr { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-adn { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square:before { + content: "\f171"; } + +.fa.fa-tumblr { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-long-arrow-down:before { + content: "\f309"; } + +.fa.fa-long-arrow-up:before { + content: "\f30c"; } + +.fa.fa-long-arrow-left:before { + content: "\f30a"; } + +.fa.fa-long-arrow-right:before { + content: "\f30b"; } + +.fa.fa-apple { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-windows { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-android { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-linux { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-dribbble { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-skype { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-foursquare { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-trello { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gratipay { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gittip { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gittip:before { + content: "\f184"; } + +.fa.fa-sun-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-sun-o:before { + content: "\f185"; } + +.fa.fa-moon-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-moon-o:before { + content: "\f186"; } + +.fa.fa-vk { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-weibo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-renren { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pagelines { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stack-exchange { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right:before { + content: "\f35a"; } + +.fa.fa-arrow-circle-o-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-left:before { + content: "\f359"; } + +.fa.fa-caret-square-o-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-left:before { + content: "\f191"; } + +.fa.fa-toggle-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-left:before { + content: "\f191"; } + +.fa.fa-dot-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-dot-circle-o:before { + content: "\f192"; } + +.fa.fa-vimeo-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-try:before { + content: "\f195"; } + +.fa.fa-turkish-lira:before { + content: "\f195"; } + +.fa.fa-plus-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-plus-square-o:before { + content: "\f0fe"; } + +.fa.fa-slack { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wordpress { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-openid { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-institution:before { + content: "\f19c"; } + +.fa.fa-bank:before { + content: "\f19c"; } + +.fa.fa-mortar-board:before { + content: "\f19d"; } + +.fa.fa-yahoo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-reddit { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon-circle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-delicious { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-digg { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-pp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-alt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-drupal { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-joomla { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-spoon:before { + content: "\f2e5"; } + +.fa.fa-behance { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-behance-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-steam { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-steam-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-automobile:before { + content: "\f1b9"; } + +.fa.fa-cab:before { + content: "\f1ba"; } + +.fa.fa-envelope-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-envelope-o:before { + content: "\f0e0"; } + +.fa.fa-deviantart { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-soundcloud { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-file-pdf-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-pdf-o:before { + content: "\f1c1"; } + +.fa.fa-file-word-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-word-o:before { + content: "\f1c2"; } + +.fa.fa-file-excel-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-excel-o:before { + content: "\f1c3"; } + +.fa.fa-file-powerpoint-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-powerpoint-o:before { + content: "\f1c4"; } + +.fa.fa-file-image-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-image-o:before { + content: "\f1c5"; } + +.fa.fa-file-photo-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-photo-o:before { + content: "\f1c5"; } + +.fa.fa-file-picture-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-picture-o:before { + content: "\f1c5"; } + +.fa.fa-file-archive-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-archive-o:before { + content: "\f1c6"; } + +.fa.fa-file-zip-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-zip-o:before { + content: "\f1c6"; } + +.fa.fa-file-audio-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-audio-o:before { + content: "\f1c7"; } + +.fa.fa-file-sound-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-sound-o:before { + content: "\f1c7"; } + +.fa.fa-file-video-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-video-o:before { + content: "\f1c8"; } + +.fa.fa-file-movie-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-movie-o:before { + content: "\f1c8"; } + +.fa.fa-file-code-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-code-o:before { + content: "\f1c9"; } + +.fa.fa-vine { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-codepen { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-jsfiddle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-life-ring { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-bouy { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-bouy:before { + content: "\f1cd"; } + +.fa.fa-life-buoy { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-buoy:before { + content: "\f1cd"; } + +.fa.fa-life-saver { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-saver:before { + content: "\f1cd"; } + +.fa.fa-support { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-support:before { + content: "\f1cd"; } + +.fa.fa-circle-o-notch:before { + content: "\f1ce"; } + +.fa.fa-rebel { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ra { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ra:before { + content: "\f1d0"; } + +.fa.fa-resistance { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-resistance:before { + content: "\f1d0"; } + +.fa.fa-empire { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ge { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ge:before { + content: "\f1d1"; } + +.fa.fa-git-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-git { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-hacker-news { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square:before { + content: "\f1d4"; } + +.fa.fa-yc-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yc-square:before { + content: "\f1d4"; } + +.fa.fa-tencent-weibo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-qq { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-weixin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wechat { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wechat:before { + content: "\f1d7"; } + +.fa.fa-send:before { + content: "\f1d8"; } + +.fa.fa-paper-plane-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-paper-plane-o:before { + content: "\f1d8"; } + +.fa.fa-send-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-send-o:before { + content: "\f1d8"; } + +.fa.fa-circle-thin { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-circle-thin:before { + content: "\f111"; } + +.fa.fa-header:before { + content: "\f1dc"; } + +.fa.fa-sliders:before { + content: "\f1de"; } + +.fa.fa-futbol-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-futbol-o:before { + content: "\f1e3"; } + +.fa.fa-soccer-ball-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-soccer-ball-o:before { + content: "\f1e3"; } + +.fa.fa-slideshare { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-twitch { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yelp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-newspaper-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-newspaper-o:before { + content: "\f1ea"; } + +.fa.fa-paypal { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-wallet { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-visa { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-mastercard { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-discover { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-amex { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-paypal { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-stripe { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bell-slash-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bell-slash-o:before { + content: "\f1f6"; } + +.fa.fa-trash:before { + content: "\f2ed"; } + +.fa.fa-copyright { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-eyedropper:before { + content: "\f1fb"; } + +.fa.fa-area-chart:before { + content: "\f1fe"; } + +.fa.fa-pie-chart:before { + content: "\f200"; } + +.fa.fa-line-chart:before { + content: "\f201"; } + +.fa.fa-lastfm { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ioxhost { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-angellist { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-cc:before { + content: "\f20a"; } + +.fa.fa-ils:before { + content: "\f20b"; } + +.fa.fa-shekel:before { + content: "\f20b"; } + +.fa.fa-sheqel:before { + content: "\f20b"; } + +.fa.fa-meanpath { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-meanpath:before { + content: "\f2b4"; } + +.fa.fa-buysellads { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-connectdevelop { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-dashcube { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-forumbee { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-leanpub { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-sellsy { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-shirtsinbulk { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-simplybuilt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-skyatlas { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-diamond { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-diamond:before { + content: "\f3a5"; } + +.fa.fa-intersex:before { + content: "\f224"; } + +.fa.fa-facebook-official { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook-official:before { + content: "\f09a"; } + +.fa.fa-pinterest-p { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-whatsapp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-hotel:before { + content: "\f236"; } + +.fa.fa-viacoin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-medium { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yc { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yc:before { + content: "\f23b"; } + +.fa.fa-optin-monster { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-opencart { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-expeditedssl { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-battery-4:before { + content: "\f240"; } + +.fa.fa-battery:before { + content: "\f240"; } + +.fa.fa-battery-3:before { + content: "\f241"; } + +.fa.fa-battery-2:before { + content: "\f242"; } + +.fa.fa-battery-1:before { + content: "\f243"; } + +.fa.fa-battery-0:before { + content: "\f244"; } + +.fa.fa-object-group { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-object-ungroup { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o:before { + content: "\f249"; } + +.fa.fa-cc-jcb { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-diners-club { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-clone { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o:before { + content: "\f254"; } + +.fa.fa-hourglass-1:before { + content: "\f251"; } + +.fa.fa-hourglass-2:before { + content: "\f252"; } + +.fa.fa-hourglass-3:before { + content: "\f253"; } + +.fa.fa-hand-rock-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-rock-o:before { + content: "\f255"; } + +.fa.fa-hand-grab-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-grab-o:before { + content: "\f255"; } + +.fa.fa-hand-paper-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-paper-o:before { + content: "\f256"; } + +.fa.fa-hand-stop-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-stop-o:before { + content: "\f256"; } + +.fa.fa-hand-scissors-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-scissors-o:before { + content: "\f257"; } + +.fa.fa-hand-lizard-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-lizard-o:before { + content: "\f258"; } + +.fa.fa-hand-spock-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-spock-o:before { + content: "\f259"; } + +.fa.fa-hand-pointer-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-pointer-o:before { + content: "\f25a"; } + +.fa.fa-hand-peace-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-peace-o:before { + content: "\f25b"; } + +.fa.fa-registered { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-creative-commons { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gg { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gg-circle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-tripadvisor { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-get-pocket { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wikipedia-w { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-safari { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-chrome { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-firefox { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-opera { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-internet-explorer { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-television:before { + content: "\f26c"; } + +.fa.fa-contao { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-500px { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-amazon { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-calendar-plus-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-plus-o:before { + content: "\f271"; } + +.fa.fa-calendar-minus-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-minus-o:before { + content: "\f272"; } + +.fa.fa-calendar-times-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-times-o:before { + content: "\f273"; } + +.fa.fa-calendar-check-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-check-o:before { + content: "\f274"; } + +.fa.fa-map-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-map-o:before { + content: "\f279"; } + +.fa.fa-commenting { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-commenting:before { + content: "\f4ad"; } + +.fa.fa-commenting-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-commenting-o:before { + content: "\f4ad"; } + +.fa.fa-houzz { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-vimeo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-vimeo:before { + content: "\f27d"; } + +.fa.fa-black-tie { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fonticons { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-reddit-alien { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-edge { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-credit-card-alt:before { + content: "\f09d"; } + +.fa.fa-codiepie { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-modx { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fort-awesome { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-usb { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-product-hunt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-mixcloud { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-scribd { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pause-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-pause-circle-o:before { + content: "\f28b"; } + +.fa.fa-stop-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-stop-circle-o:before { + content: "\f28d"; } + +.fa.fa-bluetooth { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bluetooth-b { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gitlab { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wpbeginner { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wpforms { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-envira { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt:before { + content: "\f368"; } + +.fa.fa-question-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-question-circle-o:before { + content: "\f059"; } + +.fa.fa-volume-control-phone:before { + content: "\f2a0"; } + +.fa.fa-asl-interpreting:before { + content: "\f2a3"; } + +.fa.fa-deafness:before { + content: "\f2a4"; } + +.fa.fa-hard-of-hearing:before { + content: "\f2a4"; } + +.fa.fa-glide { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-glide-g { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-signing:before { + content: "\f2a7"; } + +.fa.fa-viadeo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-snapchat { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-first-order { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yoast { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-themeisle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official:before { + content: "\f2b3"; } + +.fa.fa-google-plus-circle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-circle:before { + content: "\f2b3"; } + +.fa.fa-font-awesome { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fa { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fa:before { + content: "\f2b4"; } + +.fa.fa-handshake-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-handshake-o:before { + content: "\f2b5"; } + +.fa.fa-envelope-open-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-envelope-open-o:before { + content: "\f2b6"; } + +.fa.fa-linode { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-address-book-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-address-book-o:before { + content: "\f2b9"; } + +.fa.fa-vcard:before { + content: "\f2bb"; } + +.fa.fa-address-card-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-address-card-o:before { + content: "\f2bb"; } + +.fa.fa-vcard-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-vcard-o:before { + content: "\f2bb"; } + +.fa.fa-user-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-user-circle-o:before { + content: "\f2bd"; } + +.fa.fa-user-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-user-o:before { + content: "\f007"; } + +.fa.fa-id-badge { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-drivers-license:before { + content: "\f2c2"; } + +.fa.fa-id-card-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-id-card-o:before { + content: "\f2c2"; } + +.fa.fa-drivers-license-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-drivers-license-o:before { + content: "\f2c2"; } + +.fa.fa-quora { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-free-code-camp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-telegram { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-thermometer-4:before { + content: "\f2c7"; } + +.fa.fa-thermometer:before { + content: "\f2c7"; } + +.fa.fa-thermometer-3:before { + content: "\f2c8"; } + +.fa.fa-thermometer-2:before { + content: "\f2c9"; } + +.fa.fa-thermometer-1:before { + content: "\f2ca"; } + +.fa.fa-thermometer-0:before { + content: "\f2cb"; } + +.fa.fa-bathtub:before { + content: "\f2cd"; } + +.fa.fa-s15:before { + content: "\f2cd"; } + +.fa.fa-window-maximize { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-window-restore { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle:before { + content: "\f410"; } + +.fa.fa-window-close-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-window-close-o:before { + content: "\f410"; } + +.fa.fa-times-rectangle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle-o:before { + content: "\f410"; } + +.fa.fa-bandcamp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-grav { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-etsy { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-imdb { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ravelry { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-eercast { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-eercast:before { + content: "\f2da"; } + +.fa.fa-snowflake-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-snowflake-o:before { + content: "\f2dc"; } + +.fa.fa-superpowers { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wpexplorer { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-spotify { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } diff --git a/yknjs/reveal.js-menu/font-awesome/css/v4-shims.min.css b/yknjs/reveal.js-menu/font-awesome/css/v4-shims.min.css new file mode 100644 index 0000000..a47c8e2 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/css/v4-shims.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f15e"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f161"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f163"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-spotify,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.eot b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..f8e48185fbfce6d497c89780b654fb96f61db74d GIT binary patch literal 115052 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 AMF0Q* literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.svg b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..68eb65a --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.svg @@ -0,0 +1,1127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.ttf b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2b00dae7f43938d373e59c9b18011de7fd4250d7 GIT binary patch literal 114816 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 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.woff b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..9e4b7e1cf0ef7bf662c3f57862cff76ac2a7e7a8 GIT binary patch literal 73920 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

    3r|irg`=Eb~<0saelL3pTCha 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

    MH4)xoH~}+J+$)>1>4Y|*8`U(`L^L&CK%&rr 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 BVx|B9 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.woff2 b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b9e58c5e61070439cebd54042000ae14b2365cfa GIT binary patch literal 63376 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 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.svg b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..5f49543 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.svg @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.ttf b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cefbd50f29c9a6a3bc2edf01dbea72b3e3eb1633 GIT binary patch literal 40516 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 ML}LQ6NqwXL1*cE}hyVZp literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.svg b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..1534b64 --- /dev/null +++ b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.svg @@ -0,0 +1,2231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.ttf b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..618136ab12df83b807b9ae22d073b0689e6b4472 GIT binary patch literal 160548 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 B=Kufz literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.woff b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.woff new file mode 100644 index 0000000000000000000000000000000000000000..af47657815d05becdaf8308a0cc9657f5aa326bd GIT binary patch literal 76632 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 APyhe` literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.woff2 b/yknjs/reveal.js-menu/font-awesome/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9ef566a9eebe03f0f4fa739e9c7e068db9b9199f GIT binary patch literal 59572 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�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 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-menu/menu.css b/yknjs/reveal.js-menu/menu.css new file mode 100644 index 0000000..0fa7af4 --- /dev/null +++ b/yknjs/reveal.js-menu/menu.css @@ -0,0 +1,345 @@ +.slide-menu-wrapper { + font-family: "Source Sans Pro", Helvetica, sans-serif; +} + +.slide-menu-wrapper .slide-menu { + background-color: #333; + z-index: 200; + position: fixed; + top: 0; + width: 300px; + height: 100%; + /*overflow-y: scroll;*/ + transition: transform 0.3s; + font-size: 16px; + font-weight: normal; +} + +.slide-menu-wrapper .slide-menu.slide-menu--wide { + width: 500px; +} + +.slide-menu-wrapper .slide-menu.slide-menu--third { + width: 33%; +} + +.slide-menu-wrapper .slide-menu.slide-menu--half { + width: 50%; +} + +.slide-menu-wrapper .slide-menu.slide-menu--full { + width: 95%; +} + +/* + * Slides menu + */ + +.slide-menu-wrapper .slide-menu-items { + margin: 0; + padding: 0; + width: 100%; + border-bottom: solid 1px #555; +} + +.slide-menu-wrapper .slide-menu-item, +.slide-menu-wrapper .slide-menu-item-vertical { + display: block; + text-align: left; + padding: 10px 18px; + color: #aaa; + cursor: pointer; +} + +.slide-menu-wrapper .slide-menu-item-vertical { + padding-left: 30px; +} + +.slide-menu-wrapper .slide-menu--wide .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--third .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--half .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--full .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--custom .slide-menu-item-vertical { + padding-left: 50px; +} + +.slide-menu-wrapper .slide-menu-item { + border-top: solid 1px #555; +} + +.slide-menu-wrapper .active-menu-panel li.selected { + background-color: #222; + color: white; +} + +.slide-menu-wrapper .active-menu-panel li.active { + color: #eee; +} + +.slide-menu-wrapper .slide-menu-item.no-title .slide-menu-item-title, +.slide-menu-wrapper .slide-menu-item-vertical.no-title .slide-menu-item-title { + font-style: italic; +} + +.slide-menu-wrapper .slide-menu-item-number { + color: #999; + padding-right:6px; +} + +.slide-menu-wrapper .slide-menu-item i.far, +.slide-menu-wrapper .slide-menu-item i.fas, +.slide-menu-wrapper .slide-menu-item-vertical i.far, +.slide-menu-wrapper .slide-menu-item-vertical i.fas, +.slide-menu-wrapper .slide-menu-item svg.svg-inline--fa, +.slide-menu-wrapper .slide-menu-item-vertical svg.svg-inline--fa { + padding-right: 12px; + display: none; +} + +.slide-menu-wrapper .slide-menu-item.past i.fas.past, +.slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, +.slide-menu-wrapper .slide-menu-item.active i.fas.active, +.slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, +.slide-menu-wrapper .slide-menu-item.future i.far.future, +.slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, +.slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, +.slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active, +.slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, +.slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { + display: inline-block; +} + +.slide-menu-wrapper .slide-menu-item.past i.fas.past, +.slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, +.slide-menu-wrapper .slide-menu-item.future i.far.future, +.slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, +.slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, +.slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { + opacity: 0.4; +} + +.slide-menu-wrapper .slide-menu-item.active i.fas.active, +.slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, +.slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, +.slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active { + opacity: 0.8; +} + +.slide-menu-wrapper .slide-menu--left { + left: 0; + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); +} + +.slide-menu-wrapper .slide-menu--left.active { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); +} + +.slide-menu-wrapper .slide-menu--right { + right: 0; + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); +} + +.slide-menu-wrapper .slide-menu--right.active { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); +} + +.slide-menu-wrapper { + transition: transform 0.3s; +} + + +/* + * Toolbar + */ +.slide-menu-wrapper .slide-menu-toolbar { + height: 60px; + width: 100%; + font-size: 12px; + display: table; + table-layout: fixed; /* ensures equal width */ + margin: 0; + padding: 0; + border-bottom: solid 2px #666; +} + +.slide-menu-wrapper .slide-menu-toolbar > li { + display: table-cell; + line-height: 150%; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #aaa; + border-radius: 3px; + padding-top: 16px; +} + +.slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button i, +.slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button svg.svg-inline--fa { + font-size: 1.7em; +} + +.slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button span.slide-menu-toolbar-label { + visibility: hidden; +} + +.slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button { + color: white; + text-shadow: 0 1px black; +} + +.slide-menu-toolbar > li.toolbar-panel-button:hover { + color: white; +} + +.slide-menu-toolbar > li.toolbar-panel-button:hover span.slide-menu-toolbar-label, +.slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button span.slide-menu-toolbar-label { + visibility: visible; +} + +/* + * Panels + */ +.slide-menu-wrapper .slide-menu-panel { + position: absolute; + width: 100%; + visibility: hidden; + height: calc(100% - 60px); + overflow-x: hidden; + overflow-y: auto; + color: #AAA; +} + +.slide-menu-wrapper .slide-menu-panel.active-menu-panel { + visibility: visible; +} + +.slide-menu-wrapper .slide-menu-panel h1, +.slide-menu-wrapper .slide-menu-panel h2, +.slide-menu-wrapper .slide-menu-panel h3, +.slide-menu-wrapper .slide-menu-panel h4, +.slide-menu-wrapper .slide-menu-panel h5, +.slide-menu-wrapper .slide-menu-panel h6 { + margin: 20px 0 10px 0; + color: #FFF; + line-height: 1.2; + letter-spacing: normal; + text-shadow: none; +} + +.slide-menu-wrapper .slide-menu-panel h1 { + font-size: 1.6em; +} +.slide-menu-wrapper .slide-menu-panel h2 { + font-size: 1.4em; +} +.slide-menu-wrapper .slide-menu-panel h3 { + font-size: 1.3em; +} +.slide-menu-wrapper .slide-menu-panel h4 { + font-size: 1.1em; +} +.slide-menu-wrapper .slide-menu-panel h5 { + font-size: 1em; +} +.slide-menu-wrapper .slide-menu-panel h6 { + font-size: 0.9em; +} + +.slide-menu-wrapper .slide-menu-panel p { + margin: 10px 0 5px 0; +} + +.slide-menu-wrapper .slide-menu-panel a { + color: #CCC; + text-decoration: underline; +} + +.slide-menu-wrapper .slide-menu-panel a:hover { + color: white; +} + +.slide-menu-wrapper .slide-menu-item a { + text-decoration: none; +} + +.slide-menu-wrapper .slide-menu-custom-panel { + width: calc(100% - 20px); + padding-left: 10px; + padding-right: 10px; +} + +.slide-menu-wrapper .slide-menu-custom-panel .slide-menu-items { + width: calc(100% + 20px); + margin-left: -10px; + margin-right: 10px; +} + + +/* + * Theme and Transitions buttons + */ + +.slide-menu-wrapper div[data-panel="Themes"] li, +.slide-menu-wrapper div[data-panel="Transitions"] li { + display: block; + text-align: left; + cursor: pointer; + color: #848484; +} + +/* + * Menu controls + */ +.reveal .slide-menu-button { + position: fixed; + left: 30px; + bottom: 30px; + z-index: 30; + font-size: 24px; +} + +/* + * Menu overlay + */ + +.slide-menu-wrapper .slide-menu-overlay { + position: fixed; + z-index: 199; + top: 0; + left: 0; + overflow: hidden; + width: 0; + height: 0; + background-color: #000; + opacity: 0; + transition: opacity 0.3s, width 0s 0.3s, height 0s 0.3s; +} + +.slide-menu-wrapper .slide-menu-overlay.active { + width: 100%; + height: 100%; + opacity: 0.7; + transition: opacity 0.3s; +} + +/* + * Hide menu for pdf printing + */ +body.print-pdf .slide-menu-wrapper .slide-menu, +body.print-pdf .reveal .slide-menu-button, +body.print-pdf .slide-menu-wrapper .slide-menu-overlay +{ + display: none; +} \ No newline at end of file diff --git a/yknjs/reveal.js-menu/menu.js b/yknjs/reveal.js-menu/menu.js new file mode 100644 index 0000000..5918ad3 --- /dev/null +++ b/yknjs/reveal.js-menu/menu.js @@ -0,0 +1,955 @@ +/* + * Reveal.js menu plugin + * MIT licensed + * (c) Greg Denehy 2015 + */ + +var RevealMenu = window.RevealMenu || (function(){ + var config = Reveal.getConfig(); + var options = config.menu || {}; + options.path = options.path || scriptPath() || 'plugin/menu/'; + if (!options.path.endsWith('/')) { + options.path += '/'; + } + var loadIcons = options.loadIcons; + if (typeof loadIcons === "undefined") loadIcons = true; + var initialised = false; + + var module = {}; + + loadResource(options.path + 'menu.css', 'stylesheet', function() { + if (loadIcons) { + loadResource(options.path + 'font-awesome/css/all.css', 'stylesheet', loadPlugin) + } else { + loadPlugin(); + } + }) + + function loadPlugin() { + // does not support IE8 or below + var initialise = !ieVersion || ieVersion >= 9; + + // do not load the menu in the upcoming slide panel in the speaker notes + if (Reveal.isSpeakerNotes() && window.location.search.endsWith('controls=false')) { + initialise = false; + } + + if (initialise) { + // + // Set option defaults + // + var side = options.side || 'left'; // 'left' or 'right' + var width = options.width; + var numbers = options.numbers || false; + var titleSelector = 'h1, h2, h3, h4, h5'; + if (typeof options.titleSelector === 'string') titleSelector = options.titleSelector; + var hideMissingTitles = options.hideMissingTitles || false; + var useTextContentForMissingTitles = options.useTextContentForMissingTitles || false; + var markers = options.markers; + if (typeof markers === "undefined") markers = true; + var custom = options.custom; + var themesPath = typeof options.themesPath === 'string' ? options.themesPath : 'css/theme/'; + if (!themesPath.endsWith('/')) themesPath += '/'; + var themes = select('link#theme') ? options.themes : false; + if (themes === true) { + themes = [ + { name: 'Black', theme: themesPath + 'black.css' }, + { name: 'White', theme: themesPath + 'white.css' }, + { name: 'League', theme: themesPath + 'league.css' }, + { name: 'Sky', theme: themesPath + 'sky.css' }, + { name: 'Beige', theme: themesPath + 'beige.css' }, + { name: 'Simple', theme: themesPath + 'simple.css' }, + { name: 'Serif', theme: themesPath + 'serif.css' }, + { name: 'Blood', theme: themesPath + 'blood.css' }, + { name: 'Night', theme: themesPath + 'night.css' }, + { name: 'Moon', theme: themesPath + 'moon.css' }, + { name: 'Solarized', theme: themesPath + 'solarized.css' } + ]; + } else if (!Array.isArray(themes)) { + themes = false; + } + var transitions = options.transitions || false; + if (transitions === true) { + transitions = ['None', 'Fade', 'Slide', 'Convex', 'Concave', 'Zoom']; + } else if (transitions !== false && (!Array.isArray(transitions) || !transitions.every(function(e) { return typeof e === "string" }))) { + console.error("reveal.js-menu error: transitions config value must be 'true' or an array of strings, eg ['None', 'Fade', 'Slide')"); + transitions = false; + } + if (ieVersion && ieVersion <= 9) { + // transitions aren't support in IE9 anyway, so no point in showing them + transitions = false; + } + var openButton = options.openButton; + if (typeof openButton === "undefined") openButton = true; + var openSlideNumber = options.openSlideNumber; + if (typeof openSlideNumber === "undefined") openSlideNumber = false; + var keyboard = options.keyboard; + if (typeof keyboard === "undefined") keyboard = true; + var sticky = options.sticky; + if (typeof sticky === "undefined") sticky = false; + var autoOpen = options.autoOpen; + if (typeof autoOpen === "undefined") autoOpen = true; + var delayInit = options.delayInit; + if (typeof delayInit === "undefined") delayInit = false; + var openOnInit = options.openOnInit || false; + + var mouseSelectionEnabled = true; + function disableMouseSelection() { + mouseSelectionEnabled = false; + } + + function reenableMouseSelection() { + // wait until the mouse has moved before re-enabling mouse selection + // to avoid selections on scroll + select('nav.slide-menu').addEventListener('mousemove', function fn(e) { + select('nav.slide-menu').removeEventListener('mousemove', fn); + //XXX this should select the item under the mouse + mouseSelectionEnabled = true; + }); + } + + // + // Keyboard handling + // + function getOffset(el) { + var _x = 0; + var _y = 0; + while(el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) { + _x += el.offsetLeft - el.scrollLeft; + _y += el.offsetTop - el.scrollTop; + el = el.offsetParent; + } + return { top: _y, left: _x }; + } + + function visibleOffset(el) { + var offsetFromTop = getOffset(el).top - el.offsetParent.offsetTop; + if (offsetFromTop < 0) return -offsetFromTop + var offsetFromBottom = el.offsetParent.offsetHeight - (el.offsetTop - el.offsetParent.scrollTop + el.offsetHeight); + if (offsetFromBottom < 0) return offsetFromBottom; + return 0; + } + + function keepVisible(el) { + var offset = visibleOffset(el); + if (offset) { + disableMouseSelection(); + el.scrollIntoView(offset > 0); + reenableMouseSelection(); + } + } + + function scrollItemToTop(el) { + disableMouseSelection(); + el.offsetParent.scrollTop = el.offsetTop; + reenableMouseSelection(); + } + + function scrollItemToBottom(el) { + disableMouseSelection(); + el.offsetParent.scrollTop = el.offsetTop - el.offsetParent.offsetHeight + el.offsetHeight + reenableMouseSelection(); + } + + function selectItem(el) { + el.classList.add('selected'); + keepVisible(el); + if (sticky && autoOpen) openItem(el); + } + + function onDocumentKeyDown(event) { + // opening menu is handled by registering key binding with Reveal below + if (isOpen()) { + event.stopImmediatePropagation(); + switch( event.keyCode ) { + // case 77: + // closeMenu(); + // break; + // h, left - change panel + case 72: case 37: + prevPanel(); + break; + // l, right - change panel + case 76: case 39: + nextPanel(); + break; + // k, up + case 75: case 38: + var currItem = select('.active-menu-panel .slide-menu-items li.selected') || select('.active-menu-panel .slide-menu-items li.active'); + if (currItem) { + selectAll('.active-menu-panel .slide-menu-items li').forEach(function(item) { item.classList.remove('selected') }); + var nextItem = select('.active-menu-panel .slide-menu-items li[data-item="' + (parseInt(currItem.getAttribute('data-item')) - 1) + '"]') || currItem; + selectItem(nextItem); + } else { + var item = select('.active-menu-panel .slide-menu-items li.slide-menu-item'); + if (item) selectItem(item); + } + break; + // j, down + case 74: case 40: + var currItem = select('.active-menu-panel .slide-menu-items li.selected') || select('.active-menu-panel .slide-menu-items li.active'); + if (currItem) { + selectAll('.active-menu-panel .slide-menu-items li').forEach(function(item) { item.classList.remove('selected') }); + var nextItem = select('.active-menu-panel .slide-menu-items li[data-item="' + (parseInt(currItem.getAttribute('data-item')) + 1) + '"]') || currItem; + selectItem(nextItem); + } else { + var item = select('.active-menu-panel .slide-menu-items li.slide-menu-item'); + if (item) selectItem(item); + } + break; + // pageup, u + case 33: case 85: + var itemsAbove = selectAll('.active-menu-panel .slide-menu-items li').filter(function(item) { return visibleOffset(item) > 0; }); + var visibleItems = selectAll('.active-menu-panel .slide-menu-items li').filter(function(item) { return visibleOffset(item) == 0; }); + + var firstVisible = (itemsAbove.length > 0 && Math.abs(visibleOffset(itemsAbove[itemsAbove.length-1])) < itemsAbove[itemsAbove.length-1].clientHeight ? itemsAbove[itemsAbove.length-1] : visibleItems[0]); + if (firstVisible) { + if (firstVisible.classList.contains('selected') && itemsAbove.length > 0) { + // at top of viewport already, page scroll (if not at start) + // ...move selected item to bottom, and change selection to last fully visible item at top + scrollItemToBottom(firstVisible); + visibleItems = selectAll('.active-menu-panel .slide-menu-items li').filter(function(item) { return visibleOffset(item) == 0; }); + if (visibleItems[0] == firstVisible) { + // prev item is still beyond the viewport (for custom panels) + firstVisible = itemsAbove[itemsAbove.length-1]; + } else { + firstVisible = visibleItems[0]; + } + } + selectAll('.active-menu-panel .slide-menu-items li').forEach(function(item) { item.classList.remove('selected') }); + selectItem(firstVisible); + // ensure selected item is positioned at the top of the viewport + scrollItemToTop(firstVisible); + } + break; + // pagedown, d + case 34: case 68: + var visibleItems = selectAll('.active-menu-panel .slide-menu-items li').filter(function(item) { return visibleOffset(item) == 0; }); + var itemsBelow = selectAll('.active-menu-panel .slide-menu-items li').filter(function(item) { return visibleOffset(item) < 0; }); + + var lastVisible = (itemsBelow.length > 0 && Math.abs(visibleOffset(itemsBelow[0])) < itemsBelow[0].clientHeight ? itemsBelow[0] : visibleItems[visibleItems.length-1]); + if (lastVisible) { + if (lastVisible.classList.contains('selected') && itemsBelow.length > 0) { + // at bottom of viewport already, page scroll (if not at end) + // ...move selected item to top, and change selection to last fully visible item at bottom + scrollItemToTop(lastVisible); + visibleItems = selectAll('.active-menu-panel .slide-menu-items li').filter(function(item) { return visibleOffset(item) == 0; }); + if (visibleItems[visibleItems.length-1] == lastVisible) { + // next item is still beyond the viewport (for custom panels) + lastVisible = itemsBelow[0]; + } else { + lastVisible = visibleItems[visibleItems.length-1]; + } + } + selectAll('.active-menu-panel .slide-menu-items li').forEach(function(item) { item.classList.remove('selected') }); + selectItem(lastVisible); + // ensure selected item is positioned at the bottom of the viewport + scrollItemToBottom(lastVisible); + } + break; + // home + case 36: + selectAll('.active-menu-panel .slide-menu-items li').forEach(function(item) { item.classList.remove('selected') }); + var item = select('.active-menu-panel .slide-menu-items li:first-of-type'); + if (item) { + item.classList.add('selected'); + keepVisible(item); + } + break; + // end + case 35: + selectAll('.active-menu-panel .slide-menu-items li').forEach(function(item) { item.classList.remove('selected') }); + var item = select('.active-menu-panel .slide-menu-items:last-of-type li:last-of-type'); + if (item) { + item.classList.add('selected'); + keepVisible(item); + } + break; + // space, return + case 32: case 13: + var currItem = select('.active-menu-panel .slide-menu-items li.selected'); + if (currItem) { + openItem(currItem, true); + } + break; + // esc + case 27: closeMenu(null, true); break; + } + } + } + + if (keyboard) { + //XXX add keyboard option for custom key codes, etc. + + document.addEventListener('keydown', onDocumentKeyDown, false); + + // handle key presses within speaker notes + window.addEventListener( 'message', function( event ) { + var data; + try { + data = JSON.parse( event.data ); + } catch (e) { + } + if (data && data.method === 'triggerKey') { + onDocumentKeyDown( { keyCode: data.args[0], stopImmediatePropagation: function() {} } ); + } + }); + + // Prevent reveal from processing keyboard events when the menu is open + if (config.keyboardCondition && typeof config.keyboardCondition === 'function') { + // combine user defined keyboard condition with the menu's own condition + var userCondition = config.keyboardCondition; + config.keyboardCondition = function(event) { + return userCondition(event) && (!isOpen() || event.keyCode == 77); + }; + } else { + config.keyboardCondition = function(event) { + return !isOpen() || event.keyCode == 77; + } + } + } + + + // + // Utilty functions + // + + function openMenu(event) { + if (event) event.preventDefault(); + if (!isOpen()) { + select('body').classList.add('slide-menu-active'); + select('.reveal').classList.add('has-' + options.effect + '-' + side); + select('.slide-menu').classList.add('active'); + select('.slide-menu-overlay').classList.add('active'); + + // identify active theme + if (themes) { + selectAll('div[data-panel="Themes"] li').forEach(function(i) { i.classList.remove('active') }); + selectAll('li[data-theme="' + select('link#theme').getAttribute('href') + '"]').forEach(function(i) { i.classList.add('active') }); + } + + // identify active transition + if (transitions) { + selectAll('div[data-panel="Transitions"] li').forEach(function(i) { i.classList.remove('active') }); + selectAll('li[data-transition="' + Reveal.getConfig().transition + '"]').forEach(function(i) { i.classList.add('active') }); + } + + // set item selections to match active items + var items = selectAll('.slide-menu-panel li.active') + items.forEach(function(i) { + i.classList.add('selected'); + keepVisible(i); + }); + } + } + + function closeMenu(event, force) { + if (event) event.preventDefault(); + if (!sticky || force) { + select('body').classList.remove('slide-menu-active'); + select('.reveal').classList.remove('has-' + options.effect + '-' + side); + select('.slide-menu').classList.remove('active'); + select('.slide-menu-overlay').classList.remove('active'); + selectAll('.slide-menu-panel li.selected').forEach(function(i) { i.classList.remove('selected') }); + } + } + + function toggleMenu(event) { + if (isOpen()) { + closeMenu(event, true); + } else { + openMenu(event); + } + } + + function isOpen() { + return select('body').classList.contains('slide-menu-active'); + } + + function openPanel(event, ref) { + openMenu(event); + var panel = ref; + if (typeof ref !== "string") { + panel = event.currentTarget.getAttribute('data-panel'); + } + select('.slide-menu-toolbar > li.active-toolbar-button').classList.remove('active-toolbar-button'); + select('li[data-panel="' + panel + '"]').classList.add('active-toolbar-button'); + select('.slide-menu-panel.active-menu-panel').classList.remove('active-menu-panel'); + select('div[data-panel="' + panel + '"]').classList.add('active-menu-panel'); + } + + function nextPanel() { + var next = (parseInt(select('.active-toolbar-button').getAttribute('data-button')) + 1) % buttons; + openPanel(null, select('.toolbar-panel-button[data-button="' + next + '"]').getAttribute('data-panel')); + } + + function prevPanel() { + var next = parseInt(select('.active-toolbar-button').getAttribute('data-button')) - 1; + if (next < 0) { + next = buttons - 1; + } + openPanel(null, select('.toolbar-panel-button[data-button="' + next + '"]').getAttribute('data-panel')); + } + + function openItem(item, force) { + var h = parseInt(item.getAttribute('data-slide-h')); + var v = parseInt(item.getAttribute('data-slide-v')); + var theme = item.getAttribute('data-theme'); + var transition = item.getAttribute('data-transition'); + if (!isNaN(h) && !isNaN(v)) { + Reveal.slide(h, v); + closeMenu(); + } else if (theme) { + // take note of the previous theme and remove it, then create a new stylesheet reference and insert it + // this is required to force a load event so we can change the menu style to match the new style + var stylesheet = select('link#theme'); + var parent = stylesheet.parentElement; + var sibling = stylesheet.nextElementSibling; + stylesheet.remove(); + + var newStylesheet = stylesheet.cloneNode(); + newStylesheet.setAttribute('href', theme); + newStylesheet.onload = function() { matchRevealStyle() }; + parent.insertBefore(newStylesheet, sibling); + + closeMenu(); + } else if (transition) { + Reveal.configure({ transition: transition }); + closeMenu(); + } else { + var link = select('a', item); + if (link) { + if (force || !sticky || (autoOpen && link.href.startsWith('#') || link.href.startsWith(window.location.origin + window.location.pathname + '#'))) { + link.click(); + } + } + closeMenu(); + } + } + + function clicked(event) { + if (event.target.nodeName !== "A") { + event.preventDefault(); + } + openItem(event.currentTarget); + } + + function highlightCurrentSlide() { + var state = Reveal.getState(); + selectAll('li.slide-menu-item, li.slide-menu-item-vertical').forEach(function(item) { + item.classList.remove('past'); + item.classList.remove('active'); + item.classList.remove('future'); + + var h = parseInt(item.getAttribute('data-slide-h')); + var v = parseInt(item.getAttribute('data-slide-v')); + if (h < state.indexh || (h === state.indexh && v < state.indexv)) { + item.classList.add('past'); + } + else if (h === state.indexh && v === state.indexv) { + item.classList.add('active'); + } + else { + item.classList.add('future'); + } + }); + } + + function matchRevealStyle() { + var revealStyle = window.getComputedStyle(select('.reveal')); + var element = select('.slide-menu'); + element.style.fontFamily = revealStyle.fontFamily; + //XXX could adjust the complete menu style to match the theme, ie colors, etc + } + + var buttons = 0; + function init() { + if (!initialised) { + var parent = select('.reveal').parentElement; + var top = create('div', { 'class': 'slide-menu-wrapper'}); + parent.appendChild(top); + var panels = create('nav', { 'class': 'slide-menu slide-menu--' + side}); + if (typeof width === 'string') { + if (['normal', 'wide', 'third', 'half', 'full'].indexOf(width) != -1) { + panels.classList.add('slide-menu--' + width); + } + else { + panels.classList.add('slide-menu--custom'); + panels.style.width = width; + } + } + top.appendChild(panels); + matchRevealStyle(); + var overlay = create('div', { 'class': 'slide-menu-overlay'}); + top.appendChild(overlay); + overlay.onclick = function() { closeMenu(null, true) }; + + var toolbar = create('ol', {'class': 'slide-menu-toolbar'}); + select('.slide-menu').appendChild(toolbar); + + function addToolbarButton(title, ref, icon, style, fn, active) { + var attrs = { + 'data-button': '' + (buttons++), + 'class': 'toolbar-panel-button' + (active ? ' active-toolbar-button' : '') + }; + if (ref) { + attrs['data-panel'] = ref; + } + var button = create('li', attrs); + + if (icon.startsWith('fa-')) { + button.appendChild(create('i', {'class': style + ' ' + icon})); + } else { + button.innerHTML = icon + ''; + } + button.appendChild(create('br'), select('i', button)); + button.appendChild(create('span', {'class': 'slide-menu-toolbar-label'}, title), select('i', button)); + button.onclick = fn; + toolbar.appendChild(button); + return button; + } + + addToolbarButton('Slides', 'Slides', 'fa-images', 'fas', openPanel, true); + + if (custom) { + custom.forEach(function(element, index, array) { + addToolbarButton(element.title, 'Custom' + index, element.icon, null, openPanel); + }); + } + + if (themes) { + addToolbarButton('Themes', 'Themes', 'fa-adjust', 'fas', openPanel); + } + if (transitions) { + addToolbarButton('Transitions', 'Transitions', 'fa-sticky-note', 'fas', openPanel); + } + button = create('li', {id: 'close', 'class': 'toolbar-panel-button'}); + button.appendChild(create('i', {'class': 'fas fa-times'})); + button.appendChild(create('br')); + button.appendChild(create('span', {'class': 'slide-menu-toolbar-label'}, 'Close')); + button.onclick = function() { closeMenu(null, true) }; + toolbar.appendChild(button); + + // + // Slide links + // + function generateItem(type, section, i, h, v) { + var link = '/#/' + h; + if (typeof v === 'number' && !isNaN( v )) link += '/' + v; + + function text(selector, parent) { + var el = (parent ? select(selector, section) : select(selector)); + if (el) return el.textContent; + return null; + } + var title = section.getAttribute('data-menu-title') || + text('.menu-title', section) || + text(titleSelector, section); + + if (!title && useTextContentForMissingTitles) { + // attempt to figure out a title based on the text in the slide + title = section.textContent.trim(); + if (title) { + title = title.split('\n') + .map(function(t) { return t.trim() }).join(' ').trim() + .replace(/^(.{16}[^\s]*).*/, "$1") // limit to 16 chars plus any consecutive non-whitespace chars (to avoid breaking words) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'") + '...'; + } + } + + if (!title) { + if (hideMissingTitles) return ''; + type += ' no-title'; + title = "Slide " + i; + } + + var item = create('li', { + class: type, + 'data-item': i, + 'data-slide-h': h, + 'data-slide-v': (v === undefined ? 0 : v) + }); + + if (markers) { + item.appendChild(create('i', {class: 'fas fa-check-circle fa-fw past'})); + item.appendChild(create('i', {class: 'fas fa-arrow-alt-circle-right fa-fw active'})); + item.appendChild(create('i', {class: 'far fa-circle fa-fw future'})); + } + + if (numbers) { + // Number formatting taken from reveal.js + var value = []; + var format = 'h.v'; + + // Check if a custom number format is available + if( typeof numbers === 'string' ) { + format = numbers; + } + else if (typeof config.slideNumber === 'string') { + // Take user defined number format for slides + format = config.slideNumber; + } + + switch( format ) { + case 'c': + value.push( i ); + break; + case 'c/t': + value.push( i, '/', Reveal.getTotalSlides() ); + break; + case 'h/v': + value.push( h + 1 ); + if( typeof v === 'number' && !isNaN( v ) ) value.push( '/', v + 1 ); + break; + default: + value.push( h + 1 ); + if( typeof v === 'number' && !isNaN( v ) ) value.push( '.', v + 1 ); + } + + item.appendChild(create('span', {class: 'slide-menu-item-number'}, value.join('') + '. ')); + } + + item.appendChild(create('span', {class: 'slide-menu-item-title'}, title)); + + return item; + } + + function createSlideMenu() { + if ( !document.querySelector('section[data-markdown]:not([data-markdown-parsed])') ) { + var panel = create('div', { + 'data-panel': 'Slides', + 'class': 'slide-menu-panel active-menu-panel' + }); + panel.appendChild(create('ul', {class: "slide-menu-items"})); + panels.appendChild(panel); + var items = select('.slide-menu-panel[data-panel="Slides"] > .slide-menu-items'); + var slideCount = 0; + selectAll('.slides > section').forEach(function(section, h) { + var subsections = selectAll('section', section); + if (subsections.length > 0) { + subsections.forEach(function(subsection, v) { + var type = (v === 0 ? 'slide-menu-item' : 'slide-menu-item-vertical'); + var item = generateItem(type, subsection, slideCount, h, v); + if (item) { + slideCount++; + items.appendChild(item); + } + }); + } else { + var item = generateItem('slide-menu-item', section, slideCount, h); + if (item) { + slideCount++; + items.appendChild(item); + } + } + }); + selectAll('.slide-menu-item, .slide-menu-item-vertical').forEach(function(i) { + i.onclick = clicked; + }); + highlightCurrentSlide(); + } + else { + // wait for markdown to be loaded and parsed + setTimeout( createSlideMenu, 100 ); + } + } + + createSlideMenu(); + Reveal.addEventListener('slidechanged', highlightCurrentSlide); + + // + // Custom menu panels + // + if (custom) { + function xhrSuccess () { + if (this.status >= 200 && this.status < 300) { + this.panel.innerHTML = this.responseText; + enableCustomLinks(this.panel); + } + else { + showErrorMsg(this) + } + } + function xhrError () { + showErrorMsg(this) + } + function loadCustomPanelContent (panel, sURL) { + var oReq = new XMLHttpRequest(); + oReq.panel = panel; + oReq.arguments = Array.prototype.slice.call(arguments, 2); + oReq.onload = xhrSuccess; + oReq.onerror = xhrError; + oReq.open("get", sURL, true); + oReq.send(null); + } + function enableCustomLinks(panel) { + selectAll('ul.slide-menu-items li.slide-menu-item', panel).forEach(function(item, i) { + item.setAttribute('data-item', i+1); + item.onclick = clicked; + item.addEventListener("mouseenter", handleMouseHighlight); + }); + } + + function showErrorMsg(response) { + var msg = '

    ERROR: The attempt to fetch ' + response.responseURL + ' failed with HTTP status ' + + response.status + ' (' + response.statusText + ').

    ' + + '

    Remember that you need to serve the presentation HTML from a HTTP server.

    '; + response.panel.innerHTML = msg; + } + + custom.forEach(function(element, index, array) { + var panel = create('div', { + 'data-panel': 'Custom' + index, + class: 'slide-menu-panel slide-menu-custom-panel' + }); + if (element.content) { + panel.innerHTML = element.content; + enableCustomLinks(panel); + } + else if (element.src) { + loadCustomPanelContent(panel, element.src); + } + panels.appendChild(panel); + }) + } + + // + // Themes + // + if (themes) { + var panel = create('div', { + class: 'slide-menu-panel', + 'data-panel': 'Themes' + }); + panels.appendChild(panel); + var menu = create('ul', {class: 'slide-menu-items'}); + panel.appendChild(menu); + themes.forEach(function(t, i) { + var item = create('li', { + class: 'slide-menu-item', + 'data-theme': t.theme, + 'data-item': ''+(i+1) + }, t.name); + menu.appendChild(item); + item.onclick = clicked; + }) + } + + // + // Transitions + // + if (transitions) { + var panel = create('div', { + class: 'slide-menu-panel', + 'data-panel': 'Transitions' + }); + panels.appendChild(panel); + var menu = create('ul', {class: 'slide-menu-items'}); + panel.appendChild(menu); + transitions.forEach(function(name, i) { + var item = create('li', { + class: 'slide-menu-item', + 'data-transition': name.toLowerCase(), + 'data-item': ''+(i+1) + }, name); + menu.appendChild(item); + item.onclick = clicked; + }) + } + + // + // Open menu options + // + if (openButton) { + // add menu button + var div = create('div', {class: 'slide-menu-button'}); + var link = create('a', {href: '#'}); + link.appendChild(create('i', {class: 'fas fa-bars'})); + div.appendChild(link); + select('.reveal').appendChild(div); + div.onclick = openMenu; + } + + if (openSlideNumber) { + // wrap slide number in link + var slideNumber = select('div.slide-number'); + var wrapper = create('div', {class: 'slide-number-wrapper'}); + var link = create('a', {href: '#'}); + wrapper.appendChild(link); + slideNumber.parentElement.insertBefore(wrapper, slideNumber); + link.appendChild(slideNumber); + link.onclick = openMenu; + } + + // + // Handle mouse overs + // + selectAll('.slide-menu-panel .slide-menu-items li').forEach(function(item) { + item.addEventListener("mouseenter", handleMouseHighlight); + }); + + function handleMouseHighlight(event) { + if (mouseSelectionEnabled) { + selectAll('.active-menu-panel .slide-menu-items li.selected').forEach(function(i) { + i.classList.remove('selected'); + }); + event.currentTarget.classList.add('selected'); + } + } + } + if (openOnInit) { + openMenu(); + } + initialised = true; + } + + module.toggle = toggleMenu; + module.openMenu = openMenu; + module.closeMenu = closeMenu; + module.openPanel = openPanel; + module.isOpen = isOpen; + module.init = init; + module.isInit = function() { return initialised }; + + if (!delayInit) { + init(); + } + + /** + * Extend object a with the properties of object b. + * If there's a conflict, object b takes precedence. + */ + function extend( a, b ) { + for( var i in b ) { + a[ i ] = b[ i ]; + } + } + + /** + * Dispatches an event of the specified type from the + * reveal DOM element. + */ + function dispatchEvent( type, args ) { + var event = document.createEvent( 'HTMLEvents', 1, 2 ); + event.initEvent( type, true, true ); + extend( event, args ); + document.querySelector('.reveal').dispatchEvent( event ); + + // If we're in an iframe, post each reveal.js event to the + // parent window. Used by the notes plugin + if( config.postMessageEvents && window.parent !== window.self ) { + window.parent.postMessage( JSON.stringify({ namespace: 'reveal', eventName: type, state: Reveal.getState() }), '*' ); + } + } + + Reveal.addKeyBinding({keyCode: 77, key: 'M', description: 'Toggle menu'}, toggleMenu); + + dispatchEvent('menu-ready'); + } + } + + function select(selector, el) { + if (!el) { + el = document; + } + return el.querySelector(selector); + } + + function selectAll(selector, el) { + if (!el) { + el = document; + } + return Array.prototype.slice.call(el.querySelectorAll(selector)); + } + + function create(tagName, attrs, content) { + var el = document.createElement(tagName); + if (attrs) { + Object.getOwnPropertyNames(attrs).forEach(function(n) { + el.setAttribute(n, attrs[n]); + }); + } + if (content) el.innerHTML = content; + return el; + } + + // modified from math plugin + function loadResource( url, type, callback ) { + var head = document.querySelector( 'head' ); + var resource; + + if ( type === 'script' ) { + resource = document.createElement( 'script' ); + resource.type = 'text/javascript'; + resource.src = url; + } + else if ( type === 'stylesheet' ) { + resource = document.createElement( 'link' ); + resource.rel = 'stylesheet'; + resource.href = url; + } + + // Wrapper for callback to make sure it only fires once + var finish = function() { + if( typeof callback === 'function' ) { + callback.call(); + callback = null; + } + } + + resource.onload = finish; + + // IE + resource.onreadystatechange = function() { + if ( this.readyState === 'loaded' ) { + finish(); + } + } + + // Normal browsers + head.appendChild( resource ); + } + + function scriptPath() { + // obtain plugin path from the script element + var path; + if (document.currentScript) { + path = document.currentScript.src.slice(0, -7); + } else { + var sel = document.querySelector('script[src$="menu.js"]'); + if (sel) { + path = sel.src.slice(0, -7); + } + } + return path; + } + + // polyfill + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(searchString, position){ + return this.substr(position || 0, searchString.length) === searchString; + }; + } + if (!String.prototype.endsWith) { + String.prototype.endsWith = function(search, this_len) { + if (this_len === undefined || this_len > this.length) { + this_len = this.length; + } + return this.substring(this_len - search.length, this_len) === search; + }; + } + + var ieVersion = function() { + var browser = /(msie) ([\w.]+)/.exec(window.navigator.userAgent.toLowerCase()); + if (browser && browser[1] === "msie") { + return parseFloat(browser[2]); + } + return null; + }(); + + return module; +})(); diff --git a/yknjs/reveal.js-menu/package.json b/yknjs/reveal.js-menu/package.json new file mode 100644 index 0000000..533d1e5 --- /dev/null +++ b/yknjs/reveal.js-menu/package.json @@ -0,0 +1,22 @@ +{ + "name": "reveal.js-menu", + "version": "1.2.0", + "description": "A slideout menu for navigating reveal.js presentations", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/denehyg/reveal.js-menu.git" + }, + "keywords": [ + "reveal", + "menu" + ], + "author": "Greg Denehy", + "license": "MIT, Copyright (C) 2016 Greg Denehy", + "bugs": { + "url": "https://github.com/denehyg/reveal.js-menu/issues" + }, + "homepage": "https://github.com/denehyg/reveal.js-menu#readme" +} diff --git a/yknjs/reveal.js-plugins/.gitmodules b/yknjs/reveal.js-plugins/.gitmodules new file mode 100644 index 0000000..13def6d --- /dev/null +++ b/yknjs/reveal.js-plugins/.gitmodules @@ -0,0 +1,3 @@ +[submodule "reveal.js-menu"] + path = menu + url = https://github.com/denehyg/reveal.js-menu.git diff --git a/yknjs/reveal.js-plugins/LICENSE b/yknjs/reveal.js-plugins/LICENSE new file mode 100644 index 0000000..48d91b2 --- /dev/null +++ b/yknjs/reveal.js-plugins/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2020 Asvin Goel + +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/yknjs/reveal.js-plugins/README.md b/yknjs/reveal.js-plugins/README.md new file mode 100644 index 0000000..2900d45 --- /dev/null +++ b/yknjs/reveal.js-plugins/README.md @@ -0,0 +1,44 @@ +```diff +- Important notes: This repository is is for reveal.s v4.0.2. For older versions of reveal.js, please use branch 'v3'. +``` + +# reveal.js-plugins + +This is a collection of plugins for [Reveal.js](https://github.com/hakimel/reveal.js) - a framework for easily creating beautiful presentations using HTML. Example presentations and demos for these plugins can be found and added [here](https://github.com/rajgoel/reveal.js-plugins/wiki/Example-presentations). + +This collections includes the following plugins: + +- [Anything](https://github.com/rajgoel/reveal.js-plugins/tree/master/anything) ([Demo](https://rajgoel.github.io/reveal.js-demos/anything-demo.html)): A plugin for adding plots, charts, animated SVGs,or anything else inside an HTML object using a JSON string and a javascript function. +- [Audio slideshow](https://github.com/rajgoel/reveal.js-plugins/tree/master/audio-slideshow) ([Demo](https://rajgoel.github.io/reveal.js-demos/audio-slideshow-demo.html)): A plugin for audio playback and recording. +- [Chalkboard](https://github.com/rajgoel/reveal.js-plugins/tree/master/chalkboard) ([Demo](https://rajgoel.github.io/reveal.js-demos/chalkboard-demo.html)): + A plugin adding a chalkboard and slide annotation. +- [Chart](https://github.com/rajgoel/reveal.js-plugins/tree/master/chart) ([Demo](https://rajgoel.github.io/reveal.js-demos/chart-demo.html)): + A plugin for using Chart.js. +- [Custom controls](https://github.com/rajgoel/reveal.js-plugins/tree/master/customcontrols) ([Demo](https://rajgoel.github.io/reveal.js-demos/customcontrols-demo.html)): + A plugin for customization of controls. +- [Embed tweet](https://github.com/rajgoel/reveal.js-plugins/tree/master/embed-tweet) ([Demo](https://rajgoel.github.io/reveal.js-demos/embed-tweet-demo.html)): + A plugin allowing to easily embed tweets in your slides. +- [Fullscreen](https://github.com/rajgoel/reveal.js-plugins/tree/master/fullscreen) ([Demo](https://rajgoel.github.io/reveal.js-demos/fullscreen-demo.html)): + A simple plugin allowing to use fullscreen slides. +- [Menu](https://github.com/denehyg/reveal.js-menu) ([Demo](https://denehyg.github.io/reveal.js-menu)): A plugin by Greg Denehy for adding a slideout menu. + +## Getting started + +The source code of the demos can be found here: https://github.com/rajgoel/reveal.js-demos. + +## Download + +You can download the plugins into the ```bower_components``` folder using + +```bower install reveal.js-plugins``` + +or manually copy this repository next to the folder of your reveal.js presentation. + +Please note that the [menu](https://github.com/denehyg/reveal.js-menu)-plugin is a submodule and has to be downloaded separately. + +## License + +MIT licensed + +Copyright (C) 2020 Asvin Goel + diff --git a/yknjs/reveal.js-plugins/animate/README.md b/yknjs/reveal.js-plugins/animate/README.md new file mode 100644 index 0000000..e01813e --- /dev/null +++ b/yknjs/reveal.js-plugins/animate/README.md @@ -0,0 +1,228 @@ +# Animate + +A plugin for [Reveal.js](https://github.com/hakimel/reveal.js) allowing to add animations using [SVG.js](https://svgjs.com). + +[Check out the live demo](https://rajgoel.github.io/reveal.js-demos/animate-demo.html) + +## Installation + +Copy the files ```plugin.js``` and ```svg.min.js``` into the plugin folder of your reveal.js presentation, i.e. ```plugin/animate``` and load the plugin as shown below. + +```html + + + + +``` + +## Usage + +An animation can be included in a slide by adding an element with the ```data-animate``` attribute. Furthermore, the filename of an SVG to be loaded can be provided by an attribute `data-src="drawing.svg"`. Alternatively, an `svg` element can be manually placed within the element. The animation is provided by a comment with a JSON-string as follows: + +```html +
    + +
    +``` + +The `setup` object is used to manipulate the SVG after loading. The `animation` object is used to create an SVG animation. Both objects are optional and specified by an array including individual changes to the SVG. Each item in the array has the following properties: + +- `element` (optional): The selector for any element(s) within the SVG on which the `modifier` is executed with the given `parameters`. If multiple elements match the selector, the modifier is executed in a sequential fashion to all elements matched. If no `element` is provided, the `modifier` is executed on the SVG element. +- `modifier`: Any function that can be used to [manipulate SVG elements](https://svgjs.com/docs/3.0/manipulating/). Within the `setup` object, the modifier can be any user defined function manipulating the selected elements. Within the `animation` object, no user defined functions are allowed. +- `parameters`: An array of parameters for the chosen `modifier`. + +For animation items the parameters `duration`, `delay`, and `when` for the [`animate()`](https://svgjs.com/docs/3.0/animating/#animate) function may be provided. If they are not provided the defaults are taken according to the documentation of SVG.js. + +If a slide has fragments, the `animation` object can be provided as an array of an array. The first item of the array is an array of animations applied to the main slide, the following items are arrays of animations applied to the fragments. + +The animate plugin is designed to work with the [`audio-slideshow` plugin](https://github.com/rajgoel/reveal.js-plugins/tree/master/audio-slideshow) such that the timeline of the audio is synched with the timeline of the animation and that the animation is controlled with the audio controls. Alternatively, the animations can be controlled via the functions `play()`, `pause()`, and `seek(timstamp)`. + +## Examples + +The [demo](https://rajgoel.github.io/reveal.js-demos/animate-demo.html) includes various animations showcasing different ways of using the plugin. Please have a look at the the [source code](https://github.com/rajgoel/reveal.js-demos/blob/master/animate-demo.html). + +### Example: Heartbeat + +The following example loads a heart and creates a heartbeat animation. +```html +
    + +
    +``` + +### Example: Adding SVG elements + +The following example loads a SVG file and adds additional SVG elements to it upon loading. When advancing through the fragments, these elements are shown. + +```html + + + + + +
    + +
    +``` + +### Example: Sequential animations + +The following example loads an SVG file, clones elements of the SVG, and manipulates them. Then, the cloned elements are displayed sequentially. + +```html +
    + +
    +``` + +## License + +MIT licensed + +Copyright (C) 2020 Asvin Goel diff --git a/yknjs/reveal.js-plugins/animate/plugin.js b/yknjs/reveal.js-plugins/animate/plugin.js new file mode 100644 index 0000000..af6755a --- /dev/null +++ b/yknjs/reveal.js-plugins/animate/plugin.js @@ -0,0 +1,446 @@ +/***************************************************************** +** Author: Asvin Goel, goel@telematique.eu +** +** A plugin for animating slide content. +** +** Version: 0.1.0 +** +** License: MIT license (see LICENSE.md) +** +******************************************************************/ + +window.RevealAnimate = window.RevealAnimate || { + id: 'RevealAnimate', + init: function(deck) { + initAnimate(deck); + }, + play: function() { play(); }, + pause: function() { pause(); }, + seek: function(timestamp) { seek(timestamp); }, +}; + +const initAnimate = function(Reveal){ + var playback = false; + var isRecording = false; + var timer = null; + var initialized = 0; + + function parseJSON(str) { + str = str.replace(/(\r\n|\n|\r|\t)/gm,""); // remove line breaks and tabs + var json; + try { + json = JSON.parse(str, function (key, value) { + if (value && (typeof value === 'string') && value.indexOf("function") === 0) { + // we can only pass a function as string in JSON ==> doing a real function +// eval("var jsFunc = " + value); + var jsFunc = new Function('return ' + value)(); + return jsFunc; + } + return value; + }); + } catch (e) { + return null; + } + return json; + } + + function load( element, config, filename, callback ) { + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + if (xhr.readyState === 4) { + callback( element, config, xhr.responseText ); + } + else { + callback( "Failed to get file. ReadyState: " + xhr.readyState + ", Status: " + xhr.status ); + } + }; + xhr.open( 'GET', filename, true ); + xhr.send(); + } + + function parseComments( element ) { + var config = {}; + var comments = element.innerHTML.trim().match(//g); +//console.log(comments) + if ( comments !== null ) for (var k = 0; k < comments.length; k++ ){ + comments[k] = comments[k].replace(//,''); + var config = parseJSON(comments[k]); +//console.warn(comments[k], config); + + if ( config ) { + if ( config.animation && Array.isArray(config.animation) && config.animation.length && !Array.isArray(config.animation[0]) ) { + // without fragments the animation can be specified as a single array (animation steps) + config.animation = [ config.animation ]; + } + break; + } + } + +//console.warn(element, config); + return config; + } + + function getAnimatedSVG( container ) { + var elements = SVG.find('svg'); + var svg = elements.toArray().find(element => element.node.parentElement == container); +//console.warn("FOUND",svg.node); + return svg; + } + +/***************************************************************** +** Set up animations +******************************************************************/ + function setupAnimations( container, config ) { +//console.warn("setupAnimations"); + if ( !config ) return; + + container.svg = getAnimatedSVG( container ); + + // pre-animation setup + var setup = config.setup; + if ( setup ) { + for (var i = 0; i < setup.length; i++ ){ + try { + if ( setup[i].element ) { +//console.log(setup[i].element,setup[i].modifier,setup[i].parameters); + var elements = container.svg.find(setup[i].element); + if ( !elements.length ) { +console.warn("Cannot find element to set up with selector: " + setup[i].element + "!"); + } + +//console.warn(elements); +//console.log("element(" + setup[i].element + ")." + setup[i].modifier + "(" + setup[i].parameters + ")"); +//console.log("element(" + setup[i].element + ")." + setup[i].modifier + "(" + setup[i].parameters + ")"); + for (var j = 0; j < elements.length; j++ ){ + if ( typeof setup[i].modifier === "function" ) { + // if modifier is function execute it + setup[i].modifier.apply(elements[j],setup[i].parameters); + } + else { + // apply modifier to element + elements[j][setup[i].modifier].apply(elements[j],setup[i].parameters); + } + } + + } + else { + // no element is provided + if ( typeof setup[i].modifier === "function" ) { + // if modifier is function execute it + setup[i].modifier.apply(container.svg,setup[i].parameters); + } + else { + // apply modifier to root + container.svg[setup[i].modifier].apply(container.svg,setup[i].parameters); + } + } + } + catch( error ) { + console.error("Error '" + error + "' setting up element " + JSON.stringify(setup[i])); + } + } +//console.warn(container.svg.node.getAttribute("style")); + } + + container.animation = new SVG.Timeline().persist(true); + container.animationSchedule = []; // completion time of each fragment animation + + // setup animation + var animations = config.animation; + if ( animations ) { + + container.animationSchedule.length = animations.length; + var timestamp = 0; + for (var fragment = 0; fragment < animations.length; fragment++ ){ + container.animationSchedule[fragment] = {}; + container.animationSchedule[fragment].begin = timestamp; + for (var i = 0; i < animations[fragment].length; i++ ){ + try { + // add each animation step + var elements = container.svg.find(animations[fragment][i].element); +//console.log("element(" + animations[fragment][i].element + ")." + animations[fragment][i].modifier + "(" + animations[fragment][i].parameters + ")"); + if ( !elements.length ) { + console.warn("Cannot find element to animate with selector: " + animations[fragment][i].element + "!"); + } + for (var j = 0; j < elements.length; j++ ){ + elements[j].timeline( container.animation ); + var anim = elements[j].animate(animations[fragment][i].duration,animations[fragment][i].delay,animations[fragment][i].when) + anim[animations[fragment][i].modifier].apply(anim,animations[fragment][i].parameters); + } + +//console.log("Duration:", anim.duration()); + timestamp = anim.duration(); + } + catch( error ) { + console.error("Error '" + error + "' setting up animation " + JSON.stringify(animations[fragment][i])); + } + } + // set animationSchedule for each fragment animation + var schedule = container.animation.schedule(); + if ( schedule.length ) { + timestamp = schedule[schedule.length-1].end; + } + container.animationSchedule[fragment].end = timestamp; + } + container.animation.stop(); +//console.warn(container.animation.schedule()); +// console.warn("Schedule", container.animationSchedule); + } + + // setup current slide + if ( Reveal.getCurrentSlide().contains( container ) ) { + Reveal.layout(); // Update layout to account for svg size + animateSlide(0); + } + + initialized += 1; + } + + function initialize() { +//console.log("Initialize animations"); + // Get all animations + var elements = document.querySelectorAll("[data-animate]"); + for (var i = 0; i < elements.length; i++ ){ + var config = parseComments( elements[i] ); + var src = elements[i].getAttribute("data-src"); + if ( src ) { + var element = elements[i]; + load( elements[i], config, src, function( element, config, response ) { + if ( printMode ) { + // do not load svg multiple times + element.removeAttribute("data-src") + } + element.innerHTML = response + element.innerHTML; + setupAnimations( element, config ); + }); + } + else { + setupAnimations( elements[i], config ); + } + } + } + + + function play() { +//console.log("Play",Reveal.getCurrentSlide()); + var elements = Reveal.getCurrentSlide().querySelectorAll("[data-animate]"); + for (var i = 0; i < elements.length; i++ ){ +//console.warn("Play",elements[i]); + elements[i].animation.play(); + } + autoPause(); + } + + function pause() { +//console.log("Pause"); + if ( timer ) { clearTimeout( timer ); timer = null; } + + var elements = Reveal.getCurrentSlide().querySelectorAll("[data-animate]"); + for (var i = 0; i < elements.length; i++ ){ + if ( elements[i].animation ) { + elements[i].animation.pause(); + } + } + } + + function autoPause() { + + if ( timer ) { clearTimeout( timer ); timer = null; } + var fragment = Reveal.getIndices().f + 1 || 0; // in reveal.js fragments start with index 0, here with index 1 + + + + var elements = Reveal.getCurrentSlide().querySelectorAll("[data-animate]"); + + for (var i = 0; i < elements.length; i++ ){ + if ( elements[i].animation && elements[i].animationSchedule[fragment] ) { +//console.log( elements[i].animationSchedule[fragment].end, elements[i].animation.time()); + var timeout = elements[i].animationSchedule[fragment].end - elements[i].animation.time(); + timer = setTimeout(pause,timeout); + } +//console.log("Auto pause",elements[i], timeout); + } + + } + + function seek( timestamp ) { +//console.log("Seek", timestamp); + var elements = Reveal.getCurrentSlide().querySelectorAll("[data-animate]"); + var fragment = Reveal.getIndices().f + 1 || 0; // in reveal.js fragments start with index 0, here with index 1 + for (var i = 0; i < elements.length; i++ ){ +//console.log("Seek",timestamp,elements[i].animationSchedule[fragment].begin + (timestamp || 0) ); + if ( elements[i].animation && elements[i].animationSchedule[fragment] ) { + elements[i].animation.time( elements[i].animationSchedule[fragment].begin + (timestamp || 0) ); + } + } + if ( timer ) { + // update time if animation is running + autoPause(); + } + } + + + // Control animation + function animateSlide( timestamp ) { +// pause(); +//console.log("Animate slide", timestamp); + if ( timestamp !== undefined ) { + seek( timestamp); + } + if ( Reveal.isAutoSliding() || playback || isRecording ) { +//console.log("Start animation"); + play(); + } + else { + pause(); + } +//console.log("Done"); + } + +/***************************************************************** +** Print +******************************************************************/ + var printMode = ( /print-pdf/gi ).test( window.location.search ); +//console.log("createPrintout" + printMode) + + function initializePrint( ) { +//return; +//console.log("initializePrint", document.querySelectorAll(".pdf-page").length); + if ( !document.querySelectorAll(".pdf-page").length ) { + // wait for pdf pages to be created + setTimeout( initializePrint, 500 ); + return; + } + initialize(); + createPrintout(); + } + + function createPrintout( ) { +//console.log("createPrintout", document.querySelectorAll(".pdf-page").length, document.querySelectorAll("[data-animate]").length ); + if ( initialized < document.querySelectorAll("[data-animate]").length ) { +//console.log("wait"); + // wait for animations to be loaded + setTimeout( createPrintout, 500 ); + return; + } + var pages = document.querySelectorAll(".pdf-page"); + for ( var i = 0; i < pages.length; i++ ) { + var fragment = -1; + var current = pages[i].querySelectorAll(".current-fragment"); + for ( var j = 0; j < current.length; j++ ) { + if ( Number(current[j].getAttribute("data-fragment-index")) > fragment ) { + fragment = Number(current[j].getAttribute("data-fragment-index") ); + } + } + fragment += 1; + var elements = pages[i].querySelectorAll("[data-animate]"); + for ( var j = 0; j < elements.length; j++ ) { +//console.log(i,fragment, elements[j]); + + if ( elements[j].animation && elements[j].animationSchedule && elements[j].animationSchedule[fragment] ) { +//console.log(i,fragment, elements[j].animationSchedule[fragment].begin); + elements[j].animation.time( elements[j].animationSchedule[fragment].end ); + } + + } + } + } +/***************************************************************** +** Event listeners +******************************************************************/ + + Reveal.addEventListener( 'ready', function( event ) { +//console.log('ready '); +/* + if ( printMode ) { + initializePrint(); + return; + } +*/ + initialize(); + + if ( printMode ) { + initializePrint(); + return; + } + + Reveal.addEventListener('slidechanged', function(){ +//console.log('slidechanged',Reveal.getIndices()); + animateSlide(0); + }); + + Reveal.addEventListener( 'overviewshown', function( event ) { + // pause animation + pause(); + } ); + +/* + Reveal.addEventListener( 'overviewhidden', function( event ) { + } ); +*/ + Reveal.addEventListener( 'paused', function( event ) { +//console.log('paused '); + // pause animation + pause(); + } ); +/* + Reveal.addEventListener( 'resumed', function( event ) { +console.log('resumed '); + // resume animation + } ); +*/ + Reveal.addEventListener( 'fragmentshown', function( event ) { +//console.log("fragmentshown",event); + animateSlide(0); + } ); + + Reveal.addEventListener( 'fragmenthidden', function( event ) { +//console.log("fragmentshown",event); + animateSlide(0); + } ); + } ); + + +/***************************************************************** +** Playback +******************************************************************/ + + document.addEventListener('seekplayback', function( event ) { +//console.log('event seekplayback ' + event.timestamp); + // set animation to event.timestamp + animateSlide(event.timestamp); + }); + + + document.addEventListener('startplayback', function( event ) { +//console.log('event startplayback ' + event.timestamp); + playback = true; + animateSlide(event.timestamp); + }); + + document.addEventListener('stopplayback', function( event ) { +//console.log('event stopplayback ', event); + playback = false; + animateSlide(); + }); + + document.addEventListener('startrecording', function( event ) { +//console.log('event startrecording ' + event.timestamp); + isRecording = true; + animateSlide(0); + }); + + document.addEventListener('stoprecording', function( event ) { +//console.log('event stoprecording ' + event.timestamp); + isRecording = false; + animateSlide(); + }); + + this.play = play; + this.pause = pause; + this.seek = seek; + return this; +}; + + diff --git a/yknjs/reveal.js-plugins/animate/svg.min.js b/yknjs/reveal.js-plugins/animate/svg.min.js new file mode 100644 index 0000000..9b9d4c2 --- /dev/null +++ b/yknjs/reveal.js-plugins/animate/svg.min.js @@ -0,0 +1,3 @@ +/*! @svgdotjs/svg.js v3.0.16 MIT*/; +var SVG=function(){"use strict";var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n,r,i,o=function(t){return t&&t.Math==Math&&t},y=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof t&&t)||Function("return this")(),m=function(t){try{return!!t()}catch(t){return!0}},f=!m(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),s={}.propertyIsEnumerable,u=Object.getOwnPropertyDescriptor,v={f:u&&!s.call({1:2},1)?function(t){var e=u(this,t);return!!e&&e.enumerable}:s},b=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},a={}.toString,h=function(t){return a.call(t).slice(8,-1)},l="".split,_=m(function(){return!Object("z").propertyIsEnumerable(0)})?function(t){return"String"==h(t)?l.call(t,""):Object(t)}:Object,c=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},d=function(t){return _(c(t))},g=function(t){return"object"==typeof t?null!==t:"function"==typeof t},p=function(t,e){if(!g(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!g(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!g(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!g(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")},w={}.hasOwnProperty,x=function(t,e){return w.call(t,e)},k=y.document,O=g(k)&&g(k.createElement),S=function(t){return O?k.createElement(t):{}},j=!f&&!m(function(){return 7!=Object.defineProperty(S("div"),"a",{get:function(){return 7}}).a}),M=Object.getOwnPropertyDescriptor,E={f:f?M:function(t,e){if(t=d(t),e=p(e,!0),j)try{return M(t,e)}catch(t){}if(x(t,e))return b(!v.f.call(t,e),t[e])}},T=function(t){if(!g(t))throw TypeError(String(t)+" is not an object");return t},C=Object.defineProperty,P={f:f?C:function(t,e,n){if(T(t),e=p(e,!0),T(n),j)try{return C(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},I=f?function(t,e,n){return P.f(t,e,b(1,n))}:function(t,e,n){return t[e]=n,t},N=function(e,n){try{I(y,e,n)}catch(t){y[e]=n}return n},D="__core-js_shared__",R=y[D]||N(D,{}),L=e(function(t){(t.exports=function(t,e){return R[t]||(R[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.6",mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})}),F=L("native-function-to-string",Function.toString),z=y.WeakMap,q="function"==typeof z&&/native code/.test(F.call(z)),Y=0,X=Math.random(),V=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++Y+X).toString(36)},H=L("keys"),B=function(t){return H[t]||(H[t]=V(t))},U={},$=y.WeakMap;if(q){var Q=new $,W=Q.get,J=Q.has,Z=Q.set;n=function(t,e){return Z.call(Q,t,e),e},r=function(t){return W.call(Q,t)||{}},i=function(t){return J.call(Q,t)}}else{var K=B("state");U[K]=!0,n=function(t,e){return I(t,K,e),e},r=function(t){return x(t,K)?t[K]:{}},i=function(t){return x(t,K)}}var tt={set:n,get:r,has:i,enforce:function(t){return i(t)?r(t):n(t,{})},getterFor:function(n){return function(t){var e;if(!g(t)||(e=r(t)).type!==n)throw TypeError("Incompatible receiver, "+n+" required");return e}}},et=e(function(t){var e=tt.get,u=tt.enforce,a=String(F).split("toString");L("inspectSource",function(t){return F.call(t)}),(t.exports=function(t,e,n,r){var i=!!r&&!!r.unsafe,o=!!r&&!!r.enumerable,s=!!r&&!!r.noTargetGet;"function"==typeof n&&("string"!=typeof e||x(n,"name")||I(n,"name",e),u(n).source=a.join("string"==typeof e?e:"")),t!==y?(i?!s&&t[e]&&(o=!0):delete t[e],o?t[e]=n:I(t,e,n)):o?t[e]=n:N(e,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&e(this).source||F.call(this)})}),nt=y,rt=function(t){return"function"==typeof t?t:void 0},it=function(t,e){return arguments.length<2?rt(nt[t])||rt(y[t]):nt[t]&&nt[t][e]||y[t]&&y[t][e]},ot=Math.ceil,st=Math.floor,ut=function(t){return isNaN(t=+t)?0:(0i;)x(r,n=e[i++])&&(~pt(o,n)||o.push(n));return o},mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],gt=mt.concat("length","prototype"),wt={f:Object.getOwnPropertyNames||function(t){return yt(t,gt)}},bt={f:Object.getOwnPropertySymbols},_t=it("Reflect","ownKeys")||function(t){var e=wt.f(T(t)),n=bt.f;return n?e.concat(n(t)):e},xt=function(t,e){for(var n=_t(e),r=P.f,i=E.f,o=0;odocument.F=Object"),t.close(),me=t.F;n--;)delete me[pe][mt[n]];return me()},ge=Object.create||function(t,e){var n;return null!==t?(ye[pe]=T(t),n=new ye,ye[pe]=null,n[de]=t):n=me(),void 0===e?n:fe(n,e)};U[de]=!0;var we={f:Gt},be=P.f,_e=function(t){var Symbol=nt.Symbol||(nt.Symbol={});x(Symbol,t)||be(Symbol,t,{value:we.f(t)})},xe=P.f,ke=Gt("toStringTag"),Oe=function(t,e,n){t&&!x(t=n?t:t.prototype,ke)&&xe(t,ke,{configurable:!0,value:e})},Se=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},Ae=function(r,i,t){if(Se(r),void 0===i)return r;switch(t){case 0:return function(){return r.call(i)};case 1:return function(t){return r.call(i,t)};case 2:return function(t,e){return r.call(i,t,e)};case 3:return function(t,e,n){return r.call(i,t,e,n)}}return function(){return r.apply(i,arguments)}},je=Gt("species"),Me=function(t,e){var n;return Ft(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!Ft(n.prototype)?g(n)&&null===(n=n[je])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===e?0:e)},Ee=[].push,Te=function(v){var d=1==v,p=2==v,y=3==v,m=4==v,g=6==v,w=5==v||g;return function(t,e,n,r){for(var i,o,s=It(t),u=_(s),a=Ae(e,n,3),h=ht(u.length),l=0,c=r||Me,f=d?c(t,h):p?c(t,0):void 0;li;)r.push(arguments[i++]);if(n=e=r[1],(g(e)||void 0!==t)&&!nn(t))return Ft(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!nn(e))return e}),r[1]=e,Xe.apply(Ye,r)}}),qe[De][Re]||I(qe[De],Re,qe[De].valueOf),Oe(qe,Ne),U[Ie]=!0;var ln=P.f,cn=y.Symbol;if(f&&"function"==typeof cn&&(!("description"in cn.prototype)||void 0!==cn().description)){var fn={},vn=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof vn?new cn(t):void 0===t?cn():cn(t);return""===t&&(fn[e]=!0),e};xt(vn,cn);var dn=vn.prototype=cn.prototype;dn.constructor=vn;var pn=dn.toString,yn="Symbol(test)"==String(cn("test")),mn=/^Symbol\((.*)\)[^)]+$/;ln(dn,"description",{configurable:!0,get:function(){var t=g(this)?this.valueOf():this,e=pn.call(t);if(x(fn,t))return"";var n=yn?e.slice(7,-1):e.replace(mn,"$1");return""===n?void 0:n}}),Ct({global:!0,forced:!0},{Symbol:vn})}_e("iterator");var gn=Gt("unscopables"),wn=Array.prototype;null==wn[gn]&&I(wn,gn,ge(null));var bn,_n,xn,kn=function(t){wn[gn][t]=!0},On={},Sn=!m(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),An=B("IE_PROTO"),jn=Object.prototype,Mn=Sn?Object.getPrototypeOf:function(t){return t=It(t),x(t,An)?t[An]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?jn:null},En=Gt("iterator"),Tn=!1;[].keys&&("next"in(xn=[].keys())?(_n=Mn(Mn(xn)))!==Object.prototype&&(bn=_n):Tn=!0),null==bn&&(bn={}),x(bn,En)||I(bn,En,function(){return this});var Cn={IteratorPrototype:bn,BUGGY_SAFARI_ITERATORS:Tn},Pn=Cn.IteratorPrototype,In=function(){return this},Nn=Object.setPrototypeOf||("__proto__"in{}?function(){var n,r=!1,t={};try{(n=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(t,[]),r=t instanceof Array}catch(t){}return function(t,e){return T(t),function(t){if(!g(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype")}(e),r?n.call(t,e):t.__proto__=e,t}}():void 0),Dn=Cn.IteratorPrototype,Rn=Cn.BUGGY_SAFARI_ITERATORS,Ln=Gt("iterator"),Fn="values",zn="entries",qn=function(){return this},Yn=function(t,e,n,r,i,o,s){var u,a,h;a=r,h=e+" Iterator",(u=n).prototype=ge(Pn,{next:b(1,a)}),Oe(u,h,!1),On[h]=In;var l,c,f,v=function(t){if(t===i&&g)return g;if(!Rn&&t in y)return y[t];switch(t){case"keys":case Fn:case zn:return function(){return new n(this,t)}}return function(){return new n(this)}},d=e+" Iterator",p=!1,y=t.prototype,m=y[Ln]||y["@@iterator"]||i&&y[i],g=!Rn&&m||v(i),w="Array"==e&&y.entries||m;if(w&&(l=Mn(w.call(new t)),Dn!==Object.prototype&&l.next&&(Mn(l)!==Dn&&(Nn?Nn(l,Dn):"function"!=typeof l[Ln]&&I(l,Ln,qn)),Oe(l,d,!0))),i==Fn&&m&&m.name!==Fn&&(p=!0,g=function(){return m.call(this)}),y[Ln]!==g&&I(y,Ln,g),On[e]=g,i)if(c={values:v(Fn),keys:o?g:v("keys"),entries:v(zn)},s)for(f in c)!Rn&&!p&&f in y||et(y,f,c[f]);else Ct({target:e,proto:!0,forced:Rn||p},c);return c},Xn="Array Iterator",Gn=tt.set,Vn=tt.getterFor(Xn),Hn=Yn(Array,"Array",function(t,e){Gn(this,{type:Xn,target:d(t),index:0,kind:e})},function(){var t=Vn(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?{value:t.target=void 0,done:!0}:"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}},"values");On.Arguments=On.Array,kn("keys"),kn("values"),kn("entries");var Bn=Gt("toStringTag"),Un="Arguments"==h(function(){return arguments}()),$n=function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),Bn))?n:Un?h(e):"Object"==(r=h(e))&&"function"==typeof e.callee?"Arguments":r},Qn={};Qn[Gt("toStringTag")]="z";var Wn="[object z]"!==String(Qn)?function(){return"[object "+$n(this)+"]"}:Qn.toString,Jn=Object.prototype;Wn!==Jn.toString&&et(Jn,"toString",Wn,{unsafe:!0});var Zn=!m(function(){return Object.isExtensible(Object.preventExtensions({}))}),Kn=e(function(t){var e=P.f,n=V("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(t){e(t,n,{value:{objectID:"O"+ ++r,weakData:{}}})},s=t.exports={REQUIRED:!1,fastKey:function(t,e){if(!g(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!x(t,n)){if(!i(t))return"F";if(!e)return"E";o(t)}return t[n].objectID},getWeakData:function(t,e){if(!x(t,n)){if(!i(t))return!0;if(!e)return!1;o(t)}return t[n].weakData},onFreeze:function(t){return Zn&&s.REQUIRED&&i(t)&&!x(t,n)&&o(t),t}};U[n]=!0}),tr=Gt("iterator"),er=Array.prototype,nr=Gt("iterator"),rr=function(e,t,n,r){try{return r?t(T(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&T(i.call(e)),t}},ir=e(function(t){var d=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,r,i){var o,s,u,a,h,l,c,f,v=Ae(e,n,r?2:1);if(i)o=t;else{if("function"!=typeof(s=function(t){if(null!=t)return t[nr]||t["@@iterator"]||On[$n(t)]}(t)))throw TypeError("Target is not iterable");if(void 0!==(f=s)&&(On.Array===f||er[tr]===f)){for(u=0,a=ht(t.length);u=n.length?{value:void 0,done:!0}:(t=wr(n,r),e.index+=t.length,{value:t,done:!1})});var kr={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Or=Gt("iterator"),Sr=Gt("toStringTag"),Ar=Hn.values;for(var jr in kr){var Mr=y[jr],Er=Mr&&Mr.prototype;if(Er){if(Er[Or]!==Ar)try{I(Er,Or,Ar)}catch(t){Er[Or]=Ar}if(Er[Sr]||I(Er,Sr,jr),kr[jr])for(var Tr in Hn)if(Er[Tr]!==Hn[Tr])try{I(Er,Tr,Hn[Tr])}catch(t){Er[Tr]=Hn[Tr]}}}function Cr(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e")}),Zr=!m(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}),Kr=function(n,t,e,r){var i=Gt(n),o=!m(function(){var t={};return t[i]=function(){return 7},7!=""[n](t)}),s=o&&!m(function(){var t=!1,e=/a/;return"split"===n&&((e={constructor:{}}).constructor[Wr]=function(){return e},e.flags="",e[i]=/./[i]),e.exec=function(){return t=!0,null},e[i](""),!t});if(!o||!s||"replace"===n&&!Jr||"split"===n&&!Zr){var u=/./[i],a=e(i,""[n],function(t,e,n,r,i){return e.exec===Br?o&&!i?{done:!0,value:u.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}}),h=a[0],l=a[1];et(String.prototype,n,h),et(RegExp.prototype,i,2==t?function(t,e){return l.call(t,this,e)}:function(t){return l.call(t,this)}),r&&I(RegExp.prototype[i],"sham",!0)}},ti=gr.charAt,ei=function(t,e,n){return e+(n?ti(t,e).length:1)},ni=function(t,e){var n=t.exec;if("function"==typeof n){var r=n.call(t,e);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==h(t))throw TypeError("RegExp#exec called on incompatible receiver");return Br.call(t,e)},ri=Math.max,ii=Math.min,oi=Math.floor,si=/\$([$&'`]|\d\d?|<[^>]*>)/g,ui=/\$([$&'`]|\d\d?)/g;Kr("replace",2,function(i,_,x){return[function(t,e){var n=c(this),r=null==t?void 0:t[i];return void 0!==r?r.call(t,n,e):_.call(String(n),t,e)},function(t,e){var n=x(_,t,this,e);if(n.done)return n.value;var r=T(t),i=String(this),o="function"==typeof e;o||(e=String(e));var s=r.global;if(s){var u=r.unicode;r.lastIndex=0}for(var a=[];;){var h=ni(r,i);if(null===h)break;if(a.push(h),!s)break;""===String(h[0])&&(r.lastIndex=ei(i,ht(r.lastIndex),u))}for(var l,c="",f=0,v=0;v>>0;if(0===r)return[];if(void 0===t)return[n];if(!$r(t))return g.call(n,t,r);for(var i,o,s,u=[],a=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),h=0,l=new RegExp(t.source,a+"g");(i=Br.call(l,n))&&!(h<(o=l.lastIndex)&&(u.push(n.slice(h,i.index)),1=r));)l.lastIndex===i.index&&l.lastIndex++;return h===n.length?!s&&l.test("")||u.push(""):u.push(n.slice(h)),u.length>r?u.slice(0,r):u}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:g.call(this,t,e)}:g,[function(t,e){var n=c(this),r=null==t?void 0:t[i];return void 0!==r?r.call(t,n,e):b.call(String(n),t,e)},function(t,e){var n=w(b,t,this,e,b!==g);if(n.done)return n.value;var r,i,o,s=T(t),u=String(this),a=(r=RegExp,void 0===(o=T(s).constructor)||null==(i=T(o)[eo])?r:Se(i)),h=s.unicode,l=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(oo?"y":"g"),c=new a(oo?s:"^(?:"+s.source+")",l),f=void 0===e?io:e>>>0;if(0===f)return[];if(0===u.length)return null===ni(c,u)?[u]:[];for(var v=0,d=0,A=[];d>>0||(Ko.test(n)?16:10))}:Zo;Ct({global:!0,forced:parseInt!=ts},{parseInt:ts});var es="toString",ns=RegExp.prototype,rs=ns[es],is=m(function(){return"/a/b"!=rs.call({source:"a",flags:"b"})}),os=rs.name!=es;function ss(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t)){var n=[],r=!0,i=!1,o=void 0;try{for(var s,u=t[Symbol.iterator]();!(r=(s=u.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){i=!0,o=t}finally{try{r||null==u.return||u.return()}finally{if(i)throw o}}return n}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function us(t,e){for(var n=0;nv?Math.pow(l,3):(l-f)/7.787),e=1*(Math.pow(h,3)>v?Math.pow(h,3):(h-f)/7.787),n=1.08883*(Math.pow(c,3)>v?Math.pow(c,3):(c-f)/7.787)}var d=3.2406*t+-1.5372*e+-.4986*n,p=-.9689*t+1.8758*e+.0415*n,y=.0557*t+-.204*e+1.057*n,m=Math.pow,g=.0031308;return new T(255*(gPs;Ps++)x(Ss,Es=Cs[Ps])&&!x(Ts,Es)&&xs(Ts,Es,_s(Ss,Es));(Ts.prototype=As).constructor=Ts,et(y,Os,Ts)}var Is=di.trim,Ns=y.parseFloat,Ds=1/Ns(hi+"-0")!=-1/0?function(t){var e=Is(String(t)),n=Ns(e);return 0===n&&"-"==e.charAt(0)?-0:n}:Ns;Ct({global:!0,forced:parseFloat!=Ds},{parseFloat:Ds});var Rs=function(){function t(){Ti(this,t),this.init.apply(this,arguments)}return as(t,[{key:"init",value:function(t,e){var n=0,r=0,i=Array.isArray(t)?{x:t[0],y:t[1]}:"object"===ce(t)?{x:t.x,y:t.y}:{x:t,y:e};return this.x=null==i.x?n:i.x,this.y=null==i.y?r:i.y,this}},{key:"clone",value:function(){return new t(this)}},{key:"transform",value:function(t){return this.clone().transformO(t)}},{key:"transformO",value:function(t){Fs.isMatrixLike(t)||(t=new Fs(t));var e=this.x,n=this.y;return this.x=t.a*e+t.c*n+t.e,this.y=t.b*e+t.d*n+t.f,this}},{key:"toArray",value:function(){return[this.x,this.y]}}]),t}();function Ls(t,e,n){return Math.abs(e-t)<(n||1e-6)}var Fs=function(){function h(){Ti(this,h),this.init.apply(this,arguments)}return as(h,[{key:"init",value:function(t){var e=h.fromArray([1,0,0,1,0,0]);return t=t instanceof Element?t.matrixify():"string"==typeof t?h.fromArray(t.split(go).map(parseFloat)):Array.isArray(t)?h.fromArray(t):"object"===ce(t)&&h.isMatrixLike(t)?t:"object"===ce(t)?(new h).transform(t):6===arguments.length?h.fromArray([].slice.call(arguments)):e,this.a=null!=t.a?t.a:e.a,this.b=null!=t.b?t.b:e.b,this.c=null!=t.c?t.c:e.c,this.d=null!=t.d?t.d:e.d,this.e=null!=t.e?t.e:e.e,this.f=null!=t.f?t.f:e.f,this}},{key:"clone",value:function(){return new h(this)}},{key:"transform",value:function(t){if(h.isMatrixLike(t))return new h(t).multiplyO(this);var e=h.formatTransforms(t),n=new Rs(e.ox,e.oy).transform(this),r=n.x,i=n.y,o=(new h).translateO(e.rx,e.ry).lmultiplyO(this).translateO(-r,-i).scaleO(e.scaleX,e.scaleY).skewO(e.skewX,e.skewY).shearO(e.shear).rotateO(e.theta).translateO(r,i);if(isFinite(e.px)||isFinite(e.py)){var s=new Rs(r,i).transform(o),u=e.px?e.px-s.x:0,a=e.py?e.py-s.y:0;o.translateO(u,a)}return o.translateO(e.tx,e.ty),o}},{key:"compose",value:function(t){t.origin&&(t.originX=t.origin[0],t.originY=t.origin[1]);var e=t.originX||0,n=t.originY||0,r=t.scaleX||1,i=t.scaleY||1,o=t.shear||0,s=t.rotate||0,u=t.translateX||0,a=t.translateY||0;return(new h).translateO(-e,-n).scaleO(r,i).shearO(o).rotateO(s).translateO(u,a).lmultiplyO(this).translateO(e,n)}},{key:"decompose",value:function(){var t=0",delay:0},Ws={"fill-opacity":1,"stroke-opacity":1,"stroke-width":0,"stroke-linejoin":"miter","stroke-linecap":"butt",fill:"#000000",stroke:"#000000",opacity:1,x:0,y:0,cx:0,cy:0,width:0,height:0,r:0,rx:0,ry:0,offset:0,"stop-opacity":1,"stop-color":"#000000","text-anchor":"start"},Js={__proto__:null,noop:$s,timeline:Qs,attrs:Ws},Zs=Gs("SVGArray",Array,function(t){this.init(t)});Vi(Zs,{init:function(t){return"number"==typeof t||(this.length=0,this.push.apply(this,Cr(this.parse(t)))),this},toArray:function(){return Array.prototype.concat.apply([],this)},toString:function(){return this.join(" ")},valueOf:function(){var t=[];return t.push.apply(t,Cr(this)),t},parse:function(){var t=0n.x&&e>n.y&&tu;)void 0!==(n=i(r,e=o[u++]))&&zt(s,e,n);return s}}),Nr("Element",{untransform:function(){return this.attr("transform",null)},matrixify:function(){return(this.attr("transform")||"").split(lo).slice(0,-1).map(function(t){var e=t.trim().split("(");return[e[0],e[1].split(go).map(function(t){return parseFloat(t)})]}).reverse().reduce(function(t,e){return"matrix"===e[0]?t.lmultiply(Fs.fromArray(e[1])):t[e[0]].apply(t,e[1])},new Fs)},toParent:function(t){if(this===t)return this;var e=this.screenCTM(),n=t.screenCTM().inverse();return this.addTo(t).untransform().transform(n.multiply(e)),this},toRoot:function(){return this.toParent(this.root())},transform:function(t,e){if(null==t||"string"==typeof t){var n=new Fs(this).decompose();return null==t?n:n[t]}Fs.isMatrixLike(t)||(t=function(e){for(var t=1;t":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)},bezier:function(e,n,r,i){return function(t){return t<0?0=e.time?e.run():Ku.timeouts.push(e),e!==n););for(var r=null,i=Ku.frames.last();r!==i&&(r=Ku.frames.shift());)r.run(t);for(var o=null;o=Ku.immediates.shift();)o();Ku.nextDraw=Ku.timeouts.first()||Ku.frames.first()?Ei.window.requestAnimationFrame(Ku._draw):null}},ta=function(t){var e=t.start,n=t.runner.duration();return{start:e,duration:n,end:e+n,runner:t.runner}},ea=function(){var t=Ei.window;return(t.performance||t.Date).now()},na=function(t){function n(){var t,e=0=r;this._lastTime=this._time,i&&this.fire("start",this);var s=this._isDeclarative;if(this.done=!s&&!o&&this._time>=r,this._reseted=!1,n||s){this._initialise(n),this.transforms=new Fs;var u=this._run(s?t:e);this.fire("step",this)}return this.done=this.done||u&&s,o&&this.fire("finished",this),this}},{key:"reset",value:function(){return this._reseted||(this.time(0),this._reseted=!0),this}},{key:"finish",value:function(){return this.step(1/0)}},{key:"reverse",value:function(t){return this._reverse=null==t?!this._reverse:t,this}},{key:"ease",value:function(t){return this._stepper=new Cu(t),this}},{key:"active",value:function(t){return null==t?this.enabled:(this.enabled=t,this)}},{key:"_rememberMorpher",value:function(t,e){if(this._history[t]={morpher:e,caller:this._queue[this._queue.length-1]},this._isDeclarative){var n=this.timeline();n&&n.play()}}},{key:"_tryRetarget",value:function(t,e,n){if(this._history[t]){if(!this._history[t].caller.initialised){var r=this._queue.indexOf(this._history[t].caller);return this._queue.splice(r,1),!1}this._history[t].caller.retarget?this._history[t].caller.retarget(e,n):this._history[t].morpher.to(e),this._history[t].caller.finished=!1;var i=this.timeline();return i&&i.play(),!0}return!1}},{key:"_initialise",value:function(t){if(t||this._isDeclarative)for(var e=0,n=this._queue.length;e + + +``` + +## Configuration & basic usage + +The plugin can be configured by providing an ```anything``` option containing an array of ```className```, ```defaults```, and ```f``` within the reveal.js initialization options. + + +```javascript +Reveal.initialize({ + // ... + anything: [ + { + className: "random", + defaults: {min: 0, max: 9}, + initialize: (function(container, options){ + container.innerHTML = Math.trunc( options.min + Math.random()*(options.max-options.min + 1) ); + }) + }, + // ... + ], +} +``` + +With the above configuration the plugin searches for all HTML object with class ```random```. +For each of the HTML objects it checks whether there is a JSON string within a comment inside the HTML object. +Then, it calls the function ```function(container, options)``` where ```container``` is the HTML object and ```options``` is the JSON string. +It is possible to specify the ```defaults``` parameter to be used if no JSON string is provided or not all values required by the function are given in the JSON string. + +The code +```html +

    + Today's winning 3 digit number is : + , + , + . +

    +``` +produces the output + +```html +

    + Today's winning 3 digit number is : + 3, + 8, + 0. +

    +``` +The code +```html +

    + Today's roll of a die is: + . +

    +``` +produces the output + +```html +

    + Today's roll of a die is: + 4. +

    +``` + + + +## Advanced usage + +The plugin can be used to easily integrate external javascript libraries. + +### Charts.js + +With the plugin charts created by [Chart.js](http://www.chartjs.org/) can easily be included in the slides by including + +```html + + +``` +and +```javascript +Reveal.initialize({ + // ... + anything: [ + { + className: "chart", + initialize: (function(container, options){ container.chart = new Chart(container.getContext("2d"), options); }) + }, + plugins: [ RevealAnything ], + // ... + ], + // ... +}); +``` + +A chart can be included in a slide by adding a ```canvas``` element and a JSON string specifying the chart options. + +```html + + + +``` +Note, that the [Chart plugin](https://github.com/rajgoel/reveal.js-plugins/tree/master/chart) provides an easier way to use Chart.js. + +### Function-plot.js + +With the plugin plots of functions created by [Function-plot.js](https://github.com/maurizzzio/function-plot) can be included in the slides by including + +```html + + + + + + +``` +and + +```javascript +Reveal.initialize({ + // ... + anything: [ + { + className: "plot", + defaults: {width:500, height: 500, grid:true}, + initialize: (function(container, options){ options.target = "#"+container.id; functionPlot(options) }) + }, + // ... + ], + plugins: [ RevealAnything ], + // ... +}); +``` +A plot can be included in a slide by adding a ```div``` element and a JSON string specifying the options. + +```html +
    + +
    +``` +With the above ```defaults```, the input can be eased, e.g. +```html +
    + +
    +``` +## More advanced usage + +The plugin allows to define functions within the JSON options. + +### Example + +In the following example, the function ```options.initialize(container)``` is called for each element of the class ```anything```. The function is defined within the JSON string. + +The example uses +```html + + + +``` +and +```javascript +Reveal.initialize({ + // ... + anything: [ + { + className: "anything", + initialize: (function(container, options){ if (options && options.initialize) { options.initialize(container)} }) + }, + // ... + ], + plugins: [ RevealAnything ], + // ... +}); +``` +The [d3.js](d3js.org) library can now be used to draw a [globe](http://bl.ocks.org/mbostock/ba63c55dd2dbc3ab0127) within a canvas element. + +```html + + + +``` + +## License + +MIT licensed + +Copyright (C) 2020 Asvin Goel diff --git a/yknjs/reveal.js-plugins/anything/plugin.js b/yknjs/reveal.js-plugins/anything/plugin.js new file mode 100644 index 0000000..4e1d05a --- /dev/null +++ b/yknjs/reveal.js-plugins/anything/plugin.js @@ -0,0 +1,101 @@ +/***************************************************************** +** Author: Asvin Goel, goel@telematique.eu +** +** A plugin for reveal.js allowing to easily integrate any content +** +** Version: 1.0.0 +** +** License: MIT license (see LICENSE.md) +** +******************************************************************/ + +window.RevealAnything = window.RevealAnything || { + id: 'RevealAnything', + init: function(deck) { + initAnything(deck); + } +}; + +const initAnything = function(Reveal){ + function parseJSON(str) { + str = str.replace(/(\r\n|\n|\r|\t)/gm,""); // remove line breaks and tabs + var json; + try { + json = JSON.parse(str, function (key, value) { + if (value && (typeof value === 'string') && value.indexOf("function") === 0) { + // we can only pass a function as string in JSON ==> doing a real function +// eval("var jsFunc = " + value); + var jsFunc = new Function('return ' + value)(); + return jsFunc; + } + return value; + }); + } catch (e) { + return null; + } + return json; + } + + /* + * Recursively merge properties of two objects without overwriting the first + */ + function mergeRecursive(obj1, obj2) { + for (var p in obj2) { + try { + // Property in destination object set; update its value. + if ( obj2[p].constructor==Object ) { + obj1[p] = mergeRecursive(obj1[p], obj2[p]); + + } else { + if ( !obj1[p] ) obj1[p] = obj2[p]; + + } + + } catch(e) { + // Property in destination object not set; create it and set its value. + if ( !obj1[p] ) obj1[p] = obj2[p]; + + } + } + + return obj1; + } + + + var config = Reveal.getConfig().anything; + + Reveal.addEventListener( 'ready', function( event ) { + for (var i = 0; i < config.length; i++ ){ + // Get all elements of the class + var elements = document.getElementsByClassName(config[i].className); + var initialize = config[i].initialize; + // deprecated parameters + if ( !initialize && config[i].f ) { + initialize = config[i].f; + console.warn('Setting parameter "f" is deprecated! Use "initialize" instead. '); + } + + for (var j = 0; j < elements.length; j++ ){ + var options = config[i].defaults; + var comments = elements[j].innerHTML.trim().match(//g); + if ( comments !== null ) for (var k = 0; k < comments.length; k++ ){ + comments[k] = comments[k].replace(//,''); + mergeRecursive( options, config[i].defaults); + options = parseJSON(comments[k]); + if ( options ) { + mergeRecursive( options, config[i].defaults); + break; + } + } +// console.log(config[i].className + " options: " + JSON.stringify(options)) + initialize(elements[j], options); +// console.log(elements[j].outerHTML) + } + } + } ); + + +}; + + diff --git a/yknjs/reveal.js-plugins/audio-slideshow/README.md b/yknjs/reveal.js-plugins/audio-slideshow/README.md new file mode 100644 index 0000000..8dec39f --- /dev/null +++ b/yknjs/reveal.js-plugins/audio-slideshow/README.md @@ -0,0 +1,171 @@ +# Audio slideshow + +A plugin for [Reveal.js](https://github.com/hakimel/reveal.js) allowing to easily add audio playback to each slide and fragment of your presentation. +The slideshow adds an audio player to the slideshow and plays an audio file provided for each slide and fragment. +When an audio file has finished playing, the plugin and automatically advances the slideshow to the next slide or fragment. + +[Check out the live demo](https://rajgoel.github.io/reveal.js-demos/audio-slideshow-demo.html) + + +## Installation + +Copy the files ```plugin.js```, ```recorder.js```, and ```RecordRTC.js``` into the plugin folder of your reveal.js presentation, i.e. ```plugin/audio-slideshow``` and load the plugin as shown below. + +```html + + + + + +``` + +The plugin ```RevealAudioRecorder``` and the respective files ```recorder.js``` and ```RecordRTC.js```are optional and not necessary for audio playback. + + +## Configuration + +The ```plugin.js``` has several parameters that you can set for your presentation by providing an ```audio``` option in the reveal.js initialization options. +Note that all configuration parameters are optional and will default as specified below. + + +```javascript +Reveal.initialize({ + // ... + audio: { + prefix: 'audio/', // audio files are stored in the "audio" folder + suffix: '.ogg', // audio files have the ".ogg" ending + textToSpeechURL: null, // the URL to the text to speech converter + defaultNotes: false, // use slide notes as default for the text to speech converter + defaultText: false, // use slide text as default for the text to speech converter + advance: 0, // advance to next slide after given time in milliseconds after audio has played, use negative value to not advance + autoplay: false, // automatically start slideshow + defaultDuration: 5, // default duration in seconds if no audio is available + defaultAudios: true, // try to play audios with names such as audio/1.2.ogg + playerOpacity: 0.05, // opacity value of audio player if unfocused + playerStyle: 'position: fixed; bottom: 4px; left: 25%; width: 50%; height:75px; z-index: 33;', // style used for container of audio controls + startAtFragment: false, // when moving to a slide, start at the current fragment or at the start of the slide + }, + // ... +}); +``` + +## Preparing an audio slideshow + +For each slide or fragment you can explicitly specify a file to be played when the slide or fragment is shown by setting the ```data-audio-src``` attribute for the slide or fragment. + +```html +
    +

    + With audio slideshows you can add recorded audio to whatever you want to deliver to your audience. +

    +

    + Listen to the birds +

    +
    +``` + +If no audio file is explicitly specified, the plugin automatically determines the name of the audio file using the given ```prefix```, the slide (or fragment) indices, and the ```suffix```, e.g. in the above code the slideshow will play the file ```audio/1.2.ogg``` before the fragment is shown (assuming that ```prefix``` is ```"audio/"```, ```suffix``` is ```".ogg"``` , ```Reveal.getIndices().h``` is ```"1"``` and ```Reveal.getIndices().v``` is ```"2"```). + +If you just want to play audio when file names are explicitly set with ```data-audio-src```, configure ```defaultAudios``` to ```false```. + +### Text-to-speech + +If no audio file is explicitly specified and the default audio file is not found, the plugin can play audio files obtained from a text-to-speech generator. +In order to enable text-to-speech functionality, the parameter ```textToSpeechURL``` must be specified. +For example, in order to use the free text-to-speech generator of [Voice RSS](http://www.voicerss.org/) you can set ```textToSpeechURL: "http://api.voicerss.org/?key=[YOUR_KEY]&hl=en-gb&c=ogg&src="```, +where ```[YOUR_KEY]``` should be the key that you obtained after [registration at Voice RSS](http://www.voicerss.org/registration.aspx). + +The plugin automatically extracts the text to be sent to the text-to-speech generator from the slide content in the following order: +- If the optional ```data-audio-text``` attribute is given for the slide or fragment, the value of this attribute is used as the text. +- If the parameter ```defaultNotes``` is set to ```true```, the text given in the notes of the slide are used as the text (note that this option does not work with fragments). +- If the parameter ```defaultText``` is set to ```true```, the slide or fragment content is used as text. + + +```html +
    +

    This is the text shown on the slide

    +
    +
    +

    This is the text shown on the slide

    +
    + +``` + +### Audio recording + +You can use the ```recorder.js``` plugin to record audio files for each slide and fragment. + +Recording can be toggled by pressing the key ```R```. +A red circle in the upper right corner of the slideshow shows that the recorder is on. +When navigating to a slide for which an audio file is already recorded, recording is suspended so that the previously recorded file is not lost. +A yellow circle shows that recording is automatically resumed when navigating to a slide without a recorded audio file. +After stopping the recorder, you can use the audio controls to check your recording. + +By pressing the key ```Z```you can download a zip-file containing the audio files recorded for each slide and fragment. + +The ```recorder.js``` plugin allows you to fetch the automatically generated audio files by pressing the key ```T```. The fetched audio files are downloaded as a zip-file and can be provided to the slideshow. +Note that the text-to-speech converter is only used if no audio file is provided with the slideshow. + + +### Navigation behaviour + +#### Slides without audio + +If no audio file and no text is provided for a slide or fragment, the slide advances after the duration specified by the ```defaultDuration``` parameter. + +#### Options for automatically advancing to next slide + +The ```advance``` parameter can be used to specify a time (in milliseconds) to wait before advancing to the next slide or fragment. +If the parameter value is set to zero, the slideshow advances with the next slide or fragment immediately after the previous audio is played. +If the parameter value is set to a negative value, the slideshow does not advance after the audio is played. +For each slide or fragment the ```data-audio-advance``` attribute can be set to overwrite the parameter. + +#### Automatically start slideshow + +By default the slideshow does not start automatically. The ```autoplay``` parameter can be used to automatically start the slideshow when navigating to it. + +#### Navigating to a slide with fragments + +By default the audio slideshow does not show any fragment when navigating to a slide (even if they were shown previously). The ```startAtFragment``` parameter can be used to use the default behaviour of reveal.js. + + +#### Linking audio controls to embedded video + +By setting the ```data-audio-controls``` attribute for a video, the audio player controls can be linked to an embedded video. + +```html + +``` + + +## Compatibility and known issues + +Playback is supported on recent desktop versions of Firefox, Chrome, and Opera. +However, audio support of different browsers and for different operating systems is differently implemented and may not always work flawlessly. +For example, playback of audio when using Chrome for Android, must be triggered [manually](https://code.google.com/p/chromium/issues/detail?id=178297) for each slide and fragment due to design decisions of Chrome developers. +For other browser and mobile devices the functionality may be limited or the plugin may not work at all. + + +The ```recorder.js``` plugin is based on [RecordRTC.js](https://github.com/muaz-khan/WebRTC-Experiment/tree/master/RecordRTC) and supports recording on recent desktop versions of Firefox, Chrome, and Opera. +For other browser and mobile devices recording may not work at all. + +### Recording and fetching audio files on Chrome + +Your slideshow should be loaded on HTTP or HTTPS. For slide decks stored on the local disk, you may have to launch the Chrome browser from the command line window with additional arguments for full functionality. + +``` +google-chrome --disable-web-security --allow-file-access-from-files slidedeck.html +``` + +## License + +MIT licensed + +Copyright (C) 2020 Asvin Goel diff --git a/yknjs/reveal.js-plugins/audio-slideshow/RecordRTC.js b/yknjs/reveal.js-plugins/audio-slideshow/RecordRTC.js new file mode 100644 index 0000000..d202522 --- /dev/null +++ b/yknjs/reveal.js-plugins/audio-slideshow/RecordRTC.js @@ -0,0 +1,5590 @@ +'use strict'; + +// Last time updated: 2018-09-12 1:14:20 PM UTC + +// ________________ +// RecordRTC v5.4.8 + +// Open-Sourced: https://github.com/muaz-khan/RecordRTC + +// -------------------------------------------------- +// Muaz Khan - www.MuazKhan.com +// MIT License - www.WebRTC-Experiment.com/licence +// -------------------------------------------------- + +// ____________ +// RecordRTC.js + +/** + * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. + * @summary Record audio, video or screen inside the browser. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef RecordRTC + * @class + * @example + * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], { + * type: 'video', // audio or video or gif or canvas + * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc + * }); + * recorder.startRecording(); + * @see For further information: + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc. + * @param {object} config - {type:"video", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.} + */ + +function RecordRTC(mediaStream, config) { + if (!mediaStream) { + throw 'First parameter is required.'; + } + + config = config || { + type: 'video' + }; + + config = new RecordRTCConfiguration(mediaStream, config); + + // a reference to user's recordRTC object + var self = this; + + function startRecording(config2) { + if (!!config2) { + // allow users to set options using startRecording method + // config2 is similar to main "config" object (second parameter over RecordRTC constructor) + config = new RecordRTCConfiguration(mediaStream, config2); + } + + if (!config.disableLogs) { + console.log('started recording ' + config.type + ' stream.'); + } + + if (mediaRecorder) { + mediaRecorder.clearRecordedData(); + mediaRecorder.record(); + + setState('recording'); + + if (self.recordingDuration) { + handleRecordingDuration(); + } + return self; + } + + initRecorder(function() { + if (self.recordingDuration) { + handleRecordingDuration(); + } + }); + + return self; + } + + function initRecorder(initCallback) { + if (initCallback) { + config.initCallback = function() { + initCallback(); + initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once. + }; + } + + var Recorder = new GetRecorderType(mediaStream, config); + + mediaRecorder = new Recorder(mediaStream, config); + mediaRecorder.record(); + + setState('recording'); + + if (!config.disableLogs) { + console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type); + } + } + + function stopRecording(callback) { + callback = callback || function() {}; + + if (!mediaRecorder) { + warningLog(); + return; + } + + if (self.state === 'paused') { + self.resumeRecording(); + + setTimeout(function() { + stopRecording(callback); + }, 1); + return; + } + + if (self.state !== 'recording' && !config.disableLogs) { + console.warn('Recording state should be: "recording", however current state is: ', self.state); + } + + if (!config.disableLogs) { + console.log('Stopped recording ' + config.type + ' stream.'); + } + + if (config.type !== 'gif') { + mediaRecorder.stop(_callback); + } else { + mediaRecorder.stop(); + _callback(); + } + + setState('stopped'); + + function _callback(__blob) { + if (!mediaRecorder) { + if (typeof callback.call === 'function') { + callback.call(self, ''); + } else { + callback(''); + } + return; + } + + Object.keys(mediaRecorder).forEach(function(key) { + if (typeof mediaRecorder[key] === 'function') { + return; + } + + self[key] = mediaRecorder[key]; + }); + + var blob = mediaRecorder.blob; + + if (!blob) { + if (__blob) { + mediaRecorder.blob = blob = __blob; + } else { + throw 'Recording failed.'; + } + } + + if (blob && !config.disableLogs) { + console.log(blob.type, '->', bytesToSize(blob.size)); + } + + if (callback) { + var url = URL.createObjectURL(blob); + + if (typeof callback.call === 'function') { + callback.call(self, url); + } else { + callback(url); + } + } + + if (!config.autoWriteToDisk) { + return; + } + + getDataURL(function(dataURL) { + var parameter = {}; + parameter[config.type + 'Blob'] = dataURL; + DiskStorage.Store(parameter); + }); + } + } + + function pauseRecording() { + if (!mediaRecorder) { + warningLog(); + return; + } + + if (self.state !== 'recording') { + if (!config.disableLogs) { + console.warn('Unable to pause the recording. Recording state: ', self.state); + } + return; + } + + setState('paused'); + + mediaRecorder.pause(); + + if (!config.disableLogs) { + console.log('Paused recording.'); + } + } + + function resumeRecording() { + if (!mediaRecorder) { + warningLog(); + return; + } + + if (self.state !== 'paused') { + if (!config.disableLogs) { + console.warn('Unable to resume the recording. Recording state: ', self.state); + } + return; + } + + setState('recording'); + + // not all libs have this method yet + mediaRecorder.resume(); + + if (!config.disableLogs) { + console.log('Resumed recording.'); + } + } + + function readFile(_blob) { + postMessage(new FileReaderSync().readAsDataURL(_blob)); + } + + function getDataURL(callback, _mediaRecorder) { + if (!callback) { + throw 'Pass a callback function over getDataURL.'; + } + + var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob; + + if (!blob) { + if (!config.disableLogs) { + console.warn('Blob encoder did not finish its job yet.'); + } + + setTimeout(function() { + getDataURL(callback, _mediaRecorder); + }, 1000); + return; + } + + if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) { + var webWorker = processInWebWorker(readFile); + + webWorker.onmessage = function(event) { + callback(event.data); + }; + + webWorker.postMessage(blob); + } else { + var reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onload = function(event) { + callback(event.target.result); + }; + } + + function processInWebWorker(_function) { + var blob = URL.createObjectURL(new Blob([_function.toString(), + 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}' + ], { + type: 'application/javascript' + })); + + var worker = new Worker(blob); + URL.revokeObjectURL(blob); + return worker; + } + } + + function handleRecordingDuration(counter) { + counter = counter || 0; + + if (self.state === 'paused') { + setTimeout(function() { + handleRecordingDuration(counter); + }, 1000); + return; + } + + if (self.state === 'stopped') { + return; + } + + if (counter >= self.recordingDuration) { + stopRecording(self.onRecordingStopped); + return; + } + + counter += 1000; // 1-second + + setTimeout(function() { + handleRecordingDuration(counter); + }, 1000); + } + + function setState(state) { + if (!self) { + return; + } + + self.state = state; + + if (typeof self.onStateChanged.call === 'function') { + self.onStateChanged.call(self, state); + } else { + self.onStateChanged(state); + } + } + + var WARNING = 'It seems that recorder is destroyed or "startRecording" is not invoked for ' + config.type + ' recorder.'; + + function warningLog() { + if (config.disableLogs === true) { + return; + } + + console.warn(WARNING); + } + + var mediaRecorder; + + var returnObject = { + /** + * This method starts the recording. + * @method + * @memberof RecordRTC + * @instance + * @example + * var recorder = RecordRTC(mediaStream, { + * type: 'video' + * }); + * recorder.startRecording(); + */ + startRecording: startRecording, + + /** + * This method stops the recording. It is strongly recommended to get "blob" or "URI" inside the callback to make sure all recorders finished their job. + * @param {function} callback - Callback to get the recorded blob. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.stopRecording(function() { + * // use either "this" or "recorder" object; both are identical + * video.src = this.toURL(); + * var blob = this.getBlob(); + * }); + */ + stopRecording: stopRecording, + + /** + * This method pauses the recording. You can resume recording using "resumeRecording" method. + * @method + * @memberof RecordRTC + * @instance + * @todo Firefox is unable to pause the recording. Fix it. + * @example + * recorder.pauseRecording(); // pause the recording + * recorder.resumeRecording(); // resume again + */ + pauseRecording: pauseRecording, + + /** + * This method resumes the recording. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.pauseRecording(); // first of all, pause the recording + * recorder.resumeRecording(); // now resume it + */ + resumeRecording: resumeRecording, + + /** + * This method initializes the recording. + * @method + * @memberof RecordRTC + * @instance + * @todo This method should be deprecated. + * @example + * recorder.initRecorder(); + */ + initRecorder: initRecorder, + + /** + * Ask RecordRTC to auto-stop the recording after 5 minutes. + * @method + * @memberof RecordRTC + * @instance + * @example + * var fiveMinutes = 5 * 1000 * 60; + * recorder.setRecordingDuration(fiveMinutes, function() { + * var blob = this.getBlob(); + * video.src = this.toURL(); + * }); + * + * // or otherwise + * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() { + * var blob = this.getBlob(); + * video.src = this.toURL(); + * }); + */ + setRecordingDuration: function(recordingDuration, callback) { + if (typeof recordingDuration === 'undefined') { + throw 'recordingDuration is required.'; + } + + if (typeof recordingDuration !== 'number') { + throw 'recordingDuration must be a number.'; + } + + self.recordingDuration = recordingDuration; + self.onRecordingStopped = callback || function() {}; + + return { + onRecordingStopped: function(callback) { + self.onRecordingStopped = callback; + } + }; + }, + + /** + * This method can be used to clear/reset all the recorded data. + * @method + * @memberof RecordRTC + * @instance + * @todo Figure out the difference between "reset" and "clearRecordedData" methods. + * @example + * recorder.clearRecordedData(); + */ + clearRecordedData: function() { + if (!mediaRecorder) { + warningLog(); + return; + } + + mediaRecorder.clearRecordedData(); + + if (!config.disableLogs) { + console.log('Cleared old recorded data.'); + } + }, + + /** + * Get the recorded blob. Use this method inside the "stopRecording" callback. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.stopRecording(function() { + * var blob = this.getBlob(); + * + * var file = new File([blob], 'filename.webm', { + * type: 'video/webm' + * }); + * + * var formData = new FormData(); + * formData.append('file', file); // upload "File" object rather than a "Blob" + * uploadToServer(formData); + * }); + * @returns {Blob} Returns recorded data as "Blob" object. + */ + getBlob: function() { + if (!mediaRecorder) { + warningLog(); + return; + } + + return mediaRecorder.blob; + }, + + /** + * Get data-URI instead of Blob. + * @param {function} callback - Callback to get the Data-URI. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.stopRecording(function() { + * recorder.getDataURL(function(dataURI) { + * video.src = dataURI; + * }); + * }); + */ + getDataURL: getDataURL, + + /** + * Get virtual/temporary URL. Usage of this URL is limited to current tab. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.stopRecording(function() { + * video.src = this.toURL(); + * }); + * @returns {String} Returns a virtual/temporary URL for the recorded "Blob". + */ + toURL: function() { + if (!mediaRecorder) { + warningLog(); + return; + } + + return URL.createObjectURL(mediaRecorder.blob); + }, + + /** + * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc. + * @method + * @memberof RecordRTC + * @instance + * @example + * var internal = recorder.getInternalRecorder(); + * if(internal instanceof MultiStreamRecorder) { + * internal.addStreams([newAudioStream]); + * internal.resetVideoStreams([screenStream]); + * } + * @returns {Object} Returns internal recording object. + */ + getInternalRecorder: function() { + return mediaRecorder; + }, + + /** + * Invoke save-as dialog to save the recorded blob into your disk. + * @param {string} fileName - Set your own file name. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.stopRecording(function() { + * this.save('file-name'); + * + * // or manually: + * invokeSaveAsDialog(this.getBlob(), 'filename.webm'); + * }); + */ + save: function(fileName) { + if (!mediaRecorder) { + warningLog(); + return; + } + + invokeSaveAsDialog(mediaRecorder.blob, fileName); + }, + + /** + * This method gets a blob from indexed-DB storage. + * @param {function} callback - Callback to get the recorded blob. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.getFromDisk(function(dataURL) { + * video.src = dataURL; + * }); + */ + getFromDisk: function(callback) { + if (!mediaRecorder) { + warningLog(); + return; + } + + RecordRTC.getFromDisk(config.type, callback); + }, + + /** + * This method appends an array of webp images to the recorded video-blob. It takes an "array" object. + * @type {Array.} + * @param {Array} arrayOfWebPImages - Array of webp images. + * @method + * @memberof RecordRTC + * @instance + * @todo This method should be deprecated. + * @example + * var arrayOfWebPImages = []; + * arrayOfWebPImages.push({ + * duration: index, + * image: 'data:image/webp;base64,...' + * }); + * recorder.setAdvertisementArray(arrayOfWebPImages); + */ + setAdvertisementArray: function(arrayOfWebPImages) { + config.advertisement = []; + + var length = arrayOfWebPImages.length; + for (var i = 0; i < length; i++) { + config.advertisement.push({ + duration: i, + image: arrayOfWebPImages[i] + }); + } + }, + + /** + * It is equivalent to "recorder.getBlob()" method. Usage of "getBlob" is recommended, though. + * @property {Blob} blob - Recorded Blob can be accessed using this property. + * @memberof RecordRTC + * @instance + * @readonly + * @example + * recorder.stopRecording(function() { + * var blob = this.blob; + * + * // below one is recommended + * var blob = this.getBlob(); + * }); + */ + blob: null, + + /** + * This works only with {recorderType:StereoAudioRecorder}. Use this property on "stopRecording" to verify the encoder's sample-rates. + * @property {number} bufferSize - Buffer-size used to encode the WAV container + * @memberof RecordRTC + * @instance + * @readonly + * @example + * recorder.stopRecording(function() { + * alert('Recorder used this buffer-size: ' + this.bufferSize); + * }); + */ + bufferSize: 0, + + /** + * This works only with {recorderType:StereoAudioRecorder}. Use this property on "stopRecording" to verify the encoder's sample-rates. + * @property {number} sampleRate - Sample-rates used to encode the WAV container + * @memberof RecordRTC + * @instance + * @readonly + * @example + * recorder.stopRecording(function() { + * alert('Recorder used these sample-rates: ' + this.sampleRate); + * }); + */ + sampleRate: 0, + + /** + * {recorderType:StereoAudioRecorder} returns ArrayBuffer object. + * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome. + * @memberof RecordRTC + * @instance + * @readonly + * @example + * recorder.stopRecording(function() { + * var arrayBuffer = this.buffer; + * alert(arrayBuffer.byteLength); + * }); + */ + buffer: null, + + /** + * This method resets the recorder. So that you can reuse single recorder instance many times. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.reset(); + * recorder.startRecording(); + */ + reset: function() { + if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') { + mediaRecorder.clearRecordedData(); + } + mediaRecorder = null; + setState('inactive'); + self.blob = null; + }, + + /** + * This method is called whenever recorder's state changes. Use this as an "event". + * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive. + * @method + * @memberof RecordRTC + * @instance + * @example + * recorder.onStateChanged = function(state) { + * console.log('Recorder state: ', state); + * }; + */ + onStateChanged: function(state) { + if (!config.disableLogs) { + console.log('Recorder state changed:', state); + } + }, + + /** + * A recorder can have inactive, recording, paused or stopped states. + * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive. + * @memberof RecordRTC + * @static + * @readonly + * @example + * // this looper function will keep you updated about the recorder's states. + * (function looper() { + * document.querySelector('h1').innerHTML = 'Recorder's state is: ' + recorder.state; + * if(recorder.state === 'stopped') return; // ignore+stop + * setTimeout(looper, 1000); // update after every 3-seconds + * })(); + * recorder.startRecording(); + */ + state: 'inactive', + + /** + * Get recorder's readonly state. + * @method + * @memberof RecordRTC + * @example + * var state = recorder.getState(); + * @returns {String} Returns recording state. + */ + getState: function() { + return self.state; + }, + + /** + * Destroy RecordRTC instance. Clear all recorders and objects. + * @method + * @memberof RecordRTC + * @example + * recorder.destroy(); + */ + destroy: function() { + var disableLogsCache = config.disableLogs; + + config = { + disableLogs: true + }; + self.reset(); + setState('destroyed'); + returnObject = self = null; + + if (Storage.AudioContextConstructor) { + Storage.AudioContextConstructor.close(); + Storage.AudioContextConstructor = null; + } + + config.disableLogs = disableLogsCache; + + if (!config.disableLogs) { + console.warn('RecordRTC is destroyed.'); + } + }, + + /** + * RecordRTC version number + * @property {String} version - Release version number. + * @memberof RecordRTC + * @static + * @readonly + * @example + * alert(recorder.version); + */ + version: '5.4.8' + }; + + if (!this) { + self = returnObject; + return returnObject; + } + + // if someone wants to use RecordRTC with the "new" keyword. + for (var prop in returnObject) { + this[prop] = returnObject[prop]; + } + + self = this; + + return returnObject; +} + +RecordRTC.version = '5.4.8'; + +if (typeof module !== 'undefined' /* && !!module.exports*/ ) { + module.exports = RecordRTC; +} + +if (typeof define === 'function' && define.amd) { + define('RecordRTC', [], function() { + return RecordRTC; + }); +} + +RecordRTC.getFromDisk = function(type, callback) { + if (!callback) { + throw 'callback is mandatory.'; + } + + console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!'); + DiskStorage.Fetch(function(dataURL, _type) { + if (type !== 'all' && _type === type + 'Blob' && callback) { + callback(dataURL); + } + + if (type === 'all' && callback) { + callback(dataURL, _type.replace('Blob', '')); + } + }); +}; + +/** + * This method can be used to store recorded blobs into IndexedDB storage. + * @param {object} options - {audio: Blob, video: Blob, gif: Blob} + * @method + * @memberof RecordRTC + * @example + * RecordRTC.writeToDisk({ + * audio: audioBlob, + * video: videoBlob, + * gif : gifBlob + * }); + */ +RecordRTC.writeToDisk = function(options) { + console.log('Writing recorded blob(s) to disk!'); + options = options || {}; + if (options.audio && options.video && options.gif) { + options.audio.getDataURL(function(audioDataURL) { + options.video.getDataURL(function(videoDataURL) { + options.gif.getDataURL(function(gifDataURL) { + DiskStorage.Store({ + audioBlob: audioDataURL, + videoBlob: videoDataURL, + gifBlob: gifDataURL + }); + }); + }); + }); + } else if (options.audio && options.video) { + options.audio.getDataURL(function(audioDataURL) { + options.video.getDataURL(function(videoDataURL) { + DiskStorage.Store({ + audioBlob: audioDataURL, + videoBlob: videoDataURL + }); + }); + }); + } else if (options.audio && options.gif) { + options.audio.getDataURL(function(audioDataURL) { + options.gif.getDataURL(function(gifDataURL) { + DiskStorage.Store({ + audioBlob: audioDataURL, + gifBlob: gifDataURL + }); + }); + }); + } else if (options.video && options.gif) { + options.video.getDataURL(function(videoDataURL) { + options.gif.getDataURL(function(gifDataURL) { + DiskStorage.Store({ + videoBlob: videoDataURL, + gifBlob: gifDataURL + }); + }); + }); + } else if (options.audio) { + options.audio.getDataURL(function(audioDataURL) { + DiskStorage.Store({ + audioBlob: audioDataURL + }); + }); + } else if (options.video) { + options.video.getDataURL(function(videoDataURL) { + DiskStorage.Store({ + videoBlob: videoDataURL + }); + }); + } else if (options.gif) { + options.gif.getDataURL(function(gifDataURL) { + DiskStorage.Store({ + gifBlob: gifDataURL + }); + }); + } +}; + +// __________________________ +// RecordRTC-Configuration.js + +/** + * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}. + * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid "config" object. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef RecordRTCConfiguration + * @class + * @example + * var options = RecordRTCConfiguration(mediaStream, options); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API. + * @param {object} config - {type:"video", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.} + */ + +function RecordRTCConfiguration(mediaStream, config) { + if (!config.recorderType && !config.type) { + if (!!config.audio && !!config.video) { + config.type = 'video'; + } else if (!!config.audio && !config.video) { + config.type = 'audio'; + } + } + + if (config.recorderType && !config.type) { + if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder) { + config.type = 'video'; + } else if (config.recorderType === GifRecorder) { + config.type = 'gif'; + } else if (config.recorderType === StereoAudioRecorder) { + config.type = 'audio'; + } else if (config.recorderType === MediaStreamRecorder) { + if (mediaStream.getAudioTracks().length && mediaStream.getVideoTracks().length) { + config.type = 'video'; + } else if (mediaStream.getAudioTracks().length && !mediaStream.getVideoTracks().length) { + config.type = 'audio'; + } else if (!mediaStream.getAudioTracks().length && mediaStream.getVideoTracks().length) { + config.type = 'audio'; + } else { + // config.type = 'UnKnown'; + } + } + } + + if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) { + if (!config.mimeType) { + config.mimeType = 'video/webm'; + } + + if (!config.type) { + config.type = config.mimeType.split('/')[0]; + } + + if (!config.bitsPerSecond) { + // config.bitsPerSecond = 128000; + } + } + + // consider default type=audio + if (!config.type) { + if (config.mimeType) { + config.type = config.mimeType.split('/')[0]; + } + if (!config.type) { + config.type = 'audio'; + } + } + + return config; +} + +// __________________ +// GetRecorderType.js + +/** + * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}. + * @summary It returns best recorder-type available for your browser. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef GetRecorderType + * @class + * @example + * var RecorderType = GetRecorderType(options); + * var recorder = new RecorderType(options); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API. + * @param {object} config - {type:"video", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.} + */ + +function GetRecorderType(mediaStream, config) { + var recorder; + + // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome + // todo: detect if it is Edge, then auto use: StereoAudioRecorder + if (isChrome || isEdge || isOpera) { + // Media Stream Recording API has not been implemented in chrome yet; + // That's why using WebAudio API to record stereo audio in WAV format + recorder = StereoAudioRecorder; + } + + if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) { + recorder = MediaStreamRecorder; + } + + // video recorder (in WebM format) + if (config.type === 'video' && (isChrome || isOpera)) { + recorder = WhammyRecorder; + } + + // video recorder (in Gif format) + if (config.type === 'gif') { + recorder = GifRecorder; + } + + // html2canvas recording! + if (config.type === 'canvas') { + recorder = CanvasRecorder; + } + + if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) { + if ((mediaStream.getVideoTracks && mediaStream.getVideoTracks().length) || (mediaStream.getAudioTracks && mediaStream.getAudioTracks().length)) { + // audio-only recording + if (config.type === 'audio') { + if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) { + recorder = MediaStreamRecorder; + } + // else recorder = StereoAudioRecorder; + } else { + // video or screen tracks + if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) { + recorder = MediaStreamRecorder; + } + } + } + } + + if (mediaStream instanceof Array && mediaStream.length) { + recorder = MultiStreamRecorder; + } + + if (config.recorderType) { + recorder = config.recorderType; + } + + if (!config.disableLogs && !!recorder && !!recorder.name) { + console.log('Using recorderType:', recorder.name || recorder.constructor.name); + } + + return recorder; +} + +// _____________ +// MRecordRTC.js + +/** + * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API. + * @summary MRecordRTC stands for "Multiple-RecordRTC". + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef MRecordRTC + * @class + * @example + * var recorder = new MRecordRTC(); + * recorder.addStream(MediaStream); + * recorder.mediaType = { + * audio: true, // or StereoAudioRecorder or MediaStreamRecorder + * video: true, // or WhammyRecorder or MediaStreamRecorder + * gif: true // or GifRecorder + * }; + * // mimeType is optional and should be set only in advance cases. + * recorder.mimeType = { + * audio: 'audio/wav', + * video: 'video/webm', + * gif: 'image/gif' + * }; + * recorder.startRecording(); + * @see For further information: + * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API. + * @requires {@link RecordRTC} + */ + +function MRecordRTC(mediaStream) { + + /** + * This method attaches MediaStream object to {@link MRecordRTC}. + * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API. + * @method + * @memberof MRecordRTC + * @example + * recorder.addStream(MediaStream); + */ + this.addStream = function(_mediaStream) { + if (_mediaStream) { + mediaStream = _mediaStream; + } + }; + + /** + * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas. + * @property {object} mediaType - {audio: true, video: true, gif: true} + * @memberof MRecordRTC + * @example + * var recorder = new MRecordRTC(); + * recorder.mediaType = { + * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder + * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder + * gif : true // TRUE or GifRecorder + * }; + */ + this.mediaType = { + audio: true, + video: true + }; + + /** + * This method starts recording. + * @method + * @memberof MRecordRTC + * @example + * recorder.startRecording(); + */ + this.startRecording = function() { + var mediaType = this.mediaType; + var recorderType; + var mimeType = this.mimeType || { + audio: null, + video: null, + gif: null + }; + + if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && mediaStream.getAudioTracks && !mediaStream.getAudioTracks().length) { + mediaType.audio = false; + } + + if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && mediaStream.getVideoTracks && !mediaStream.getVideoTracks().length) { + mediaType.video = false; + } + + if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && mediaStream.getVideoTracks && !mediaStream.getVideoTracks().length) { + mediaType.gif = false; + } + + if (!mediaType.audio && !mediaType.video && !mediaType.gif) { + throw 'MediaStream must have either audio or video tracks.'; + } + + if (!!mediaType.audio) { + recorderType = null; + if (typeof mediaType.audio === 'function') { + recorderType = mediaType.audio; + } + + this.audioRecorder = new RecordRTC(mediaStream, { + type: 'audio', + bufferSize: this.bufferSize, + sampleRate: this.sampleRate, + numberOfAudioChannels: this.numberOfAudioChannels || 2, + disableLogs: this.disableLogs, + recorderType: recorderType, + mimeType: mimeType.audio, + timeSlice: this.timeSlice, + onTimeStamp: this.onTimeStamp + }); + + if (!mediaType.video) { + this.audioRecorder.startRecording(); + } + } + + if (!!mediaType.video) { + recorderType = null; + if (typeof mediaType.video === 'function') { + recorderType = mediaType.video; + } + + var newStream = mediaStream; + + if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') { + var videoTrack = mediaStream.getVideoTracks()[0]; + + if (!!navigator.mozGetUserMedia) { + newStream = new MediaStream(); + newStream.addTrack(videoTrack); + + if (recorderType && recorderType === WhammyRecorder) { + // Firefox does NOT support webp-encoding yet + recorderType = MediaStreamRecorder; + } + } else { + newStream = new MediaStream([videoTrack]); + } + } + + this.videoRecorder = new RecordRTC(newStream, { + type: 'video', + video: this.video, + canvas: this.canvas, + frameInterval: this.frameInterval || 10, + disableLogs: this.disableLogs, + recorderType: recorderType, + mimeType: mimeType.video, + timeSlice: this.timeSlice, + onTimeStamp: this.onTimeStamp + }); + + if (!mediaType.audio) { + this.videoRecorder.startRecording(); + } + } + + if (!!mediaType.audio && !!mediaType.video) { + var self = this; + + // this line prevents StereoAudioRecorder + // todo: fix it + if (isMediaRecorderCompatible() /* && !this.audioRecorder */ ) { + self.audioRecorder = null; + self.videoRecorder.startRecording(); + } else { + self.videoRecorder.initRecorder(function() { + self.audioRecorder.initRecorder(function() { + // Both recorders are ready to record things accurately + self.videoRecorder.startRecording(); + self.audioRecorder.startRecording(); + }); + }); + } + } + + if (!!mediaType.gif) { + recorderType = null; + if (typeof mediaType.gif === 'function') { + recorderType = mediaType.gif; + } + this.gifRecorder = new RecordRTC(mediaStream, { + type: 'gif', + frameRate: this.frameRate || 200, + quality: this.quality || 10, + disableLogs: this.disableLogs, + recorderType: recorderType, + mimeType: mimeType.gif + }); + this.gifRecorder.startRecording(); + } + }; + + /** + * This method stops recording. + * @param {function} callback - Callback function is invoked when all encoders finished their jobs. + * @method + * @memberof MRecordRTC + * @example + * recorder.stopRecording(function(recording){ + * var audioBlob = recording.audio; + * var videoBlob = recording.video; + * var gifBlob = recording.gif; + * }); + */ + this.stopRecording = function(callback) { + callback = callback || function() {}; + + if (this.audioRecorder) { + this.audioRecorder.stopRecording(function(blobURL) { + callback(blobURL, 'audio'); + }); + } + + if (this.videoRecorder) { + this.videoRecorder.stopRecording(function(blobURL) { + callback(blobURL, 'video'); + }); + } + + if (this.gifRecorder) { + this.gifRecorder.stopRecording(function(blobURL) { + callback(blobURL, 'gif'); + }); + } + }; + + /** + * This method pauses recording. + * @method + * @memberof MRecordRTC + * @example + * recorder.pauseRecording(); + */ + this.pauseRecording = function() { + if (this.audioRecorder) { + this.audioRecorder.pauseRecording(); + } + + if (this.videoRecorder) { + this.videoRecorder.pauseRecording(); + } + + if (this.gifRecorder) { + this.gifRecorder.pauseRecording(); + } + }; + + /** + * This method resumes recording. + * @method + * @memberof MRecordRTC + * @example + * recorder.resumeRecording(); + */ + this.resumeRecording = function() { + if (this.audioRecorder) { + this.audioRecorder.resumeRecording(); + } + + if (this.videoRecorder) { + this.videoRecorder.resumeRecording(); + } + + if (this.gifRecorder) { + this.gifRecorder.resumeRecording(); + } + }; + + /** + * This method can be used to manually get all recorded blobs. + * @param {function} callback - All recorded blobs are passed back to the "callback" function. + * @method + * @memberof MRecordRTC + * @example + * recorder.getBlob(function(recording){ + * var audioBlob = recording.audio; + * var videoBlob = recording.video; + * var gifBlob = recording.gif; + * }); + * // or + * var audioBlob = recorder.getBlob().audio; + * var videoBlob = recorder.getBlob().video; + */ + this.getBlob = function(callback) { + var output = {}; + + if (this.audioRecorder) { + output.audio = this.audioRecorder.getBlob(); + } + + if (this.videoRecorder) { + output.video = this.videoRecorder.getBlob(); + } + + if (this.gifRecorder) { + output.gif = this.gifRecorder.getBlob(); + } + + if (callback) { + callback(output); + } + + return output; + }; + + /** + * Destroy all recorder instances. + * @method + * @memberof MRecordRTC + * @example + * recorder.destroy(); + */ + this.destroy = function() { + if (this.audioRecorder) { + this.audioRecorder.destroy(); + this.audioRecorder = null; + } + + if (this.videoRecorder) { + this.videoRecorder.destroy(); + this.videoRecorder = null; + } + + if (this.gifRecorder) { + this.gifRecorder.destroy(); + this.gifRecorder = null; + } + }; + + /** + * This method can be used to manually get all recorded blobs' DataURLs. + * @param {function} callback - All recorded blobs' DataURLs are passed back to the "callback" function. + * @method + * @memberof MRecordRTC + * @example + * recorder.getDataURL(function(recording){ + * var audioDataURL = recording.audio; + * var videoDataURL = recording.video; + * var gifDataURL = recording.gif; + * }); + */ + this.getDataURL = function(callback) { + this.getBlob(function(blob) { + if (blob.audio && blob.video) { + getDataURL(blob.audio, function(_audioDataURL) { + getDataURL(blob.video, function(_videoDataURL) { + callback({ + audio: _audioDataURL, + video: _videoDataURL + }); + }); + }); + } else if (blob.audio) { + getDataURL(blob.audio, function(_audioDataURL) { + callback({ + audio: _audioDataURL + }); + }); + } else if (blob.video) { + getDataURL(blob.video, function(_videoDataURL) { + callback({ + video: _videoDataURL + }); + }); + } + }); + + function getDataURL(blob, callback00) { + if (typeof Worker !== 'undefined') { + var webWorker = processInWebWorker(function readFile(_blob) { + postMessage(new FileReaderSync().readAsDataURL(_blob)); + }); + + webWorker.onmessage = function(event) { + callback00(event.data); + }; + + webWorker.postMessage(blob); + } else { + var reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onload = function(event) { + callback00(event.target.result); + }; + } + } + + function processInWebWorker(_function) { + var blob = URL.createObjectURL(new Blob([_function.toString(), + 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}' + ], { + type: 'application/javascript' + })); + + var worker = new Worker(blob); + var url; + if (typeof URL !== 'undefined') { + url = URL; + } else if (typeof webkitURL !== 'undefined') { + url = webkitURL; + } else { + throw 'Neither URL nor webkitURL detected.'; + } + url.revokeObjectURL(blob); + return worker; + } + }; + + /** + * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage. + * @method + * @memberof MRecordRTC + * @example + * recorder.writeToDisk(); + */ + this.writeToDisk = function() { + RecordRTC.writeToDisk({ + audio: this.audioRecorder, + video: this.videoRecorder, + gif: this.gifRecorder + }); + }; + + /** + * This method can be used to invoke a save-as dialog for all recorded blobs. + * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'} + * @method + * @memberof MRecordRTC + * @example + * recorder.save({ + * audio: 'audio-file-name', + * video: 'video-file-name', + * gif : 'gif-file-name' + * }); + */ + this.save = function(args) { + args = args || { + audio: true, + video: true, + gif: true + }; + + if (!!args.audio && this.audioRecorder) { + this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : ''); + } + + if (!!args.video && this.videoRecorder) { + this.videoRecorder.save(typeof args.video === 'string' ? args.video : ''); + } + if (!!args.gif && this.gifRecorder) { + this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : ''); + } + }; +} + +/** + * This method can be used to get all recorded blobs from IndexedDB storage. + * @param {string} type - 'all' or 'audio' or 'video' or 'gif' + * @param {function} callback - Callback function to get all stored blobs. + * @method + * @memberof MRecordRTC + * @example + * MRecordRTC.getFromDisk('all', function(dataURL, type){ + * if(type === 'audio') { } + * if(type === 'video') { } + * if(type === 'gif') { } + * }); + */ +MRecordRTC.getFromDisk = RecordRTC.getFromDisk; + +/** + * This method can be used to store recorded blobs into IndexedDB storage. + * @param {object} options - {audio: Blob, video: Blob, gif: Blob} + * @method + * @memberof MRecordRTC + * @example + * MRecordRTC.writeToDisk({ + * audio: audioBlob, + * video: videoBlob, + * gif : gifBlob + * }); + */ +MRecordRTC.writeToDisk = RecordRTC.writeToDisk; + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.MRecordRTC = MRecordRTC; +} + +var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45'; + +(function(that) { + if (!that) { + return; + } + + if (typeof window !== 'undefined') { + return; + } + + if (typeof global === 'undefined') { + return; + } + + global.navigator = { + userAgent: browserFakeUserAgent, + getUserMedia: function() {} + }; + + if (!global.console) { + global.console = {}; + } + + if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') { + global.console.error = global.console.log = global.console.log || function() { + console.log(arguments); + }; + } + + if (typeof document === 'undefined') { + /*global document:true */ + that.document = {}; + + document.createElement = document.captureStream = document.mozCaptureStream = function() { + var obj = { + getContext: function() { + return obj; + }, + play: function() {}, + pause: function() {}, + drawImage: function() {}, + toDataURL: function() { + return ''; + } + }; + return obj; + }; + + that.HTMLVideoElement = function() {}; + } + + if (typeof location === 'undefined') { + /*global location:true */ + that.location = { + protocol: 'file:', + href: '', + hash: '' + }; + } + + if (typeof screen === 'undefined') { + /*global screen:true */ + that.screen = { + width: 0, + height: 0 + }; + } + + if (typeof URL === 'undefined') { + /*global screen:true */ + that.URL = { + createObjectURL: function() { + return ''; + }, + revokeObjectURL: function() { + return ''; + } + }; + } + + /*global window:true */ + that.window = global; +})(typeof global !== 'undefined' ? global : null); + +// _____________________________ +// Cross-Browser-Declarations.js + +// animation-frame used in WebM recording + +/*jshint -W079 */ +var requestAnimationFrame = window.requestAnimationFrame; +if (typeof requestAnimationFrame === 'undefined') { + if (typeof webkitRequestAnimationFrame !== 'undefined') { + /*global requestAnimationFrame:true */ + requestAnimationFrame = webkitRequestAnimationFrame; + } else if (typeof mozRequestAnimationFrame !== 'undefined') { + /*global requestAnimationFrame:true */ + requestAnimationFrame = mozRequestAnimationFrame; + } else if (typeof msRequestAnimationFrame !== 'undefined') { + /*global requestAnimationFrame:true */ + requestAnimationFrame = msRequestAnimationFrame; + } else if (typeof requestAnimationFrame === 'undefined') { + // via: https://gist.github.com/paulirish/1579671 + var lastTime = 0; + + /*global requestAnimationFrame:true */ + requestAnimationFrame = function(callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = setTimeout(function() { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } +} + +/*jshint -W079 */ +var cancelAnimationFrame = window.cancelAnimationFrame; +if (typeof cancelAnimationFrame === 'undefined') { + if (typeof webkitCancelAnimationFrame !== 'undefined') { + /*global cancelAnimationFrame:true */ + cancelAnimationFrame = webkitCancelAnimationFrame; + } else if (typeof mozCancelAnimationFrame !== 'undefined') { + /*global cancelAnimationFrame:true */ + cancelAnimationFrame = mozCancelAnimationFrame; + } else if (typeof msCancelAnimationFrame !== 'undefined') { + /*global cancelAnimationFrame:true */ + cancelAnimationFrame = msCancelAnimationFrame; + } else if (typeof cancelAnimationFrame === 'undefined') { + /*global cancelAnimationFrame:true */ + cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + } +} + +// WebAudio API representer +var AudioContext = window.AudioContext; + +if (typeof AudioContext === 'undefined') { + if (typeof webkitAudioContext !== 'undefined') { + /*global AudioContext:true */ + AudioContext = webkitAudioContext; + } + + if (typeof mozAudioContext !== 'undefined') { + /*global AudioContext:true */ + AudioContext = mozAudioContext; + } +} + +/*jshint -W079 */ +var URL = window.URL; + +if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') { + /*global URL:true */ + URL = webkitURL; +} + +if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator? + if (typeof navigator.webkitGetUserMedia !== 'undefined') { + navigator.getUserMedia = navigator.webkitGetUserMedia; + } + + if (typeof navigator.mozGetUserMedia !== 'undefined') { + navigator.getUserMedia = navigator.mozGetUserMedia; + } +} + +var isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob); +var isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1; +var isSafari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1; +var isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || isSafari; + +var MediaStream = window.MediaStream; + +if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') { + MediaStream = webkitMediaStream; +} + +/*global MediaStream:true */ +if (typeof MediaStream !== 'undefined') { + if (!('getVideoTracks' in MediaStream.prototype)) { + MediaStream.prototype.getVideoTracks = function() { + if (!this.getTracks) { + return []; + } + + var tracks = []; + this.getTracks().forEach(function(track) { + if (track.kind.toString().indexOf('video') !== -1) { + tracks.push(track); + } + }); + return tracks; + }; + + MediaStream.prototype.getAudioTracks = function() { + if (!this.getTracks) { + return []; + } + + var tracks = []; + this.getTracks().forEach(function(track) { + if (track.kind.toString().indexOf('audio') !== -1) { + tracks.push(track); + } + }); + return tracks; + }; + } + + // override "stop" method for all browsers + if (typeof MediaStream.prototype.stop === 'undefined') { + MediaStream.prototype.stop = function() { + this.getTracks().forEach(function(track) { + track.stop(); + }); + }; + } +} + +// below function via: http://goo.gl/B3ae8c +/** + * @param {number} bytes - Pass bytes and get formafted string. + * @returns {string} - formafted string + * @example + * bytesToSize(1024*1024*5) === '5 GB' + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + */ +function bytesToSize(bytes) { + var k = 1000; + var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + if (bytes === 0) { + return '0 Bytes'; + } + var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10); + return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i]; +} + +/** + * @param {Blob} file - File or Blob object. This parameter is required. + * @param {string} fileName - Optional file name e.g. "Recorded-Video.webm" + * @example + * invokeSaveAsDialog(blob or file, [optional] fileName); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + */ +function invokeSaveAsDialog(file, fileName) { + if (!file) { + throw 'Blob object is required.'; + } + + if (!file.type) { + try { + file.type = 'video/webm'; + } catch (e) {} + } + + var fileExtension = (file.type || 'video/webm').split('/')[1]; + + if (fileName && fileName.indexOf('.') !== -1) { + var splitted = fileName.split('.'); + fileName = splitted[0]; + fileExtension = splitted[1]; + } + + var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension; + + if (typeof navigator.msSaveOrOpenBlob !== 'undefined') { + return navigator.msSaveOrOpenBlob(file, fileFullName); + } else if (typeof navigator.msSaveBlob !== 'undefined') { + return navigator.msSaveBlob(file, fileFullName); + } + + var hyperlink = document.createElement('a'); + hyperlink.href = URL.createObjectURL(file); + hyperlink.download = fileFullName; + + hyperlink.style = 'display:none;opacity:0;color:transparent;'; + (document.body || document.documentElement).appendChild(hyperlink); + + if (typeof hyperlink.click === 'function') { + hyperlink.click(); + } else { + hyperlink.target = '_blank'; + hyperlink.dispatchEvent(new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: true + })); + } + + URL.revokeObjectURL(hyperlink.href); +} + +/** + * from: https://github.com/cheton/is-electron/blob/master/index.js + **/ +function isElectron() { + // Renderer process + if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { + return true; + } + + // Main process + if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) { + return true; + } + + // Detect the user agent when the `nodeIntegration` option is set to true + if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) { + return true; + } + + return false; +} + +function setSrcObject(stream, element, ignoreCreateObjectURL) { + if ('createObjectURL' in URL && !ignoreCreateObjectURL) { + try { + element.src = URL.createObjectURL(stream); + } catch (e) { + setSrcObject(stream, element, true); + return; + } + } else if ('srcObject' in element) { + element.srcObject = stream; + } else if ('mozSrcObject' in element) { + element.mozSrcObject = stream; + } else { + alert('createObjectURL/srcObject both are not supported.'); + } +} + +// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129 +// Storage.js + +/** + * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. "new AudioContext". + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @example + * Storage.AudioContext === webkitAudioContext + * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object. + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + */ + +var Storage = {}; + +if (typeof AudioContext !== 'undefined') { + Storage.AudioContext = AudioContext; +} else if (typeof webkitAudioContext !== 'undefined') { + Storage.AudioContext = webkitAudioContext; +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.Storage = Storage; +} + +function isMediaRecorderCompatible() { + var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; + var isChrome = (!!window.chrome && !isOpera) || isElectron(); + var isFirefox = typeof window.InstallTrigger !== 'undefined'; + + if (isFirefox) { + return true; + } + + var nVer = navigator.appVersion; + var nAgt = navigator.userAgent; + var fullVersion = '' + parseFloat(navigator.appVersion); + var majorVersion = parseInt(navigator.appVersion, 10); + var nameOffset, verOffset, ix; + + if (isChrome || isOpera) { + verOffset = nAgt.indexOf('Chrome'); + fullVersion = nAgt.substring(verOffset + 7); + } + + // trim the fullVersion string at semicolon/space if present + if ((ix = fullVersion.indexOf(';')) !== -1) { + fullVersion = fullVersion.substring(0, ix); + } + + if ((ix = fullVersion.indexOf(' ')) !== -1) { + fullVersion = fullVersion.substring(0, ix); + } + + majorVersion = parseInt('' + fullVersion, 10); + + if (isNaN(majorVersion)) { + fullVersion = '' + parseFloat(navigator.appVersion); + majorVersion = parseInt(navigator.appVersion, 10); + } + + return majorVersion >= 49; +} + +// ______________________ +// MediaStreamRecorder.js + +/** + * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox. + * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link https://github.com/muaz-khan|Muaz Khan} + * @typedef MediaStreamRecorder + * @class + * @example + * var config = { + * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis + * audioBitsPerSecond : 256 * 8 * 1024, + * videoBitsPerSecond : 256 * 8 * 1024, + * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two + * checkForInactiveTracks: true, + * timeSlice: 1000, // concatenate intervals based blobs + * ondataavailable: function() {} // get intervals based blobs + * } + * var recorder = new MediaStreamRecorder(mediaStream, config); + * recorder.record(); + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * + * // or + * var blob = recorder.blob; + * }); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API. + * @param {object} config - {disableLogs:true, initCallback: function, mimeType: "video/webm", timeSlice: 1000} + * @throws Will throw an error if first argument "MediaStream" is missing. Also throws error if "MediaRecorder API" are not supported by the browser. + */ + +function MediaStreamRecorder(mediaStream, config) { + var self = this; + + if (typeof mediaStream === 'undefined') { + throw 'First argument "MediaStream" is required.'; + } + + if (typeof MediaRecorder === 'undefined') { + throw 'Your browser does not supports Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.'; + } + + config = config || { + // bitsPerSecond: 256 * 8 * 1024, + mimeType: 'video/webm' + }; + + if (config.type === 'audio') { + if (mediaStream.getVideoTracks().length && mediaStream.getAudioTracks().length) { + var stream; + if (!!navigator.mozGetUserMedia) { + stream = new MediaStream(); + stream.addTrack(mediaStream.getAudioTracks()[0]); + } else { + // webkitMediaStream + stream = new MediaStream(mediaStream.getAudioTracks()); + } + mediaStream = stream; + } + + if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) { + config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg'; + } + + if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) { + // forcing better codecs on Firefox (via #166) + config.mimeType = 'audio/ogg'; + } + } + + var arrayOfBlobs = []; + + /** + * This method returns array of blobs. Use only with "timeSlice". Its useful to preview recording anytime, without using the "stop" method. + * @method + * @memberof MediaStreamRecorder + * @example + * var arrayOfBlobs = recorder.getArrayOfBlobs(); + * @returns {Array} Returns array of recorded blobs. + */ + this.getArrayOfBlobs = function() { + return arrayOfBlobs; + }; + + /** + * This method records MediaStream. + * @method + * @memberof MediaStreamRecorder + * @example + * recorder.record(); + */ + this.record = function() { + // set defaults + self.blob = null; + self.clearRecordedData(); + self.timestamps = []; + allStates = []; + arrayOfBlobs = []; + + var recorderHints = config; + + if (!config.disableLogs) { + console.log('Passing following config over MediaRecorder API.', recorderHints); + } + + if (mediaRecorder) { + // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page. + mediaRecorder = null; + } + + if (isChrome && !isMediaRecorderCompatible()) { + // to support video-only recording on stable + recorderHints = 'video/vp8'; + } + + if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) { + if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) { + if (!config.disableLogs) { + console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType); + } + + recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm'; + } + } + + // using MediaRecorder API here + try { + mediaRecorder = new MediaRecorder(mediaStream, recorderHints); + + // reset + config.mimeType = recorderHints.mimeType; + } catch (e) { + // chrome-based fallback + mediaRecorder = new MediaRecorder(mediaStream); + } + + // old hack? + if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) { + if (!config.disableLogs) { + console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType); + } + } + + // Dispatching OnDataAvailable Handler + mediaRecorder.ondataavailable = function(e) { + if (e.data) { + allStates.push('ondataavailable: ' + bytesToSize(e.data.size)); + } + + if (typeof config.timeSlice === 'number') { + if (e.data && e.data.size && e.data.size > 100) { + arrayOfBlobs.push(e.data); + updateTimeStamp(); + + if (typeof config.ondataavailable === 'function') { + // intervals based blobs + var blob = config.getNativeBlob ? e.data : new Blob([e.data], { + type: getMimeType(recorderHints) + }); + config.ondataavailable(blob); + } + } + return; + } + + if (!e.data || !e.data.size || e.data.size < 100 || self.blob) { + // make sure that stopRecording always getting fired + // even if there is invalid data + if (self.recordingCallback) { + self.recordingCallback(new Blob([], { + type: getMimeType(recorderHints) + })); + self.recordingCallback = null; + } + return; + } + + self.blob = config.getNativeBlob ? e.data : new Blob([e.data], { + type: getMimeType(recorderHints) + }); + + if (self.recordingCallback) { + self.recordingCallback(self.blob); + self.recordingCallback = null; + } + }; + + mediaRecorder.onstart = function() { + allStates.push('started'); + }; + + mediaRecorder.onpause = function() { + allStates.push('paused'); + }; + + mediaRecorder.onresume = function() { + allStates.push('resumed'); + }; + + mediaRecorder.onstop = function() { + allStates.push('stopped'); + }; + + mediaRecorder.onerror = function(error) { + if (!error) { + return; + } + + if (!error.name) { + error.name = 'UnknownError'; + } + + allStates.push('error: ' + error); + + if (!config.disableLogs) { + // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary + if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) { + console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error); + } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) { + console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error); + } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) { + console.error('MediaRecorder security error', error); + } + + // older code below + else if (error.name === 'OutOfMemory') { + console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error); + } else if (error.name === 'IllegalStreamModification') { + console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error); + } else if (error.name === 'OtherRecordingError') { + console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error); + } else if (error.name === 'GenericError') { + console.error('The UA cannot provide the codec or recording option that has been requested.', error); + } else { + console.error('MediaRecorder Error', error); + } + } + + (function(looper) { + if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') { + delete config.timeslice; + + // 10 minutes, enough? + mediaRecorder.start(10 * 60 * 1000); + return; + } + + setTimeout(looper, 1000); + })(); + + if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') { + mediaRecorder.stop(); + } + }; + + if (typeof config.timeSlice === 'number') { + updateTimeStamp(); + mediaRecorder.start(config.timeSlice); + } else { + // default is 60 minutes; enough? + // use config => {timeSlice: 1000} otherwise + + mediaRecorder.start(3.6e+6); + } + + if (config.initCallback) { + config.initCallback(); // old code + } + }; + + /** + * @property {Array} timestamps - Array of time stamps + * @memberof MediaStreamRecorder + * @example + * console.log(recorder.timestamps); + */ + this.timestamps = []; + + function updateTimeStamp() { + self.timestamps.push(new Date().getTime()); + + if (typeof config.onTimeStamp === 'function') { + config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps); + } + } + + function getMimeType(secondObject) { + if (mediaRecorder && mediaRecorder.mimeType) { + return mediaRecorder.mimeType; + } + + return secondObject.mimeType || 'video/webm'; + } + + /** + * This method stops recording MediaStream. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof MediaStreamRecorder + * @example + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + */ + this.stop = function(callback) { + callback = callback || function() {}; + + self.manuallyStopped = true; // used inside the mediaRecorder.onerror + + if (!mediaRecorder) { + return; + } + + this.recordingCallback = callback; + + if (mediaRecorder.state === 'recording') { + mediaRecorder.stop(); + } + + if (typeof config.timeSlice === 'number') { + setTimeout(function() { + self.blob = new Blob(arrayOfBlobs, { + type: getMimeType(config) + }); + + self.recordingCallback(self.blob); + }, 100); + } + }; + + /** + * This method pauses the recording process. + * @method + * @memberof MediaStreamRecorder + * @example + * recorder.pause(); + */ + this.pause = function() { + if (!mediaRecorder) { + return; + } + + if (mediaRecorder.state === 'recording') { + mediaRecorder.pause(); + } + }; + + /** + * This method resumes the recording process. + * @method + * @memberof MediaStreamRecorder + * @example + * recorder.resume(); + */ + this.resume = function() { + if (!mediaRecorder) { + return; + } + + if (mediaRecorder.state === 'paused') { + mediaRecorder.resume(); + } + }; + + /** + * This method resets currently recorded data. + * @method + * @memberof MediaStreamRecorder + * @example + * recorder.clearRecordedData(); + */ + this.clearRecordedData = function() { + if (mediaRecorder && mediaRecorder.state === 'recording') { + self.stop(clearRecordedDataCB); + } + + clearRecordedDataCB(); + }; + + function clearRecordedDataCB() { + arrayOfBlobs = []; + mediaRecorder = null; + self.timestamps = []; + } + + // Reference to "MediaRecorder" object + var mediaRecorder; + + /** + * Access to native MediaRecorder API + * @method + * @memberof MediaStreamRecorder + * @instance + * @example + * var internal = recorder.getInternalRecorder(); + * internal.ondataavailable = function() {}; // override + * internal.stream, internal.onpause, internal.onstop, etc. + * @returns {Object} Returns internal recording object. + */ + this.getInternalRecorder = function() { + return mediaRecorder; + }; + + function isMediaStreamActive() { + if ('active' in mediaStream) { + if (!mediaStream.active) { + return false; + } + } else if ('ended' in mediaStream) { // old hack + if (mediaStream.ended) { + return false; + } + } + return true; + } + + /** + * @property {Blob} blob - Recorded data as "Blob" object. + * @memberof MediaStreamRecorder + * @example + * recorder.stop(function() { + * var blob = recorder.blob; + * }); + */ + this.blob = null; + + + /** + * Get MediaRecorder readonly state. + * @method + * @memberof MediaStreamRecorder + * @example + * var state = recorder.getState(); + * @returns {String} Returns recording state. + */ + this.getState = function() { + if (!mediaRecorder) { + return 'inactive'; + } + + return mediaRecorder.state || 'inactive'; + }; + + // list of all recording states + var allStates = []; + + /** + * Get MediaRecorder all recording states. + * @method + * @memberof MediaStreamRecorder + * @example + * var state = recorder.getAllStates(); + * @returns {Array} Returns all recording states + */ + this.getAllStates = function() { + return allStates; + }; + + // if any Track within the MediaStream is muted or not enabled at any time, + // the browser will only record black frames + // or silence since that is the content produced by the Track + // so we need to stopRecording as soon as any single track ends. + if (typeof config.checkForInactiveTracks === 'undefined') { + config.checkForInactiveTracks = false; // disable to minimize CPU usage + } + + var self = this; + + // this method checks if media stream is stopped + // or if any track is ended. + (function looper() { + if (!mediaRecorder || config.checkForInactiveTracks === false) { + return; + } + + if (isMediaStreamActive() === false) { + if (!config.disableLogs) { + console.log('MediaStream seems stopped.'); + } + self.stop(); + return; + } + + setTimeout(looper, 1000); // check every second + })(); + + // for debugging + this.name = 'MediaStreamRecorder'; + this.toString = function() { + return this.name; + }; +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.MediaStreamRecorder = MediaStreamRecorder; +} + +// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js +// https://github.com/mattdiamond/Recorderjs#license-mit +// ______________________ +// StereoAudioRecorder.js + +/** + * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring "stereo" audio-recording in chrome. + * @summary JavaScript standalone object for stereo audio recording. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef StereoAudioRecorder + * @class + * @example + * var recorder = new StereoAudioRecorder(MediaStream, { + * sampleRate: 44100, + * bufferSize: 4096 + * }); + * recorder.record(); + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API. + * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.} + */ + +function StereoAudioRecorder(mediaStream, config) { + if (!mediaStream.getAudioTracks().length) { + throw 'Your stream has no audio tracks.'; + } + + config = config || {}; + + var self = this; + + // variables + var leftchannel = []; + var rightchannel = []; + var recording = false; + var recordingLength = 0; + var jsAudioNode; + + var numberOfAudioChannels = 2; + + /** + * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182 + * @property {number} desiredSampRate - Desired Bits per sample * 1000 + * @memberof StereoAudioRecorder + * @instance + * @example + * var recorder = StereoAudioRecorder(mediaStream, { + * desiredSampRate: 16 * 1000 // bits-per-sample * 1000 + * }); + */ + var desiredSampRate = config.desiredSampRate; + + // backward compatibility + if (config.leftChannel === true) { + numberOfAudioChannels = 1; + } + + if (config.numberOfAudioChannels === 1) { + numberOfAudioChannels = 1; + } + + if (!numberOfAudioChannels || numberOfAudioChannels < 1) { + numberOfAudioChannels = 2; + } + + if (!config.disableLogs) { + console.log('StereoAudioRecorder is set to record number of channels: ', numberOfAudioChannels); + } + + // if any Track within the MediaStream is muted or not enabled at any time, + // the browser will only record black frames + // or silence since that is the content produced by the Track + // so we need to stopRecording as soon as any single track ends. + if (typeof config.checkForInactiveTracks === 'undefined') { + config.checkForInactiveTracks = true; + } + + function isMediaStreamActive() { + if (config.checkForInactiveTracks === false) { + // always return "true" + return true; + } + + if ('active' in mediaStream) { + if (!mediaStream.active) { + return false; + } + } else if ('ended' in mediaStream) { // old hack + if (mediaStream.ended) { + return false; + } + } + return true; + } + + /** + * This method records MediaStream. + * @method + * @memberof StereoAudioRecorder + * @example + * recorder.record(); + */ + this.record = function() { + if (isMediaStreamActive() === false) { + throw 'Please make sure MediaStream is active.'; + } + + resetVariables(); + + isAudioProcessStarted = isPaused = false; + recording = true; + + if (typeof config.timeSlice !== 'undefined') { + looper(); + } + }; + + function mergeLeftRightBuffers(config, callback) { + function mergeAudioBuffers(config, cb) { + var numberOfAudioChannels = config.numberOfAudioChannels; + + // todo: "slice(0)" --- is it causes loop? Should be removed? + var leftBuffers = config.leftBuffers.slice(0); + var rightBuffers = config.rightBuffers.slice(0); + var sampleRate = config.sampleRate; + var internalInterleavedLength = config.internalInterleavedLength; + var desiredSampRate = config.desiredSampRate; + + if (numberOfAudioChannels === 2) { + leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength); + rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength); + + if (desiredSampRate) { + leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate); + rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate); + } + } + + if (numberOfAudioChannels === 1) { + leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength); + + if (desiredSampRate) { + leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate); + } + } + + // set sample rate as desired sample rate + if (desiredSampRate) { + sampleRate = desiredSampRate; + } + + // for changing the sampling rate, reference: + // http://stackoverflow.com/a/28977136/552182 + function interpolateArray(data, newSampleRate, oldSampleRate) { + var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate)); + var newData = []; + var springFactor = Number((data.length - 1) / (fitCount - 1)); + newData[0] = data[0]; + for (var i = 1; i < fitCount - 1; i++) { + var tmp = i * springFactor; + var before = Number(Math.floor(tmp)).toFixed(); + var after = Number(Math.ceil(tmp)).toFixed(); + var atPoint = tmp - before; + newData[i] = linearInterpolate(data[before], data[after], atPoint); + } + newData[fitCount - 1] = data[data.length - 1]; + return newData; + } + + function linearInterpolate(before, after, atPoint) { + return before + (after - before) * atPoint; + } + + function mergeBuffers(channelBuffer, rLength) { + var result = new Float64Array(rLength); + var offset = 0; + var lng = channelBuffer.length; + + for (var i = 0; i < lng; i++) { + var buffer = channelBuffer[i]; + result.set(buffer, offset); + offset += buffer.length; + } + + return result; + } + + function interleave(leftChannel, rightChannel) { + var length = leftChannel.length + rightChannel.length; + + var result = new Float64Array(length); + + var inputIndex = 0; + + for (var index = 0; index < length;) { + result[index++] = leftChannel[inputIndex]; + result[index++] = rightChannel[inputIndex]; + inputIndex++; + } + return result; + } + + function writeUTFBytes(view, offset, string) { + var lng = string.length; + for (var i = 0; i < lng; i++) { + view.setUint8(offset + i, string.charCodeAt(i)); + } + } + + // interleave both channels together + var interleaved; + + if (numberOfAudioChannels === 2) { + interleaved = interleave(leftBuffers, rightBuffers); + } + + if (numberOfAudioChannels === 1) { + interleaved = leftBuffers; + } + + var interleavedLength = interleaved.length; + + // create wav file + var resultingBufferLength = 44 + interleavedLength * 2; + + var buffer = new ArrayBuffer(resultingBufferLength); + + var view = new DataView(buffer); + + // RIFF chunk descriptor/identifier + writeUTFBytes(view, 0, 'RIFF'); + + // RIFF chunk length + view.setUint32(4, 44 + interleavedLength * 2, true); + + // RIFF type + writeUTFBytes(view, 8, 'WAVE'); + + // format chunk identifier + // FMT sub-chunk + writeUTFBytes(view, 12, 'fmt '); + + // format chunk length + view.setUint32(16, 16, true); + + // sample format (raw) + view.setUint16(20, 1, true); + + // stereo (2 channels) + view.setUint16(22, numberOfAudioChannels, true); + + // sample rate + view.setUint32(24, sampleRate, true); + + // byte rate (sample rate * block align) + view.setUint32(28, sampleRate * 2, true); + + // block align (channel count * bytes per sample) + view.setUint16(32, numberOfAudioChannels * 2, true); + + // bits per sample + view.setUint16(34, 16, true); + + // data sub-chunk + // data chunk identifier + writeUTFBytes(view, 36, 'data'); + + // data chunk length + view.setUint32(40, interleavedLength * 2, true); + + // write the PCM samples + var lng = interleavedLength; + var index = 44; + var volume = 1; + for (var i = 0; i < lng; i++) { + view.setInt16(index, interleaved[i] * (0x7FFF * volume), true); + index += 2; + } + + if (cb) { + return cb({ + buffer: buffer, + view: view + }); + } + + postMessage({ + buffer: buffer, + view: view + }); + } + + if (isEdge || isOpera || isSafari || config.noWorker) { + mergeAudioBuffers(config, function(data) { + callback(data.buffer, data.view); + }); + return; + } + + + var webWorker = processInWebWorker(mergeAudioBuffers); + + webWorker.onmessage = function(event) { + callback(event.data.buffer, event.data.view); + + // release memory + URL.revokeObjectURL(webWorker.workerURL); + + // kill webworker (or Chrome will kill your page after ~25 calls) + webWorker.terminate(); + }; + + webWorker.postMessage(config); + } + + function processInWebWorker(_function) { + var workerURL = URL.createObjectURL(new Blob([_function.toString(), + ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}' + ], { + type: 'application/javascript' + })); + + var worker = new Worker(workerURL); + worker.workerURL = workerURL; + return worker; + } + + /** + * This method stops recording MediaStream. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof StereoAudioRecorder + * @example + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + */ + this.stop = function(callback) { + callback = callback || function() {}; + + // stop recording + recording = false; + + mergeLeftRightBuffers({ + desiredSampRate: desiredSampRate, + sampleRate: sampleRate, + numberOfAudioChannels: numberOfAudioChannels, + internalInterleavedLength: recordingLength, + leftBuffers: leftchannel, + rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel + }, function(buffer, view) { + /** + * @property {Blob} blob - The recorded blob object. + * @memberof StereoAudioRecorder + * @example + * recorder.stop(function(){ + * var blob = recorder.blob; + * }); + */ + self.blob = new Blob([view], { + type: 'audio/wav' + }); + + /** + * @property {ArrayBuffer} buffer - The recorded buffer object. + * @memberof StereoAudioRecorder + * @example + * recorder.stop(function(){ + * var buffer = recorder.buffer; + * }); + */ + self.buffer = new ArrayBuffer(view.buffer.byteLength); + + /** + * @property {DataView} view - The recorded data-view object. + * @memberof StereoAudioRecorder + * @example + * recorder.stop(function(){ + * var view = recorder.view; + * }); + */ + self.view = view; + + self.sampleRate = desiredSampRate || sampleRate; + self.bufferSize = bufferSize; + + // recorded audio length + self.length = recordingLength; + + isAudioProcessStarted = false; + + if (callback) { + callback(self.blob); + } + }); + }; + + if (!Storage.AudioContextConstructor) { + Storage.AudioContextConstructor = new Storage.AudioContext(); + } + + var context = Storage.AudioContextConstructor; + + // creates an audio node from the microphone incoming stream + var audioInput = context.createMediaStreamSource(mediaStream); + + var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384]; + + /** + * From the spec: This value controls how frequently the audioprocess event is + * dispatched and how many sample-frames need to be processed each call. + * Lower values for buffer size will result in a lower (better) latency. + * Higher values will be necessary to avoid audio breakup and glitches + * The size of the buffer (in sample-frames) which needs to + * be processed each time onprocessaudio is called. + * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384). + * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched. + * @memberof StereoAudioRecorder + * @example + * recorder = new StereoAudioRecorder(mediaStream, { + * bufferSize: 4096 + * }); + */ + + // "0" means, let chrome decide the most accurate buffer-size for current platform. + var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize; + + if (legalBufferValues.indexOf(bufferSize) === -1) { + if (!config.disableLogs) { + console.warn('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\t')); + } + } + + if (context.createJavaScriptNode) { + jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels); + } else if (context.createScriptProcessor) { + jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels); + } else { + throw 'WebAudio API has no support on this browser.'; + } + + // connect the stream to the script processor + audioInput.connect(jsAudioNode); + + if (!config.bufferSize) { + bufferSize = jsAudioNode.bufferSize; // device buffer-size + } + + /** + * The sample rate (in sample-frames per second) at which the + * AudioContext handles audio. It is assumed that all AudioNodes + * in the context run at this rate. In making this assumption, + * sample-rate converters or "varispeed" processors are not supported + * in real-time processing. + * The sampleRate parameter describes the sample-rate of the + * linear PCM audio data in the buffer in sample-frames per second. + * An implementation must support sample-rates in at least + * the range 22050 to 96000. + * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched. + * @memberof StereoAudioRecorder + * @example + * recorder = new StereoAudioRecorder(mediaStream, { + * sampleRate: 44100 + * }); + */ + var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100; + + if (sampleRate < 22050 || sampleRate > 96000) { + // Ref: http://stackoverflow.com/a/26303918/552182 + if (!config.disableLogs) { + console.warn('sample-rate must be under range 22050 and 96000.'); + } + } + + if (!config.disableLogs) { + console.log('sample-rate', sampleRate); + console.log('buffer-size', bufferSize); + + if (config.desiredSampRate) { + console.log('Desired sample-rate', config.desiredSampRate); + } + } + + var isPaused = false; + /** + * This method pauses the recording process. + * @method + * @memberof StereoAudioRecorder + * @example + * recorder.pause(); + */ + this.pause = function() { + isPaused = true; + }; + + /** + * This method resumes the recording process. + * @method + * @memberof StereoAudioRecorder + * @example + * recorder.resume(); + */ + this.resume = function() { + if (isMediaStreamActive() === false) { + throw 'Please make sure MediaStream is active.'; + } + + if (!recording) { + if (!config.disableLogs) { + console.log('Seems recording has been restarted.'); + } + this.record(); + return; + } + + isPaused = false; + }; + + /** + * This method resets currently recorded data. + * @method + * @memberof StereoAudioRecorder + * @example + * recorder.clearRecordedData(); + */ + this.clearRecordedData = function() { + config.checkForInactiveTracks = false; + + if (recording) { + this.stop(clearRecordedDataCB); + } + + clearRecordedDataCB(); + }; + + function resetVariables() { + leftchannel = []; + rightchannel = []; + recordingLength = 0; + isAudioProcessStarted = false; + recording = false; + isPaused = false; + context = null; + + self.leftchannel = leftchannel; + self.rightchannel = rightchannel; + self.numberOfAudioChannels = numberOfAudioChannels; + self.desiredSampRate = desiredSampRate; + self.sampleRate = sampleRate; + self.recordingLength = recordingLength; + + intervalsBasedBuffers = { + left: [], + right: [], + recordingLength: 0 + }; + } + + function clearRecordedDataCB() { + if (jsAudioNode) { + jsAudioNode.onaudioprocess = null; + jsAudioNode.disconnect(); + jsAudioNode = null; + } + + if (audioInput) { + audioInput.disconnect(); + audioInput = null; + } + + resetVariables(); + } + + // for debugging + this.name = 'StereoAudioRecorder'; + this.toString = function() { + return this.name; + }; + + var isAudioProcessStarted = false; + + function onAudioProcessDataAvailable(e) { + if (isPaused) { + return; + } + + if (isMediaStreamActive() === false) { + if (!config.disableLogs) { + console.log('MediaStream seems stopped.'); + } + jsAudioNode.disconnect(); + recording = false; + } + + if (!recording) { + if (audioInput) { + audioInput.disconnect(); + audioInput = null; + } + return; + } + + /** + * This method is called on "onaudioprocess" event's first invocation. + * @method {function} onAudioProcessStarted + * @memberof StereoAudioRecorder + * @example + * recorder.onAudioProcessStarted: function() { }; + */ + if (!isAudioProcessStarted) { + isAudioProcessStarted = true; + if (config.onAudioProcessStarted) { + config.onAudioProcessStarted(); + } + + if (config.initCallback) { + config.initCallback(); + } + } + + var left = e.inputBuffer.getChannelData(0); + + // we clone the samples + var chLeft = new Float32Array(left); + leftchannel.push(chLeft); + + if (numberOfAudioChannels === 2) { + var right = e.inputBuffer.getChannelData(1); + var chRight = new Float32Array(right); + rightchannel.push(chRight); + } + + recordingLength += bufferSize; + + // export raw PCM + self.recordingLength = recordingLength; + + if (typeof config.timeSlice !== 'undefined') { + intervalsBasedBuffers.recordingLength += bufferSize; + intervalsBasedBuffers.left.push(chLeft); + + if (numberOfAudioChannels === 2) { + intervalsBasedBuffers.right.push(chRight); + } + } + } + + jsAudioNode.onaudioprocess = onAudioProcessDataAvailable; + + // to prevent self audio to be connected with speakers + jsAudioNode.connect(context.destination); + + // export raw PCM + this.leftchannel = leftchannel; + this.rightchannel = rightchannel; + this.numberOfAudioChannels = numberOfAudioChannels; + this.desiredSampRate = desiredSampRate; + this.sampleRate = sampleRate; + self.recordingLength = recordingLength; + + // helper for intervals based blobs + var intervalsBasedBuffers = { + left: [], + right: [], + recordingLength: 0 + }; + + // this looper is used to support intervals based blobs (via timeSlice+ondataavailable) + function looper() { + if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') { + return; + } + + if (intervalsBasedBuffers.left.length) { + mergeLeftRightBuffers({ + desiredSampRate: desiredSampRate, + sampleRate: sampleRate, + numberOfAudioChannels: numberOfAudioChannels, + internalInterleavedLength: intervalsBasedBuffers.recordingLength, + leftBuffers: intervalsBasedBuffers.left, + rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right + }, function(buffer, view) { + var blob = new Blob([view], { + type: 'audio/wav' + }); + config.ondataavailable(blob); + + setTimeout(looper, config.timeSlice); + }); + + intervalsBasedBuffers = { + left: [], + right: [], + recordingLength: 0 + }; + } else { + setTimeout(looper, config.timeSlice); + } + } +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.StereoAudioRecorder = StereoAudioRecorder; +} + +// _________________ +// CanvasRecorder.js + +/** + * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}. + * @summary HTML2Canvas recording into video WebM. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef CanvasRecorder + * @class + * @example + * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true }); + * recorder.record(); + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc. + * @param {object} config - {disableLogs:true, initCallback: function} + */ + +function CanvasRecorder(htmlElement, config) { + if (typeof html2canvas === 'undefined') { + throw 'Please link: https://cdn.webrtc-experiment.com/screenshot.js'; + } + + config = config || {}; + if (!config.frameInterval) { + config.frameInterval = 10; + } + + // via DetectRTC.js + var isCanvasSupportsStreamCapturing = false; + ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) { + if (item in document.createElement('canvas')) { + isCanvasSupportsStreamCapturing = true; + } + }); + + var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome; + + var chromeVersion = 50; + var matchArray = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + if (_isChrome && matchArray && matchArray[2]) { + chromeVersion = parseInt(matchArray[2], 10); + } + + if (_isChrome && chromeVersion < 52) { + isCanvasSupportsStreamCapturing = false; + } + + if (config.useWhammyRecorder) { + isCanvasSupportsStreamCapturing = false; + } + + var globalCanvas, mediaStreamRecorder; + + if (isCanvasSupportsStreamCapturing) { + if (!config.disableLogs) { + console.log('Your browser supports both MediRecorder API and canvas.captureStream!'); + } + + if (htmlElement instanceof HTMLCanvasElement) { + globalCanvas = htmlElement; + } else if (htmlElement instanceof CanvasRenderingContext2D) { + globalCanvas = htmlElement.canvas; + } else { + throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.'; + } + } else if (!!navigator.mozGetUserMedia) { + if (!config.disableLogs) { + console.error('Canvas recording is NOT supported in Firefox.'); + } + } + + var isRecording; + + /** + * This method records Canvas. + * @method + * @memberof CanvasRecorder + * @example + * recorder.record(); + */ + this.record = function() { + isRecording = true; + + if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) { + // CanvasCaptureMediaStream + var canvasMediaStream; + if ('captureStream' in globalCanvas) { + canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS + } else if ('mozCaptureStream' in globalCanvas) { + canvasMediaStream = globalCanvas.mozCaptureStream(25); + } else if ('webkitCaptureStream' in globalCanvas) { + canvasMediaStream = globalCanvas.webkitCaptureStream(25); + } + + try { + var mdStream = new MediaStream(); + mdStream.addTrack(canvasMediaStream.getVideoTracks()[0]); + canvasMediaStream = mdStream; + } catch (e) {} + + if (!canvasMediaStream) { + throw 'captureStream API are NOT available.'; + } + + // Note: Jan 18, 2016 status is that, + // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object. + mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, { + mimeType: 'video/webm' + }); + mediaStreamRecorder.record(); + } else { + whammy.frames = []; + lastTime = new Date().getTime(); + drawCanvasFrame(); + } + + if (config.initCallback) { + config.initCallback(); + } + }; + + this.getWebPImages = function(callback) { + if (htmlElement.nodeName.toLowerCase() !== 'canvas') { + callback(); + return; + } + + var framesLength = whammy.frames.length; + whammy.frames.forEach(function(frame, idx) { + var framesRemaining = framesLength - idx; + if (!config.disableLogs) { + console.log(framesRemaining + '/' + framesLength + ' frames remaining'); + } + + if (config.onEncodingCallback) { + config.onEncodingCallback(framesRemaining, framesLength); + } + + var webp = frame.image.toDataURL('image/webp', 1); + whammy.frames[idx].image = webp; + }); + + if (!config.disableLogs) { + console.log('Generating WebM'); + } + + callback(); + }; + + /** + * This method stops recording Canvas. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof CanvasRecorder + * @example + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + */ + this.stop = function(callback) { + isRecording = false; + + var that = this; + + if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) { + mediaStreamRecorder.stop(callback); + return; + } + + this.getWebPImages(function() { + /** + * @property {Blob} blob - Recorded frames in video/webm blob. + * @memberof CanvasRecorder + * @example + * recorder.stop(function() { + * var blob = recorder.blob; + * }); + */ + whammy.compile(function(blob) { + if (!config.disableLogs) { + console.log('Recording finished!'); + } + + that.blob = blob; + + if (that.blob.forEach) { + that.blob = new Blob([], { + type: 'video/webm' + }); + } + + if (callback) { + callback(that.blob); + } + + whammy.frames = []; + }); + }); + }; + + var isPausedRecording = false; + + /** + * This method pauses the recording process. + * @method + * @memberof CanvasRecorder + * @example + * recorder.pause(); + */ + this.pause = function() { + isPausedRecording = true; + + if (mediaStreamRecorder instanceof MediaStreamRecorder) { + mediaStreamRecorder.pause(); + return; + } + }; + + /** + * This method resumes the recording process. + * @method + * @memberof CanvasRecorder + * @example + * recorder.resume(); + */ + this.resume = function() { + isPausedRecording = false; + + if (mediaStreamRecorder instanceof MediaStreamRecorder) { + mediaStreamRecorder.resume(); + return; + } + + if (!isRecording) { + this.record(); + } + }; + + /** + * This method resets currently recorded data. + * @method + * @memberof CanvasRecorder + * @example + * recorder.clearRecordedData(); + */ + this.clearRecordedData = function() { + if (isRecording) { + this.stop(clearRecordedDataCB); + } + clearRecordedDataCB(); + }; + + function clearRecordedDataCB() { + whammy.frames = []; + isRecording = false; + isPausedRecording = false; + } + + // for debugging + this.name = 'CanvasRecorder'; + this.toString = function() { + return this.name; + }; + + function cloneCanvas() { + //create a new canvas + var newCanvas = document.createElement('canvas'); + var context = newCanvas.getContext('2d'); + + //set dimensions + newCanvas.width = htmlElement.width; + newCanvas.height = htmlElement.height; + + //apply the old canvas to the new one + context.drawImage(htmlElement, 0, 0); + + //return the new canvas + return newCanvas; + } + + function drawCanvasFrame() { + if (isPausedRecording) { + lastTime = new Date().getTime(); + return setTimeout(drawCanvasFrame, 500); + } + + if (htmlElement.nodeName.toLowerCase() === 'canvas') { + var duration = new Date().getTime() - lastTime; + // via #206, by Jack i.e. @Seymourr + lastTime = new Date().getTime(); + + whammy.frames.push({ + image: cloneCanvas(), + duration: duration + }); + + if (isRecording) { + setTimeout(drawCanvasFrame, config.frameInterval); + } + return; + } + + html2canvas(htmlElement, { + grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer, + onrendered: function(canvas) { + var duration = new Date().getTime() - lastTime; + if (!duration) { + return setTimeout(drawCanvasFrame, config.frameInterval); + } + + // via #206, by Jack i.e. @Seymourr + lastTime = new Date().getTime(); + + whammy.frames.push({ + image: canvas.toDataURL('image/webp', 1), + duration: duration + }); + + if (isRecording) { + setTimeout(drawCanvasFrame, config.frameInterval); + } + } + }); + } + + var lastTime = new Date().getTime(); + + var whammy = new Whammy.Video(100); +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.CanvasRecorder = CanvasRecorder; +} + +// _________________ +// WhammyRecorder.js + +/** + * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}. + * @summary Video recording feature in Chrome. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef WhammyRecorder + * @class + * @example + * var recorder = new WhammyRecorder(mediaStream); + * recorder.record(); + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API. + * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.} + */ + +function WhammyRecorder(mediaStream, config) { + + config = config || {}; + + if (!config.frameInterval) { + config.frameInterval = 10; + } + + if (!config.disableLogs) { + console.log('Using frames-interval:', config.frameInterval); + } + + /** + * This method records video. + * @method + * @memberof WhammyRecorder + * @example + * recorder.record(); + */ + this.record = function() { + if (!config.width) { + config.width = 320; + } + + if (!config.height) { + config.height = 240; + } + + if (!config.video) { + config.video = { + width: config.width, + height: config.height + }; + } + + if (!config.canvas) { + config.canvas = { + width: config.width, + height: config.height + }; + } + + canvas.width = config.canvas.width || 320; + canvas.height = config.canvas.height || 240; + + context = canvas.getContext('2d'); + + // setting defaults + if (config.video && config.video instanceof HTMLVideoElement) { + video = config.video.cloneNode(); + + if (config.initCallback) { + config.initCallback(); + } + } else { + video = document.createElement('video'); + + setSrcObject(mediaStream, video); + + video.onloadedmetadata = function() { // "onloadedmetadata" may NOT work in FF? + if (config.initCallback) { + config.initCallback(); + } + }; + + video.width = config.video.width; + video.height = config.video.height; + } + + video.muted = true; + video.play(); + + lastTime = new Date().getTime(); + whammy = new Whammy.Video(); + + if (!config.disableLogs) { + console.log('canvas resolutions', canvas.width, '*', canvas.height); + console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height); + } + + drawFrames(config.frameInterval); + }; + + /** + * Draw and push frames to Whammy + * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy + */ + function drawFrames(frameInterval) { + frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10; + + var duration = new Date().getTime() - lastTime; + if (!duration) { + return setTimeout(drawFrames, frameInterval, frameInterval); + } + + if (isPausedRecording) { + lastTime = new Date().getTime(); + return setTimeout(drawFrames, 100); + } + + // via #206, by Jack i.e. @Seymourr + lastTime = new Date().getTime(); + + if (video.paused) { + // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316 + // Tweak for Android Chrome + video.play(); + } + + context.drawImage(video, 0, 0, canvas.width, canvas.height); + whammy.frames.push({ + duration: duration, + image: canvas.toDataURL('image/webp') + }); + + if (!isStopDrawing) { + setTimeout(drawFrames, frameInterval, frameInterval); + } + } + + function asyncLoop(o) { + var i = -1, + length = o.length; + + (function loop() { + i++; + if (i === length) { + o.callback(); + return; + } + + // "setTimeout" added by Jim McLeod + setTimeout(function() { + o.functionToLoop(loop, i); + }, 1); + })(); + } + + + /** + * remove black frames from the beginning to the specified frame + * @param {Array} _frames - array of frames to be checked + * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found) + * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all + * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all + * @returns {Array} - array of frames + */ + // pull#293 by @volodalexey + function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) { + var localCanvas = document.createElement('canvas'); + localCanvas.width = canvas.width; + localCanvas.height = canvas.height; + var context2d = localCanvas.getContext('2d'); + var resultFrames = []; + + var checkUntilNotBlack = _framesToCheck === -1; + var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ? + _framesToCheck : _frames.length; + var sampleColor = { + r: 0, + g: 0, + b: 0 + }; + var maxColorDifference = Math.sqrt( + Math.pow(255, 2) + + Math.pow(255, 2) + + Math.pow(255, 2) + ); + var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0; + var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0; + var doNotCheckNext = false; + + asyncLoop({ + length: endCheckFrame, + functionToLoop: function(loop, f) { + var matchPixCount, endPixCheck, maxPixCount; + + var finishImage = function() { + if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) { + // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration); + } else { + // console.log('frame is passed : ' + f); + if (checkUntilNotBlack) { + doNotCheckNext = true; + } + resultFrames.push(_frames[f]); + } + loop(); + }; + + if (!doNotCheckNext) { + var image = new Image(); + image.onload = function() { + context2d.drawImage(image, 0, 0, canvas.width, canvas.height); + var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height); + matchPixCount = 0; + endPixCheck = imageData.data.length; + maxPixCount = imageData.data.length / 4; + + for (var pix = 0; pix < endPixCheck; pix += 4) { + var currentColor = { + r: imageData.data[pix], + g: imageData.data[pix + 1], + b: imageData.data[pix + 2] + }; + var colorDifference = Math.sqrt( + Math.pow(currentColor.r - sampleColor.r, 2) + + Math.pow(currentColor.g - sampleColor.g, 2) + + Math.pow(currentColor.b - sampleColor.b, 2) + ); + // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2) + if (colorDifference <= maxColorDifference * pixTolerance) { + matchPixCount++; + } + } + finishImage(); + }; + image.src = _frames[f].image; + } else { + finishImage(); + } + }, + callback: function() { + resultFrames = resultFrames.concat(_frames.slice(endCheckFrame)); + + if (resultFrames.length <= 0) { + // at least one last frame should be available for next manipulation + // if total duration of all frames will be < 1000 than ffmpeg doesn't work well... + resultFrames.push(_frames[_frames.length - 1]); + } + callback(resultFrames); + } + }); + } + + var isStopDrawing = false; + + /** + * This method stops recording video. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof WhammyRecorder + * @example + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + */ + this.stop = function(callback) { + callback = callback || function() {}; + + isStopDrawing = true; + + var _this = this; + // analyse of all frames takes some time! + setTimeout(function() { + // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames + // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames + // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color + dropBlackFrames(whammy.frames, -1, null, null, function(frames) { + whammy.frames = frames; + + // to display advertisement images! + if (config.advertisement && config.advertisement.length) { + whammy.frames = config.advertisement.concat(whammy.frames); + } + + /** + * @property {Blob} blob - Recorded frames in video/webm blob. + * @memberof WhammyRecorder + * @example + * recorder.stop(function() { + * var blob = recorder.blob; + * }); + */ + whammy.compile(function(blob) { + _this.blob = blob; + + if (_this.blob.forEach) { + _this.blob = new Blob([], { + type: 'video/webm' + }); + } + + if (callback) { + callback(_this.blob); + } + }); + }); + }, 10); + }; + + var isPausedRecording = false; + + /** + * This method pauses the recording process. + * @method + * @memberof WhammyRecorder + * @example + * recorder.pause(); + */ + this.pause = function() { + isPausedRecording = true; + }; + + /** + * This method resumes the recording process. + * @method + * @memberof WhammyRecorder + * @example + * recorder.resume(); + */ + this.resume = function() { + isPausedRecording = false; + + if (isStopDrawing) { + this.record(); + } + }; + + /** + * This method resets currently recorded data. + * @method + * @memberof WhammyRecorder + * @example + * recorder.clearRecordedData(); + */ + this.clearRecordedData = function() { + if (!isStopDrawing) { + this.stop(clearRecordedDataCB); + } + clearRecordedDataCB(); + }; + + function clearRecordedDataCB() { + whammy.frames = []; + isStopDrawing = true; + isPausedRecording = false; + } + + // for debugging + this.name = 'WhammyRecorder'; + this.toString = function() { + return this.name; + }; + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + + var video; + var lastTime; + var whammy; +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.WhammyRecorder = WhammyRecorder; +} + +// https://github.com/antimatter15/whammy/blob/master/LICENSE +// _________ +// Whammy.js + +// todo: Firefox now supports webp for webm containers! +// their MediaRecorder implementation works well! +// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution? + +/** + * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15} + * @summary A real time javascript webm encoder based on a canvas hack. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef Whammy + * @class + * @example + * var recorder = new Whammy().Video(15); + * recorder.add(context || canvas || dataURL); + * var output = recorder.compile(); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + */ + +var Whammy = (function() { + // a more abstract-ish API + + function WhammyVideo(duration) { + this.frames = []; + this.duration = duration || 1; + this.quality = 0.8; + } + + /** + * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder. + * @method + * @memberof Whammy + * @example + * recorder = new Whammy().Video(0.8, 100); + * recorder.add(canvas || context || 'image/webp'); + * @param {string} frame - Canvas || Context || image/webp + * @param {number} duration - Stick a duration (in milliseconds) + */ + WhammyVideo.prototype.add = function(frame, duration) { + if ('canvas' in frame) { //CanvasRenderingContext2D + frame = frame.canvas; + } + + if ('toDataURL' in frame) { + frame = frame.toDataURL('image/webp', this.quality); + } + + if (!(/^data:image\/webp;base64,/ig).test(frame)) { + throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp'; + } + this.frames.push({ + image: frame, + duration: duration || this.duration + }); + }; + + function processInWebWorker(_function) { + var blob = URL.createObjectURL(new Blob([_function.toString(), + 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}' + ], { + type: 'application/javascript' + })); + + var worker = new Worker(blob); + URL.revokeObjectURL(blob); + return worker; + } + + function whammyInWebWorker(frames) { + function ArrayToWebM(frames) { + var info = checkFrames(frames); + if (!info) { + return []; + } + + var clusterMaxDuration = 30000; + + var EBML = [{ + 'id': 0x1a45dfa3, // EBML + 'data': [{ + 'data': 1, + 'id': 0x4286 // EBMLVersion + }, { + 'data': 1, + 'id': 0x42f7 // EBMLReadVersion + }, { + 'data': 4, + 'id': 0x42f2 // EBMLMaxIDLength + }, { + 'data': 8, + 'id': 0x42f3 // EBMLMaxSizeLength + }, { + 'data': 'webm', + 'id': 0x4282 // DocType + }, { + 'data': 2, + 'id': 0x4287 // DocTypeVersion + }, { + 'data': 2, + 'id': 0x4285 // DocTypeReadVersion + }] + }, { + 'id': 0x18538067, // Segment + 'data': [{ + 'id': 0x1549a966, // Info + 'data': [{ + 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale) + 'id': 0x2ad7b1 // TimecodeScale + }, { + 'data': 'whammy', + 'id': 0x4d80 // MuxingApp + }, { + 'data': 'whammy', + 'id': 0x5741 // WritingApp + }, { + 'data': doubleToString(info.duration), + 'id': 0x4489 // Duration + }] + }, { + 'id': 0x1654ae6b, // Tracks + 'data': [{ + 'id': 0xae, // TrackEntry + 'data': [{ + 'data': 1, + 'id': 0xd7 // TrackNumber + }, { + 'data': 1, + 'id': 0x73c5 // TrackUID + }, { + 'data': 0, + 'id': 0x9c // FlagLacing + }, { + 'data': 'und', + 'id': 0x22b59c // Language + }, { + 'data': 'V_VP8', + 'id': 0x86 // CodecID + }, { + 'data': 'VP8', + 'id': 0x258688 // CodecName + }, { + 'data': 1, + 'id': 0x83 // TrackType + }, { + 'id': 0xe0, // Video + 'data': [{ + 'data': info.width, + 'id': 0xb0 // PixelWidth + }, { + 'data': info.height, + 'id': 0xba // PixelHeight + }] + }] + }] + }] + }]; + + //Generate clusters (max duration) + var frameNumber = 0; + var clusterTimecode = 0; + while (frameNumber < frames.length) { + + var clusterFrames = []; + var clusterDuration = 0; + do { + clusterFrames.push(frames[frameNumber]); + clusterDuration += frames[frameNumber].duration; + frameNumber++; + } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration); + + var clusterCounter = 0; + var cluster = { + 'id': 0x1f43b675, // Cluster + 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames) + }; //Add cluster to segment + EBML[1].data.push(cluster); + clusterTimecode += clusterDuration; + } + + return generateEBML(EBML); + } + + function getClusterData(clusterTimecode, clusterCounter, clusterFrames) { + return [{ + 'data': clusterTimecode, + 'id': 0xe7 // Timecode + }].concat(clusterFrames.map(function(webp) { + var block = makeSimpleBlock({ + discardable: 0, + frame: webp.data.slice(4), + invisible: 0, + keyframe: 1, + lacing: 0, + trackNum: 1, + timecode: Math.round(clusterCounter) + }); + clusterCounter += webp.duration; + return { + data: block, + id: 0xa3 + }; + })); + } + + // sums the lengths of all the frames and gets the duration + + function checkFrames(frames) { + if (!frames[0]) { + postMessage({ + error: 'Something went wrong. Maybe WebP format is not supported in the current browser.' + }); + return; + } + + var width = frames[0].width, + height = frames[0].height, + duration = frames[0].duration; + + for (var i = 1; i < frames.length; i++) { + duration += frames[i].duration; + } + return { + duration: duration, + width: width, + height: height + }; + } + + function numToBuffer(num) { + var parts = []; + while (num > 0) { + parts.push(num & 0xff); + num = num >> 8; + } + return new Uint8Array(parts.reverse()); + } + + function strToBuffer(str) { + return new Uint8Array(str.split('').map(function(e) { + return e.charCodeAt(0); + })); + } + + function bitsToBuffer(bits) { + var data = []; + var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : ''; + bits = pad + bits; + for (var i = 0; i < bits.length; i += 8) { + data.push(parseInt(bits.substr(i, 8), 2)); + } + return new Uint8Array(data); + } + + function generateEBML(json) { + var ebml = []; + for (var i = 0; i < json.length; i++) { + var data = json[i].data; + + if (typeof data === 'object') { + data = generateEBML(data); + } + + if (typeof data === 'number') { + data = bitsToBuffer(data.toString(2)); + } + + if (typeof data === 'string') { + data = strToBuffer(data); + } + + var len = data.size || data.byteLength || data.length; + var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8); + var sizeToString = len.toString(2); + var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString; + var size = (new Array(zeroes)).join('0') + '1' + padded; + + ebml.push(numToBuffer(json[i].id)); + ebml.push(bitsToBuffer(size)); + ebml.push(data); + } + + return new Blob(ebml, { + type: 'video/webm' + }); + } + + function toBinStrOld(bits) { + var data = ''; + var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : ''; + bits = pad + bits; + for (var i = 0; i < bits.length; i += 8) { + data += String.fromCharCode(parseInt(bits.substr(i, 8), 2)); + } + return data; + } + + function makeSimpleBlock(data) { + var flags = 0; + + if (data.keyframe) { + flags |= 128; + } + + if (data.invisible) { + flags |= 8; + } + + if (data.lacing) { + flags |= (data.lacing << 1); + } + + if (data.discardable) { + flags |= 1; + } + + if (data.trackNum > 127) { + throw 'TrackNumber > 127 not supported'; + } + + var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) { + return String.fromCharCode(e); + }).join('') + data.frame; + + return out; + } + + function parseWebP(riff) { + var VP8 = riff.RIFF[0].WEBP[0]; + + var frameStart = VP8.indexOf('\x9d\x01\x2a'); // A VP8 keyframe starts with the 0x9d012a header + for (var i = 0, c = []; i < 4; i++) { + c[i] = VP8.charCodeAt(frameStart + 3 + i); + } + + var width, height, tmp; + + //the code below is literally copied verbatim from the bitstream spec + tmp = (c[1] << 8) | c[0]; + width = tmp & 0x3FFF; + tmp = (c[3] << 8) | c[2]; + height = tmp & 0x3FFF; + return { + width: width, + height: height, + data: VP8, + riff: riff + }; + } + + function getStrLength(string, offset) { + return parseInt(string.substr(offset + 4, 4).split('').map(function(i) { + var unpadded = i.charCodeAt(0).toString(2); + return (new Array(8 - unpadded.length + 1)).join('0') + unpadded; + }).join(''), 2); + } + + function parseRIFF(string) { + var offset = 0; + var chunks = {}; + + while (offset < string.length) { + var id = string.substr(offset, 4); + var len = getStrLength(string, offset); + var data = string.substr(offset + 4 + 4, len); + offset += 4 + 4 + len; + chunks[id] = chunks[id] || []; + + if (id === 'RIFF' || id === 'LIST') { + chunks[id].push(parseRIFF(data)); + } else { + chunks[id].push(data); + } + } + return chunks; + } + + function doubleToString(num) { + return [].slice.call( + new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) { + return String.fromCharCode(e); + }).reverse().join(''); + } + + var webm = new ArrayToWebM(frames.map(function(frame) { + var webp = parseWebP(parseRIFF(atob(frame.image.slice(23)))); + webp.duration = frame.duration; + return webp; + })); + + postMessage(webm); + } + + /** + * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof Whammy + * @example + * recorder = new Whammy().Video(0.8, 100); + * recorder.compile(function(blob) { + * // blob.size - blob.type + * }); + */ + WhammyVideo.prototype.compile = function(callback) { + var webWorker = processInWebWorker(whammyInWebWorker); + + webWorker.onmessage = function(event) { + if (event.data.error) { + console.error(event.data.error); + return; + } + callback(event.data); + }; + + webWorker.postMessage(this.frames); + }; + + return { + /** + * A more abstract-ish API. + * @method + * @memberof Whammy + * @example + * recorder = new Whammy().Video(0.8, 100); + * @param {?number} speed - 0.8 + * @param {?number} quality - 100 + */ + Video: WhammyVideo + }; +})(); + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.Whammy = Whammy; +} + +// ______________ (indexed-db) +// DiskStorage.js + +/** + * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage. + * @summary Writing blobs into IndexedDB. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @example + * DiskStorage.Store({ + * audioBlob: yourAudioBlob, + * videoBlob: yourVideoBlob, + * gifBlob : yourGifBlob + * }); + * DiskStorage.Fetch(function(dataURL, type) { + * if(type === 'audioBlob') { } + * if(type === 'videoBlob') { } + * if(type === 'gifBlob') { } + * }); + * // DiskStorage.dataStoreName = 'recordRTC'; + * // DiskStorage.onError = function(error) { }; + * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally. + * @property {function} Fetch - This method fetches stored blobs from IndexedDB. + * @property {function} Store - This method stores blobs in IndexedDB. + * @property {function} onError - This function is invoked for any known/unknown error. + * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage. + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + */ + + +var DiskStorage = { + /** + * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally. + * @method + * @memberof DiskStorage + * @internal + * @example + * DiskStorage.init(); + */ + init: function() { + var self = this; + + if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') { + console.error('IndexedDB API are not available in this browser.'); + return; + } + + var dbVersion = 1; + var dbName = this.dbName || location.href.replace(/\/|:|#|%|\.|\[|\]/g, ''), + db; + var request = indexedDB.open(dbName, dbVersion); + + function createObjectStore(dataBase) { + dataBase.createObjectStore(self.dataStoreName); + } + + function putInDB() { + var transaction = db.transaction([self.dataStoreName], 'readwrite'); + + if (self.videoBlob) { + transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob'); + } + + if (self.gifBlob) { + transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob'); + } + + if (self.audioBlob) { + transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob'); + } + + function getFromStore(portionName) { + transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) { + if (self.callback) { + self.callback(event.target.result, portionName); + } + }; + } + + getFromStore('audioBlob'); + getFromStore('videoBlob'); + getFromStore('gifBlob'); + } + + request.onerror = self.onError; + + request.onsuccess = function() { + db = request.result; + db.onerror = self.onError; + + if (db.setVersion) { + if (db.version !== dbVersion) { + var setVersion = db.setVersion(dbVersion); + setVersion.onsuccess = function() { + createObjectStore(db); + putInDB(); + }; + } else { + putInDB(); + } + } else { + putInDB(); + } + }; + request.onupgradeneeded = function(event) { + createObjectStore(event.target.result); + }; + }, + /** + * This method fetches stored blobs from IndexedDB. + * @method + * @memberof DiskStorage + * @internal + * @example + * DiskStorage.Fetch(function(dataURL, type) { + * if(type === 'audioBlob') { } + * if(type === 'videoBlob') { } + * if(type === 'gifBlob') { } + * }); + */ + Fetch: function(callback) { + this.callback = callback; + this.init(); + + return this; + }, + /** + * This method stores blobs in IndexedDB. + * @method + * @memberof DiskStorage + * @internal + * @example + * DiskStorage.Store({ + * audioBlob: yourAudioBlob, + * videoBlob: yourVideoBlob, + * gifBlob : yourGifBlob + * }); + */ + Store: function(config) { + this.audioBlob = config.audioBlob; + this.videoBlob = config.videoBlob; + this.gifBlob = config.gifBlob; + + this.init(); + + return this; + }, + /** + * This function is invoked for any known/unknown error. + * @method + * @memberof DiskStorage + * @internal + * @example + * DiskStorage.onError = function(error){ + * alerot( JSON.stringify(error) ); + * }; + */ + onError: function(error) { + console.error(JSON.stringify(error, null, '\t')); + }, + + /** + * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage. + * @memberof DiskStorage + * @internal + * @example + * DiskStorage.dataStoreName = 'recordRTC'; + */ + dataStoreName: 'recordRTC', + dbName: null +}; + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.DiskStorage = DiskStorage; +} + +// ______________ +// GifRecorder.js + +/** + * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef GifRecorder + * @class + * @example + * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 }); + * recorder.record(); + * recorder.stop(function(blob) { + * img.src = URL.createObjectURL(blob); + * }); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D. + * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10} + */ + +function GifRecorder(mediaStream, config) { + if (typeof GIFEncoder === 'undefined') { + var script = document.createElement('script'); + script.src = 'https://cdn.webrtc-experiment.com/gif-recorder.js'; + (document.body || document.documentElement).appendChild(script); + } + + config = config || {}; + + var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement; + + /** + * This method records MediaStream. + * @method + * @memberof GifRecorder + * @example + * recorder.record(); + */ + this.record = function() { + if (typeof GIFEncoder === 'undefined') { + setTimeout(self.record, 1000); + return; + } + + if (!isLoadedMetaData) { + setTimeout(self.record, 1000); + return; + } + + if (!isHTMLObject) { + if (!config.width) { + config.width = video.offsetWidth || 320; + } + + if (!config.height) { + config.height = video.offsetHeight || 240; + } + + if (!config.video) { + config.video = { + width: config.width, + height: config.height + }; + } + + if (!config.canvas) { + config.canvas = { + width: config.width, + height: config.height + }; + } + + canvas.width = config.canvas.width || 320; + canvas.height = config.canvas.height || 240; + + video.width = config.video.width || 320; + video.height = config.video.height || 240; + } + + // external library to record as GIF images + gifEncoder = new GIFEncoder(); + + // void setRepeat(int iter) + // Sets the number of times the set of GIF frames should be played. + // Default is 1; 0 means play indefinitely. + gifEncoder.setRepeat(0); + + // void setFrameRate(Number fps) + // Sets frame rate in frames per second. + // Equivalent to setDelay(1000/fps). + // Using "setDelay" instead of "setFrameRate" + gifEncoder.setDelay(config.frameRate || 200); + + // void setQuality(int quality) + // Sets quality of color quantization (conversion of images to the + // maximum 256 colors allowed by the GIF specification). + // Lower values (minimum = 1) produce better colors, + // but slow processing significantly. 10 is the default, + // and produces good color mapping at reasonable speeds. + // Values greater than 20 do not yield significant improvements in speed. + gifEncoder.setQuality(config.quality || 10); + + // Boolean start() + // This writes the GIF Header and returns false if it fails. + gifEncoder.start(); + + if (typeof config.onGifRecordingStarted === 'function') { + config.onGifRecordingStarted(); + } + + startTime = Date.now(); + + function drawVideoFrame(time) { + if (self.clearedRecordedData === true) { + return; + } + + if (isPausedRecording) { + return setTimeout(function() { + drawVideoFrame(time); + }, 100); + } + + lastAnimationFrame = requestAnimationFrame(drawVideoFrame); + + if (typeof lastFrameTime === undefined) { + lastFrameTime = time; + } + + // ~10 fps + if (time - lastFrameTime < 90) { + return; + } + + if (!isHTMLObject && video.paused) { + // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316 + // Tweak for Android Chrome + video.play(); + } + + if (!isHTMLObject) { + context.drawImage(video, 0, 0, canvas.width, canvas.height); + } + + if (config.onGifPreview) { + config.onGifPreview(canvas.toDataURL('image/png')); + } + + gifEncoder.addFrame(context); + lastFrameTime = time; + } + + lastAnimationFrame = requestAnimationFrame(drawVideoFrame); + + if (config.initCallback) { + config.initCallback(); + } + }; + + /** + * This method stops recording MediaStream. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof GifRecorder + * @example + * recorder.stop(function(blob) { + * img.src = URL.createObjectURL(blob); + * }); + */ + this.stop = function(callback) { + callback = callback || function() {}; + + if (lastAnimationFrame) { + cancelAnimationFrame(lastAnimationFrame); + } + + endTime = Date.now(); + + /** + * @property {Blob} blob - The recorded blob object. + * @memberof GifRecorder + * @example + * recorder.stop(function(){ + * var blob = recorder.blob; + * }); + */ + this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], { + type: 'image/gif' + }); + + callback(this.blob); + + // bug: find a way to clear old recorded blobs + gifEncoder.stream().bin = []; + }; + + var isPausedRecording = false; + + /** + * This method pauses the recording process. + * @method + * @memberof GifRecorder + * @example + * recorder.pause(); + */ + this.pause = function() { + isPausedRecording = true; + }; + + /** + * This method resumes the recording process. + * @method + * @memberof GifRecorder + * @example + * recorder.resume(); + */ + this.resume = function() { + isPausedRecording = false; + }; + + /** + * This method resets currently recorded data. + * @method + * @memberof GifRecorder + * @example + * recorder.clearRecordedData(); + */ + this.clearRecordedData = function() { + self.clearedRecordedData = true; + clearRecordedDataCB(); + }; + + function clearRecordedDataCB() { + if (gifEncoder) { + gifEncoder.stream().bin = []; + } + } + + // for debugging + this.name = 'GifRecorder'; + this.toString = function() { + return this.name; + }; + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + + if (isHTMLObject) { + if (mediaStream instanceof CanvasRenderingContext2D) { + context = mediaStream; + canvas = context.canvas; + } else if (mediaStream instanceof HTMLCanvasElement) { + context = mediaStream.getContext('2d'); + canvas = mediaStream; + } + } + + var isLoadedMetaData = true; + + if (!isHTMLObject) { + var video = document.createElement('video'); + video.muted = true; + video.autoplay = true; + + isLoadedMetaData = false; + video.onloadedmetadata = function() { + isLoadedMetaData = true; + }; + + setSrcObject(mediaStream, video); + + video.play(); + } + + var lastAnimationFrame = null; + var startTime, endTime, lastFrameTime; + + var gifEncoder; + + var self = this; +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.GifRecorder = GifRecorder; +} + +// Last time updated: 2018-03-02 2:56:28 AM UTC + +// ________________________ +// MultiStreamsMixer v1.0.5 + +// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer + +// -------------------------------------------------- +// Muaz Khan - www.MuazKhan.com +// MIT License - www.WebRTC-Experiment.com/licence +// -------------------------------------------------- + +function MultiStreamsMixer(arrayOfMediaStreams) { + + // requires: chrome://flags/#enable-experimental-web-platform-features + + var videos = []; + var isStopDrawingFrames = false; + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + canvas.style = 'opacity:0;position:absolute;z-index:-1;top: -100000000;left:-1000000000; margin-top:-1000000000;margin-left:-1000000000;'; + (document.body || document.documentElement).appendChild(canvas); + + this.disableLogs = false; + this.frameInterval = 10; + + this.width = 360; + this.height = 240; + + // use gain node to prevent echo + this.useGainNode = true; + + var self = this; + + // _____________________________ + // Cross-Browser-Declarations.js + + // WebAudio API representer + var AudioContext = window.AudioContext; + + if (typeof AudioContext === 'undefined') { + if (typeof webkitAudioContext !== 'undefined') { + /*global AudioContext:true */ + AudioContext = webkitAudioContext; + } + + if (typeof mozAudioContext !== 'undefined') { + /*global AudioContext:true */ + AudioContext = mozAudioContext; + } + } + + /*jshint -W079 */ + var URL = window.URL; + + if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') { + /*global URL:true */ + URL = webkitURL; + } + + if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator? + if (typeof navigator.webkitGetUserMedia !== 'undefined') { + navigator.getUserMedia = navigator.webkitGetUserMedia; + } + + if (typeof navigator.mozGetUserMedia !== 'undefined') { + navigator.getUserMedia = navigator.mozGetUserMedia; + } + } + + var MediaStream = window.MediaStream; + + if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') { + MediaStream = webkitMediaStream; + } + + /*global MediaStream:true */ + if (typeof MediaStream !== 'undefined') { + if (!('getVideoTracks' in MediaStream.prototype)) { + MediaStream.prototype.getVideoTracks = function() { + if (!this.getTracks) { + return []; + } + + var tracks = []; + this.getTracks.forEach(function(track) { + if (track.kind.toString().indexOf('video') !== -1) { + tracks.push(track); + } + }); + return tracks; + }; + + MediaStream.prototype.getAudioTracks = function() { + if (!this.getTracks) { + return []; + } + + var tracks = []; + this.getTracks.forEach(function(track) { + if (track.kind.toString().indexOf('audio') !== -1) { + tracks.push(track); + } + }); + return tracks; + }; + } + + // override "stop" method for all browsers + if (typeof MediaStream.prototype.stop === 'undefined') { + MediaStream.prototype.stop = function() { + this.getTracks().forEach(function(track) { + track.stop(); + }); + }; + } + } + + var Storage = {}; + + if (typeof AudioContext !== 'undefined') { + Storage.AudioContext = AudioContext; + } else if (typeof webkitAudioContext !== 'undefined') { + Storage.AudioContext = webkitAudioContext; + } + + function setSrcObject(stream, element, ignoreCreateObjectURL) { + if ('createObjectURL' in URL && !ignoreCreateObjectURL) { + try { + element.src = URL.createObjectURL(stream); + } catch (e) { + setSrcObject(stream, element, true); + return; + } + } else if ('srcObject' in element) { + element.srcObject = stream; + } else if ('mozSrcObject' in element) { + element.mozSrcObject = stream; + } else { + alert('createObjectURL/srcObject both are not supported.'); + } + } + + this.startDrawingFrames = function() { + drawVideosToCanvas(); + }; + + function drawVideosToCanvas() { + if (isStopDrawingFrames) { + return; + } + + var videosLength = videos.length; + + var fullcanvas = false; + var remaining = []; + videos.forEach(function(video) { + if (!video.stream) { + video.stream = {}; + } + + if (video.stream.fullcanvas) { + fullcanvas = video; + } else { + remaining.push(video); + } + }); + + if (fullcanvas) { + canvas.width = fullcanvas.stream.width; + canvas.height = fullcanvas.stream.height; + } else if (remaining.length) { + canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width; + + var height = 1; + if (videosLength === 3 || videosLength === 4) { + height = 2; + } + if (videosLength === 5 || videosLength === 6) { + height = 3; + } + if (videosLength === 7 || videosLength === 8) { + height = 4; + } + if (videosLength === 9 || videosLength === 10) { + height = 5; + } + canvas.height = remaining[0].height * height; + } else { + canvas.width = self.width || 360; + canvas.height = self.height || 240; + } + + if (fullcanvas && fullcanvas instanceof HTMLVideoElement) { + drawImage(fullcanvas); + } + + remaining.forEach(function(video, idx) { + drawImage(video, idx); + }); + + setTimeout(drawVideosToCanvas, self.frameInterval); + } + + function drawImage(video, idx) { + if (isStopDrawingFrames) { + return; + } + + var x = 0; + var y = 0; + var width = video.width; + var height = video.height; + + if (idx === 1) { + x = video.width; + } + + if (idx === 2) { + y = video.height; + } + + if (idx === 3) { + x = video.width; + y = video.height; + } + + if (idx === 4) { + y = video.height * 2; + } + + if (idx === 5) { + x = video.width; + y = video.height * 2; + } + + if (idx === 6) { + y = video.height * 3; + } + + if (idx === 7) { + x = video.width; + y = video.height * 3; + } + + if (typeof video.stream.left !== 'undefined') { + x = video.stream.left; + } + + if (typeof video.stream.top !== 'undefined') { + y = video.stream.top; + } + + if (typeof video.stream.width !== 'undefined') { + width = video.stream.width; + } + + if (typeof video.stream.height !== 'undefined') { + height = video.stream.height; + } + + context.drawImage(video, x, y, width, height); + + if (typeof video.stream.onRender === 'function') { + video.stream.onRender(context, x, y, width, height, idx); + } + } + + function getMixedStream() { + isStopDrawingFrames = false; + var mixedVideoStream = getMixedVideoStream(); + + var mixedAudioStream = getMixedAudioStream(); + if (mixedAudioStream) { + mixedAudioStream.getAudioTracks().forEach(function(track) { + mixedVideoStream.addTrack(track); + }); + } + + var fullcanvas; + arrayOfMediaStreams.forEach(function(stream) { + if (stream.fullcanvas) { + fullcanvas = true; + } + }); + + return mixedVideoStream; + } + + function getMixedVideoStream() { + resetVideoStreams(); + + var capturedStream; + + if ('captureStream' in canvas) { + capturedStream = canvas.captureStream(); + } else if ('mozCaptureStream' in canvas) { + capturedStream = canvas.mozCaptureStream(); + } else if (!self.disableLogs) { + console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features'); + } + + var videoStream = new MediaStream(); + + capturedStream.getVideoTracks().forEach(function(track) { + videoStream.addTrack(track); + }); + + canvas.stream = videoStream; + + return videoStream; + } + + function getMixedAudioStream() { + // via: @pehrsons + if (!Storage.AudioContextConstructor) { + Storage.AudioContextConstructor = new Storage.AudioContext(); + } + + self.audioContext = Storage.AudioContextConstructor; + + self.audioSources = []; + + if (self.useGainNode === true) { + self.gainNode = self.audioContext.createGain(); + self.gainNode.connect(self.audioContext.destination); + self.gainNode.gain.value = 0; // don't hear self + } + + var audioTracksLength = 0; + arrayOfMediaStreams.forEach(function(stream) { + if (!stream.getAudioTracks().length) { + return; + } + + audioTracksLength++; + + var audioSource = self.audioContext.createMediaStreamSource(stream); + + if (self.useGainNode === true) { + audioSource.connect(self.gainNode); + } + + self.audioSources.push(audioSource); + }); + + if (!audioTracksLength) { + return; + } + + self.audioDestination = self.audioContext.createMediaStreamDestination(); + self.audioSources.forEach(function(audioSource) { + audioSource.connect(self.audioDestination); + }); + return self.audioDestination.stream; + } + + function getVideo(stream) { + var video = document.createElement('video'); + + setSrcObject(stream, video); + + video.muted = true; + video.volume = 0; + + video.width = stream.width || self.width || 360; + video.height = stream.height || self.height || 240; + + video.play(); + + return video; + } + + this.appendStreams = function(streams) { + if (!streams) { + throw 'First parameter is required.'; + } + + if (!(streams instanceof Array)) { + streams = [streams]; + } + + arrayOfMediaStreams.concat(streams); + + streams.forEach(function(stream) { + if (stream.getVideoTracks().length) { + var video = getVideo(stream); + video.stream = stream; + videos.push(video); + } + + if (stream.getAudioTracks().length && self.audioContext) { + var audioSource = self.audioContext.createMediaStreamSource(stream); + audioSource.connect(self.audioDestination); + self.audioSources.push(audioSource); + } + }); + }; + + this.releaseStreams = function() { + videos = []; + isStopDrawingFrames = true; + + if (self.gainNode) { + self.gainNode.disconnect(); + self.gainNode = null; + } + + if (self.audioSources.length) { + self.audioSources.forEach(function(source) { + source.disconnect(); + }); + self.audioSources = []; + } + + if (self.audioDestination) { + self.audioDestination.disconnect(); + self.audioDestination = null; + } + + if (self.audioContext) { + self.audioContext.close(); + } + + self.audioContext = null; + + context.clearRect(0, 0, canvas.width, canvas.height); + + if (canvas.stream) { + canvas.stream.stop(); + canvas.stream = null; + } + }; + + this.resetVideoStreams = function(streams) { + if (streams && !(streams instanceof Array)) { + streams = [streams]; + } + + resetVideoStreams(streams); + }; + + function resetVideoStreams(streams) { + videos = []; + streams = streams || arrayOfMediaStreams; + + // via: @adrian-ber + streams.forEach(function(stream) { + if (!stream.getVideoTracks().length) { + return; + } + + var video = getVideo(stream); + video.stream = stream; + videos.push(video); + }); + } + + // for debugging + this.name = 'MultiStreamsMixer'; + this.toString = function() { + return this.name; + }; + + this.getMixedStream = getMixedStream; + +} + +// ______________________ +// MultiStreamRecorder.js + +/* + * Video conference recording, using captureStream API along with WebAudio and Canvas2D API. + */ + +/** + * MultiStreamRecorder can record multiple videos in single container. + * @summary Multi-videos recorder. + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef MultiStreamRecorder + * @class + * @example + * var options = { + * mimeType: 'video/webm' + * } + * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options); + * recorder.record(); + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * + * // or + * var blob = recorder.blob; + * }); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStreams} mediaStreams - Array of MediaStreams. + * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: "video/webm"} + */ + +function MultiStreamRecorder(arrayOfMediaStreams, options) { + arrayOfMediaStreams = arrayOfMediaStreams || []; + var self = this; + + var mixer; + var mediaRecorder; + + options = options || { + mimeType: 'video/webm', + video: { + width: 360, + height: 240 + } + }; + + if (!options.frameInterval) { + options.frameInterval = 10; + } + + if (!options.video) { + options.video = {}; + } + + if (!options.video.width) { + options.video.width = 360; + } + + if (!options.video.height) { + options.video.height = 240; + } + + /** + * This method records all MediaStreams. + * @method + * @memberof MultiStreamRecorder + * @example + * recorder.record(); + */ + this.record = function() { + // github/muaz-khan/MultiStreamsMixer + mixer = new MultiStreamsMixer(arrayOfMediaStreams); + + if (getVideoTracks().length) { + mixer.frameInterval = options.frameInterval || 10; + mixer.width = options.video.width || 360; + mixer.height = options.video.height || 240; + mixer.startDrawingFrames(); + } + + if (options.previewStream && typeof options.previewStream === 'function') { + options.previewStream(mixer.getMixedStream()); + } + + // record using MediaRecorder API + mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options); + mediaRecorder.record(); + }; + + function getVideoTracks() { + var tracks = []; + arrayOfMediaStreams.forEach(function(stream) { + stream.getVideoTracks().forEach(function(track) { + tracks.push(track); + }); + }); + return tracks; + } + + /** + * This method stops recording MediaStream. + * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee. + * @method + * @memberof MultiStreamRecorder + * @example + * recorder.stop(function(blob) { + * video.src = URL.createObjectURL(blob); + * }); + */ + this.stop = function(callback) { + if (!mediaRecorder) { + return; + } + + mediaRecorder.stop(function(blob) { + self.blob = blob; + + callback(blob); + + self.clearRecordedData(); + }); + }; + + /** + * This method pauses the recording process. + * @method + * @memberof MultiStreamRecorder + * @example + * recorder.pause(); + */ + this.pause = function() { + if (mediaRecorder) { + mediaRecorder.pause(); + } + }; + + /** + * This method resumes the recording process. + * @method + * @memberof MultiStreamRecorder + * @example + * recorder.resume(); + */ + this.resume = function() { + if (mediaRecorder) { + mediaRecorder.resume(); + } + }; + + /** + * This method resets currently recorded data. + * @method + * @memberof MultiStreamRecorder + * @example + * recorder.clearRecordedData(); + */ + this.clearRecordedData = function() { + if (mediaRecorder) { + mediaRecorder.clearRecordedData(); + mediaRecorder = null; + } + + if (mixer) { + mixer.releaseStreams(); + mixer = null; + } + }; + + /** + * Add extra media-streams to existing recordings. + * @method + * @memberof MultiStreamRecorder + * @param {MediaStreams} mediaStreams - Array of MediaStreams + * @example + * recorder.addStreams([newAudioStream, newVideoStream]); + */ + this.addStreams = function(streams) { + if (!streams) { + throw 'First parameter is required.'; + } + + if (!(streams instanceof Array)) { + streams = [streams]; + } + + arrayOfMediaStreams.concat(streams); + + if (!mediaRecorder || !mixer) { + return; + } + + mixer.appendStreams(streams); + }; + + /** + * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen. + * @method + * @memberof MultiStreamRecorder + * @param {MediaStreams} mediaStreams - Array of MediaStreams + * @example + * recorder.resetVideoStreams([newVideo1, newVideo2]); + */ + this.resetVideoStreams = function(streams) { + if (!mixer) { + return; + } + + if (streams && !(streams instanceof Array)) { + streams = [streams]; + } + + mixer.resetVideoStreams(streams); + }; + + // for debugging + this.name = 'MultiStreamRecorder'; + this.toString = function() { + return this.name; + }; +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.MultiStreamRecorder = MultiStreamRecorder; +} + +// _____________________ +// RecordRTC.promises.js + +/** + * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here} + * @summary Promises for {@link RecordRTC} + * @license {@link https://github.com/muaz-khan/RecordRTC#license|MIT} + * @author {@link http://www.MuazKhan.com|Muaz Khan} + * @typedef RecordRTCPromisesHandler + * @class + * @example + * var recorder = new RecordRTCPromisesHandler(mediaStream, options); + * recorder.startRecording() + * .then(successCB) + * .catch(errorCB); + * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code} + * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc. + * @param {object} config - {type:"video", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.} + * @throws Will throw an error if "new" keyword is not used to initiate "RecordRTCPromisesHandler". Also throws error if first argument "MediaStream" is missing. + * @requires {@link RecordRTC} + */ + +function RecordRTCPromisesHandler(mediaStream, options) { + if (!this) { + throw 'Use "new RecordRTCPromisesHandler()"'; + } + + if (typeof mediaStream === 'undefined') { + throw 'First argument "MediaStream" is required.'; + } + + var self = this; + + /** + * @property {Blob} blob - Access/reach the native {@link RecordRTC} object. + * @memberof RecordRTCPromisesHandler + * @example + * var internal = recorder.recordRTC.getInternalRecorder(); + * alert(internal instanceof MediaStreamRecorder); + */ + self.recordRTC = new RecordRTC(mediaStream, options); + + /** + * This method records MediaStream. + * @method + * @memberof RecordRTCPromisesHandler + * @example + * recorder.startRecording() + * .then(successCB) + * .catch(errorCB); + */ + this.startRecording = function() { + return new Promise(function(resolve, reject) { + try { + self.recordRTC.startRecording(); + resolve(); + } catch (e) { + reject(e); + } + }); + }; + + /** + * This method stops the recording. + * @method + * @memberof RecordRTCPromisesHandler + * @example + * recorder.stopRecording().then(function() { + * var blob = recorder.getBlob(); + * }).catch(errorCB); + */ + this.stopRecording = function() { + return new Promise(function(resolve, reject) { + try { + self.recordRTC.stopRecording(function(url) { + self.blob = self.recordRTC.getBlob(); + resolve(url); + }); + } catch (e) { + reject(e); + } + }); + }; + + /** + * This method returns data-url for the recorded blob. + * @method + * @memberof RecordRTCPromisesHandler + * @example + * recorder.stopRecording().then(function() { + * recorder.getDataURL().then(function(dataURL) { + * window.open(dataURL); + * }).catch(errorCB);; + * }).catch(errorCB); + */ + this.getDataURL = function(callback) { + return new Promise(function(resolve, reject) { + try { + self.recordRTC.getDataURL(function(dataURL) { + resolve(dataURL); + }); + } catch (e) { + reject(e); + } + }); + }; + + /** + * This method returns the recorded blob. + * @method + * @memberof RecordRTCPromisesHandler + * @example + * recorder.stopRecording().then(function() { + * var blob = recorder.getBlob(); + * }).catch(errorCB); + */ + this.getBlob = function() { + return self.recordRTC.getBlob(); + }; + + /** + * @property {Blob} blob - Recorded data as "Blob" object. + * @memberof RecordRTCPromisesHandler + * @example + * recorder.stopRecording().then(function() { + * var blob = recorder.getBlob(); + * }).catch(errorCB); + */ + this.blob = null; +} + +if (typeof RecordRTC !== 'undefined') { + RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler; +} diff --git a/yknjs/reveal.js-plugins/audio-slideshow/plugin.js b/yknjs/reveal.js-plugins/audio-slideshow/plugin.js new file mode 100644 index 0000000..536a8b7 --- /dev/null +++ b/yknjs/reveal.js-plugins/audio-slideshow/plugin.js @@ -0,0 +1,450 @@ +/***************************************************************** +** Author: Asvin Goel, goel@telematique.eu +** +** A plugin for reveal.js allowing to automatically play audio +** files for a slide deck. After an audio file has completed +** playing the next slide or fragment is automatically shown and +** the respective audio file is played. If no audio file is +** available, a blank audio file with default duration is played +** instead. +** +** Version: 1.0.0 +** +** License: MIT license (see LICENSE.md) +** +******************************************************************/ + +window.RevealAudioSlideshow = window.RevealAudioSlideshow || { + id: 'RevealAudioSlideshow', + init: function(deck) { + initAudioSlideshow(deck); + } +}; + +const initAudioSlideshow = function(Reveal){ + // default parameters + var prefix = "audio/"; + var suffix = ".ogg"; + var textToSpeechURL = null; // no text to speech converter +// var textToSpeechURL = "http://api.voicerss.org/?key=[YOUR_KEY]&hl=en-gb&c=ogg&src="; // the text to speech converter + var defaultNotes = false; // use slide notes as default for the text to speech converter + var defaultText = false; // use slide text as default for the text to speech converter + var defaultDuration = 5; // value in seconds + var defaultAudios = true; // try to obtain audio for slide and fragment numbers + var advance = 0; // advance to next slide after given time in milliseconds after audio has played, use negative value to not advance + var autoplay = false; // automatically start slideshow + var playerOpacity = .05; // opacity when the mouse is far from to the audioplayer + var startAtFragment = false; // when moving to a slide, start at the current fragment or at the start of the slide + var playerStyle = "position: fixed; bottom: 4px; left: 25%; width: 50%; height:75px; z-index: 33;"; // style used for container of audio controls + // ------------------ + + var silence; + var currentAudio = null; + var previousAudio = null; + var timer = null; + + Reveal.addEventListener( 'fragmentshown', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } +//console.debug( "fragmentshown "); + selectAudio(); + } ); + + Reveal.addEventListener( 'fragmenthidden', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } +//console.debug( "fragmenthidden "); + selectAudio(); + } ); + + Reveal.addEventListener( 'ready', function( event ) { + setup(); +//console.debug( "ready "); + selectAudio(); + document.dispatchEvent( new CustomEvent('stopplayback') ); + + } ); + + Reveal.addEventListener( 'slidechanged', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } +//console.debug( "slidechanged "); + var indices = Reveal.getIndices(); + if ( !startAtFragment && typeof indices.f !== 'undefined' && indices.f >= 0) { + // hide fragments when slide is shown + Reveal.slide(indices.h, indices.v, -1); + } + + selectAudio(); + } ); + + Reveal.addEventListener( 'paused', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } + if ( currentAudio ) { currentAudio.pause(); } + } ); + + Reveal.addEventListener( 'resumed', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } + } ); + + Reveal.addEventListener( 'overviewshown', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } + if ( currentAudio ) { currentAudio.pause(); } + document.querySelector(".audio-controls").style.visibility = "hidden"; + } ); + + Reveal.addEventListener( 'overviewhidden', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } + document.querySelector(".audio-controls").style.visibility = "visible"; + } ); + + Reveal.addKeyBinding( { keyCode: 171, key: '+', description: 'Toggle audio' }, function() { + if ( currentAudio ) { + if ( timer ) { clearTimeout( timer ); timer = null; } + currentAudio.paused ? currentAudio.play() : currentAudio.pause(); + } + } ); + + function selectAudio( previousAudio ) { + if ( currentAudio ) { + currentAudio.pause(); + currentAudio.style.display = "none"; + } + var indices = Reveal.getIndices(); + var id = "audioplayer-" + indices.h + '.' + indices.v; + if ( indices.f != undefined && indices.f >= 0 ) id = id + '.' + indices.f; + currentAudio = document.getElementById( id ); + if ( currentAudio ) { + currentAudio.style.display = "block"; + if ( previousAudio ) { + if ( currentAudio.id != previousAudio.id ) { + currentAudio.volume = previousAudio.volume; + currentAudio.muted = previousAudio.muted; +//console.debug( "Play " + currentAudio.id); + currentAudio.play(); + } + } + else if ( autoplay ) { + currentAudio.play(); + } + + } + } + + + function setup() { + // set parameters + var config = Reveal.getConfig().audio; + if ( config ) { + if ( config.prefix != null ) prefix = config.prefix; + if ( config.suffix != null ) suffix = config.suffix; + if ( config.textToSpeechURL != null ) textToSpeechURL = config.textToSpeechURL; + if ( config.defaultNotes != null ) defaultNotes = config.defaultNotes; + if ( config.defaultText != null ) defaultText = config.defaultText; + if ( config.defaultDuration != null ) defaultDuration = config.defaultDuration; + if ( config.defaultAudios != null ) defaultAudios = config.defaultAudios; + if ( config.advance != null ) advance = config.advance; + if ( config.autoplay != null ) autoplay = config.autoplay; + if ( config.playerOpacity != null ) playerOpacity = config.playerOpacity; + if ( config.playerStyle != null ) playerStyle = config.playerStyle; + } + + if ( 'ontouchstart' in window || navigator.msMaxTouchPoints ) { + opacity = 1; + } + if ( Reveal.getConfig().audioStartAtFragment ) startAtFragment = Reveal.getConfig().audioStartAtFragment; +setupAudioElement + // set style so that audio controls are shown on hover + var css='.audio-controls>audio { opacity:' + playerOpacity + ';} .audio-controls:hover>audio { opacity:1;}'; + style=document.createElement( 'style' ); + if ( style.styleSheet ) { + style.styleSheet.cssText=css; + } + else { + style.appendChild( document.createTextNode( css ) ); + } + document.getElementsByTagName( 'head' )[0].appendChild( style ); + + silence = new SilentAudio( defaultDuration ); // create the wave file + + var divElement = document.createElement( 'div' ); + divElement.className = "audio-controls"; + divElement.setAttribute( 'style', playerStyle ); + document.querySelector( ".reveal" ).appendChild( divElement ); + + // preload all video elements that meta data becomes available as early as possible + preloadVideoELements(); + + // create audio players for all slides + var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' ); + for( var h = 0, len1 = horizontalSlides.length; h < len1; h++ ) { + var verticalSlides = horizontalSlides[ h ].querySelectorAll( 'section' ); + if ( !verticalSlides.length ) { + setupAllAudioElements( divElement, h, 0, horizontalSlides[ h ] ); + } + else { + for( var v = 0, len2 = verticalSlides.length; v < len2; v++ ) { + setupAllAudioElements( divElement, h, v, verticalSlides[ v ] ); + } + } + } + } + + function preloadVideoELements() { + var videoElements = document.querySelectorAll( 'video[data-audio-controls]' ); + for( var i = 0; i < videoElements.length; i++ ) { +//console.warn(videoElements[i]); + videoElements[i].load(); + } + } + + function getText( textContainer ) { + var elements = textContainer.querySelectorAll( '[data-audio-text]' ) ; + for( var i = 0, len = elements.length; i < len; i++ ) { + // replace all elements with data-audio-text by specified text + textContainer.innerHTML = textContainer.innerHTML.replace(elements[i].outerHTML,elements[i].getAttribute('data-audio-text')); + } + return textContainer.textContent.trim().replace(/\s+/g, ' '); + } + + function setupAllAudioElements( container, h, v, slide ) { + var textContainer = document.createElement( 'div' ); + var text = null; + if ( !slide.hasAttribute( 'data-audio-src' ) ) { + // determine text for TTS + if ( slide.hasAttribute( 'data-audio-text' ) ) { + text = slide.getAttribute( 'data-audio-text' ); + } + else if ( defaultNotes && Reveal.getSlideNotes( slide ) ) { + // defaultNotes + var div = document.createElement("div"); + div.innerHTML = Reveal.getSlideNotes( slide ); + text = div.textContent || ''; + } + else if ( defaultText ) { + textContainer.innerHTML = slide.innerHTML; + // remove fragments + var fragments = textContainer.querySelectorAll( '.fragment' ) ; + for( var f = 0, len = fragments.length; f < len; f++ ) { + textContainer.innerHTML = textContainer.innerHTML.replace(fragments[f].outerHTML,''); + } + text = getText( textContainer); + } +// alert( h + '.' + v + ": " + text ); +// console.log( h + '.' + v + ": " + text ); + } + setupAudioElement( container, h + '.' + v, slide.getAttribute( 'data-audio-src' ), text, slide.querySelector( ':not(.fragment) > video[data-audio-controls]' ) ); + var i = 0; + var fragments; + while ( (fragments = slide.querySelectorAll( '.fragment[data-fragment-index="' + i +'"]' )).length > 0 ) { + var audio = null; + var video = null; + var text = ''; + for( var f = 0, len = fragments.length; f < len; f++ ) { + if ( !audio ) audio = fragments[ f ].getAttribute( 'data-audio-src' ); + if ( !video ) video = fragments[ f ].querySelector( 'video[data-audio-controls]' ); + // determine text for TTS + if ( fragments[ f ].hasAttribute( 'data-audio-text' ) ) { + text += fragments[ f ].getAttribute( 'data-audio-text' ) + ' '; + } + else if ( defaultText ) { + textContainer.innerHTML = fragments[ f ].textContent; + text += getText( textContainer ); + } + } +//console.log( h + '.' + v + '.' + i + ": >" + text +"<") + setupAudioElement( container, h + '.' + v + '.' + i, audio, text, video ); + i++; + } + } + + // try to sync video with audio controls + function linkVideoToAudioControls( audioElement, videoElement ) { + audioElement.addEventListener( 'playing', function( event ) { + videoElement.currentTime = audioElement.currentTime; + } ); + audioElement.addEventListener( 'play', function( event ) { + videoElement.currentTime = audioElement.currentTime; + if ( videoElement.paused ) videoElement.play(); + } ); + audioElement.addEventListener( 'pause', function( event ) { + videoElement.currentTime = audioElement.currentTime; + if ( !videoElement.paused ) videoElement.pause(); + } ); + audioElement.addEventListener( 'volumechange', function( event ) { + videoElement.volume = audioElement.volume; + videoElement.muted = audioElement.muted; + } ); + audioElement.addEventListener( 'seeked', function( event ) { + videoElement.currentTime = audioElement.currentTime; + } ); + + // add silent audio to video to be used as fallback + var audioSource = audioElement.querySelector('source[data-audio-silent]'); + if ( audioSource ) audioElement.removeChild( audioSource ); + audioSource = document.createElement( 'source' ); + var videoSilence = new SilentAudio( Math.round(videoElement.duration + .5) ); // create the wave file + audioSource.src= videoSilence.dataURI; + audioSource.setAttribute("data-audio-silent", videoElement.duration); + audioElement.appendChild(audioSource, audioElement.firstChild); + } + + function setupFallbackAudio( audioElement, text, videoElement ) { + // default file cannot be read + if ( textToSpeechURL != null && text != null && text != "" ) { + var audioSource = document.createElement( 'source' ); + audioSource.src = textToSpeechURL + encodeURIComponent(text); + audioSource.setAttribute('data-tts',audioElement.id.split( '-' ).pop()); + audioElement.appendChild(audioSource, audioElement.firstChild); + } + else { + if ( !audioElement.querySelector('source[data-audio-silent]') ) { + // create silent source if not yet existent + var audioSource = document.createElement( 'source' ); + audioSource.src = silence.dataURI; + audioSource.setAttribute("data-audio-silent", defaultDuration); + audioElement.appendChild(audioSource, audioElement.firstChild); + } + } + } + + function setupAudioElement( container, indices, audioFile, text, videoElement ) { + var audioElement = document.createElement( 'audio' ); + audioElement.setAttribute( 'style', "position: relative; top: 20px; left: 10%; width: 80%;" ); + audioElement.id = "audioplayer-" + indices; + audioElement.style.display = "none"; + audioElement.setAttribute( 'controls', '' ); + audioElement.setAttribute( 'preload', 'none' ); + + if ( videoElement ) { + // connect play, pause, volumechange, mute, timeupdate events to video + if ( videoElement.duration ) { + linkVideoToAudioControls( audioElement, videoElement ); + } + else { + videoElement.addEventListener('loadedmetadata', (event) => { + linkVideoToAudioControls( audioElement, videoElement ); + }); + } + } + audioElement.addEventListener( 'ended', function( event ) { + if ( typeof Recorder == 'undefined' || !Recorder.isRecording ) { + // determine whether and when slideshow advances with next slide + var advanceNow = advance; + var slide = Reveal.getCurrentSlide(); + // check current fragment + var indices = Reveal.getIndices(); + if ( typeof indices.f !== 'undefined' && indices.f >= 0) { + var fragment = slide.querySelector( '.fragment[data-fragment-index="' + indices.f + '"][data-audio-advance]' ) ; + if ( fragment ) { + advanceNow = fragment.getAttribute( 'data-audio-advance' ); + } + } + else if ( slide.hasAttribute( 'data-audio-advance' ) ) { + advanceNow = slide.getAttribute( 'data-audio-advance' ); + } + // advance immediately or set a timer - or do nothing + if ( advance == "true" || advanceNow == 0 ) { + var previousAudio = currentAudio; + Reveal.next(); + selectAudio( previousAudio ); + } + else if ( advanceNow > 0 ) { + timer = setTimeout( function() { + var previousAudio = currentAudio; + Reveal.next(); + selectAudio( previousAudio ); + timer = null; + }, advanceNow ); + } + } + } ); + audioElement.addEventListener( 'play', function( event ) { + var evt = new CustomEvent('startplayback'); + evt.timestamp = 1000 * audioElement.currentTime; + document.dispatchEvent( evt ); + + if ( timer ) { clearTimeout( timer ); timer = null; } + // preload next audio element so that it is available after slide change + var indices = Reveal.getIndices(); + var nextId = "audioplayer-" + indices.h + '.' + indices.v; + if ( indices.f != undefined && indices.f >= 0 ) { + nextId = nextId + '.' + (indices.f + 1); + } + else { + nextId = nextId + '.0'; + } + var nextAudio = document.getElementById( nextId ); + if ( !nextAudio ) { + nextId = "audioplayer-" + indices.h + '.' + (indices.v+1); + nextAudio = document.getElementById( nextId ); + if ( !nextAudio ) { + nextId = "audioplayer-" + (indices.h+1) + '.0'; + nextAudio = document.getElementById( nextId ); + } + } + if ( nextAudio ) { +//console.debug( "Preload: " + nextAudio.id ); + nextAudio.load(); + } + } ); + audioElement.addEventListener( 'pause', function( event ) { + if ( timer ) { clearTimeout( timer ); timer = null; } + document.dispatchEvent( new CustomEvent('stopplayback') ); + } ); + audioElement.addEventListener( 'seeked', function( event ) { + var evt = new CustomEvent('seekplayback'); + evt.timestamp = 1000 * audioElement.currentTime; + document.dispatchEvent( evt ); + if ( timer ) { clearTimeout( timer ); timer = null; } + } ); + + if ( audioFile != null ) { + // Support comma separated lists of audio sources + audioFile.split( ',' ).forEach( function( source ) { + var audioSource = document.createElement( 'source' ); + audioSource.src = source; + audioElement.insertBefore(audioSource, audioElement.firstChild); + } ); + } + else if ( defaultAudios ) { + var audioExists = false; + try { + // check if audio file exists + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', prefix + indices + suffix, true); + xhr.onload = function() { + if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300) { + var audioSource = document.createElement( 'source' ); + audioSource.src = prefix + indices + suffix; + audioElement.insertBefore(audioSource, audioElement.firstChild); + audioExists = true; + } + else { + setupFallbackAudio( audioElement, text, videoElement ); + } + } + xhr.send(null); + } catch( error ) { +//console.log("Error checking audio" + audioExists); + // fallback if checking of audio file fails (e.g. when running the slideshow locally) + var audioSource = document.createElement( 'source' ); + audioSource.src = prefix + indices + suffix; + audioElement.insertBefore(audioSource, audioElement.firstChild); + setupFallbackAudio( audioElement, text, videoElement ); + } + } + if ( audioFile != null || defaultDuration > 0 ) { + container.appendChild( audioElement ); + } + } +}; + +/***************************************************************** +** Create SilentAudio +** based on: RIFFWAVE.js v0.03 +** http://www.codebase.es/riffwave/riffwave.js +** +** Usage: +** silence = new SilentAudio( 10 ); // create 10 seconds wave file +** +******************************************************************/ + +var FastBase64={chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encLookup:[],Init:function(){for(var e=0;4096>e;e++)this.encLookup[e]=this.chars[e>>6]+this.chars[63&e]},Encode:function(e){for(var h=e.length,a="",t=0;h>2;)n=e[t]<<16|e[t+1]<<8|e[t+2],a+=this.encLookup[n>>12]+this.encLookup[4095&n],h-=3,t+=3;if(h>0){var s=(252&e[t])>>2,i=(3&e[t])<<4;if(h>1&&(i|=(240&e[++t])>>4),a+=this.chars[s],a+=this.chars[i],2==h){var r=(15&e[t++])<<2;r|=(192&e[t])>>6,a+=this.chars[r]}1==h&&(a+="="),a+="="}return a}};FastBase64.Init();var SilentAudio=function(e){function h(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function a(e){return[255&e,e>>8&255]}function t(e){for(var h=[],a=0,t=e.length,s=0;t>s;s++)h[a++]=255&e[s],h[a++]=e[s]>>8&255;return h}this.data=[],this.wav=[],this.dataURI="",this.header={chunkId:[82,73,70,70],chunkSize:0,format:[87,65,86,69],subChunk1Id:[102,109,116,32],subChunk1Size:16,audioFormat:1,numChannels:1,sampleRate:8e3,byteRate:0,blockAlign:0,bitsPerSample:8,subChunk2Id:[100,97,116,97],subChunk2Size:0},this.Make=function(e){for(var s=0;s>3,this.header.byteRate=this.header.blockAlign*this.sampleRate,this.header.subChunk2Size=this.data.length*(this.header.bitsPerSample>>3),this.header.chunkSize=36+this.header.subChunk2Size,this.wav=this.header.chunkId.concat(h(this.header.chunkSize),this.header.format,this.header.subChunk1Id,h(this.header.subChunk1Size),a(this.header.audioFormat),a(this.header.numChannels),h(this.header.sampleRate),h(this.header.byteRate),a(this.header.blockAlign),a(this.header.bitsPerSample),this.header.subChunk2Id,h(this.header.subChunk2Size),16==this.header.bitsPerSample?t(this.data):this.data),this.dataURI="data:audio/wav;base64,"+FastBase64.Encode(this.wav)},this.Make(e)}; diff --git a/yknjs/reveal.js-plugins/audio-slideshow/recorder.js b/yknjs/reveal.js-plugins/audio-slideshow/recorder.js new file mode 100644 index 0000000..f068557 --- /dev/null +++ b/yknjs/reveal.js-plugins/audio-slideshow/recorder.js @@ -0,0 +1,392 @@ +/***************************************************************** +** Author: Asvin Goel, goel@telematique.eu +** +** A plugin for reveal.js allowing to record audio for a slide +** deck. +** +** Version: 1.0.0 +** +** License: MIT license (see LICENSE.md) +** +** Credits: +** - Muaz Khan for RecordRTC.js +** - Stuart Knightley for JSzip.js +******************************************************************/ + +window.RevealAudioRecorder = window.RevealAudioRecorder || { + id: 'RevealAudioRecorder', + init: function(deck) { + initAudioRecorder(deck); + } +}; + +var Recorder = { + audio: null, + audioStream: null, + recordRTC: null, + zip: null, + indices: null, + recordedAudio: null, + canvas: null, + isRecording: false, + isPaused: false, + + initialize : function initialize() { + this.audio = new Audio(); + this.audio.autoplay = true; + this.zip = new JSZip(); + + // Create canvas on which red circle can be drawn + this.canvas = document.createElement( 'canvas' ); + this.canvas.className = 'recorder'; + this.canvas.setAttribute( 'style', "position: fixed; top: 25px; right: 50px;" ); + this.canvas.width = 25; + this.canvas.height = 25; + document.querySelector( '.reveal' ).appendChild( this.canvas ); + + }, + + toggleRecording: function toggleRecording( override ) { + var wasRecording = this.isRecording; + if( typeof override === 'boolean' ) { + this.isRecording = override; + this.isPaused = false; + } + else { + this.isRecording = !this.isRecording; + } + // turn of recording if overview is shown or screen is black + this.isRecording = ( this.isRecording && !Reveal.isOverview() && !Reveal.isPaused() ); + + if ( !wasRecording && this.isRecording ) { + this.start(); + } + else if ( wasRecording && !this.isRecording) { + this.stop(); + } + }, + + start : function start() { + window.onbeforeunload = confirmExit; + function confirmExit() + { + return "You have attempted to leave this page. All unsaved audio recordings will be lost. Are you sure you want to exit this page?"; + } + + this.indices = Reveal.getIndices(); + + // determine audio element for slide + var id = "audioplayer-" + this.indices.h + "." + this.indices.v; + if ( this.indices.f != undefined && this.indices.f >= 0 ) id = id + "." + this.indices.f; + this.recordedAudio = document.getElementById( id ); + if ( !this.recordedAudio ) { + alert("Audio player is not found. Please check that audio-slideshow plugin is loaded!"); + } + + if ( !this.audioStream || !this.recordRTC ) { + navigator.getUserMedia( { audio: true, video: false }, function( stream ) { + if ( window.IsChrome ) stream = new window.MediaStream( stream.getAudioTracks() ); + Recorder.audioStream = stream; + Recorder.recordRTC = window.RecordRTC( stream, { type: 'audio' }, { bufferSize: 256 } ); + Recorder.recordRTC.startRecording(); + // Draw red circle over auto slide control + var context = Recorder.canvas.getContext( '2d' ); + context.beginPath(); + context.arc( ( Recorder.canvas.width / 2 ), ( Recorder.canvas.height / 2 ), ( Recorder.canvas.width / 2 ) - 3, 0, Math.PI * 2, false ); + context.lineWidth = 3; + context.fillStyle = '#f00'; + context.fill(); + context.strokeStyle = '#f00'; + context.stroke(); + // Let others know recording has started + document.dispatchEvent( new CustomEvent('startrecording') ); + }, function( error ) { + alert( 'Something went wrong in accessing the microphone. (error code ' + error.code + ')' ); + } ); + } + else { +// this.audio.src = URL.createObjectURL( this.audioStream ); // deprecated since FF54 + this.audio.srcObject = this.audioStream; + this.audio.volume = 0.0; + this.recordRTC.startRecording(); + // Draw red circle over auto slide control + var context = this.canvas.getContext( '2d' ); + context.beginPath(); + context.arc( ( this.canvas.width / 2 ), ( this.canvas.height / 2 ), ( this.canvas.width / 2 ) - 3, 0, Math.PI * 2, false ); + context.lineWidth = 3; + context.fillStyle = '#f00'; + context.fill(); + context.strokeStyle = '#f00'; + context.stroke(); + // Let others know recording has started + document.dispatchEvent( new CustomEvent('startrecording') ); + } + }, + + stop : function stop() { + this.audio.src = ''; + if ( this.recordRTC ) { + + this.filename = this.indices.h + '.' + this.indices.v; + if ( ( typeof this.indices.f != 'undefined' && this.indices.f >= 0) ) this.filename = this.filename + '.' + this.indices.f; + + this.recordRTC.stopRecording( function( url ) { + // add audio URL to slide + Recorder.recordedAudio.src = url; + + // add audio to zip + var blob = Recorder.recordRTC.getBlob(); + + Recorder.filename = Recorder.filename + '.' + blob.type.split( '/' ).pop(); + var reader = new window.FileReader(); + reader.readAsBinaryString(blob); + reader.onloadend = function() { + blobBinaryString = reader.result; + Recorder.zip.file( Recorder.filename, blobBinaryString, { binary: true } ); + Recorder.filename = null; + } + } ); + this.indices = null; + + } + + // Remove red circle over auto slide control + var context = this.canvas.getContext( '2d' ); + context.clearRect ( 0 , 0 , this.canvas.width , this.canvas.height ); + // Let others know recording has stopped + document.dispatchEvent( new CustomEvent('stoprecording') ); + }, + + next : function next() { + // Remove red or yellow circle + var context = this.canvas.getContext( '2d' ); + context.clearRect ( 0 , 0 , this.canvas.width , this.canvas.height ); + + this.audio.src = ''; + + if ( this.recordRTC ) { + this.filename = this.indices.h + '.' + this.indices.v; + if ( ( typeof this.indices.f != 'undefined' && this.indices.f >= 0) ) { + this.filename = this.filename + '.' + this.indices.f; + } + this.recordRTC.stopRecording( function( url ) { + // add audio URL to slide + Recorder.recordedAudio.src = url; + // add audio to zip + var blob = Recorder.recordRTC.getBlob(); + + Recorder.filename = Recorder.filename + '.' + blob.type.split( '/' ).pop(); + var reader = new window.FileReader(); + reader.readAsBinaryString(blob); + reader.onloadend = function() { + blobBinaryString = reader.result; + Recorder.zip.file( Recorder.filename, blobBinaryString, { binary: true } ); + Recorder.filename = null; + if ( !Recorder.isPaused ) Recorder.start(); + } + } ); + } + + if ( this.isPaused ) { + // Draw yellow circle over auto slide control + var context = this.canvas.getContext( '2d' ); + context.beginPath(); + context.arc( ( this.canvas.width / 2 ), ( this.canvas.height / 2 ), ( this.canvas.width / 2 ) - 3, 0, Math.PI * 2, false ); + context.lineWidth = 3; + context.fillStyle = '#ff0'; + context.fill(); + context.strokeStyle = '#ff0'; + context.stroke(); + } + + }, + + downloadZip : function downloadZip() { + var a = document.createElement('a'); + document.body.appendChild(a); + try { + a.download = "audio.zip"; + var blob = this.zip.generate( {type:"blob"} ); + a.href = window.URL.createObjectURL( blob ); + } catch( error ) { + a.innerHTML += " (" + error + ")"; + } + a.click(); + document.body.removeChild(a); + }, + + fetchTTS : function fetchTTS() { + function fetchAudio( audioSources ) { + if ( audioSources.length ) { + // take first audio from array + var audioSource = audioSources.shift(); + var progress = Math.round(100 * ( progressBar.getAttribute( 'data-max' ) - audioSources.length ) / progressBar.getAttribute( 'data-max' ) ); + progressBar.setAttribute( 'style', "width: " + progress + "%" ); + var filename = audioSource.getAttribute('data-tts'); + var xhr = new XMLHttpRequest(); + xhr.open('GET', audioSource.src, true); + xhr.responseType = 'blob'; + xhr.onload = function() { + if (xhr.readyState === 4 && xhr.status === 200) { + var blobURL = window.URL.createObjectURL(xhr.response); + filename += '.' + xhr.response.type.split( '/' ).pop().split( 'x-' ).pop(); + // convert blob to binary string + var reader = new window.FileReader(); + reader.readAsBinaryString(xhr.response); + reader.onloadend = function() { + blobBinaryString = reader.result; + // add blob to zip + Recorder.zip.file( filename, blobBinaryString, { binary: true } ); + // fetch next audio file + fetchAudio( audioSources ); + } + } + } + xhr.onerror = function() { + alert ( "Unable to fetch TTS-files!" ); + // remove progress bar + document.querySelector( ".reveal" ).removeChild( progressContainer ); + } + try { + xhr.send(null); // fetch TTS + console.log("Fetch TTS for slide " + audioSource.getAttribute('data-tts')); + } catch ( error ) { + alert ( "Unable to fetch TTS-files! " + error ); + // remove progress bar + document.querySelector( ".reveal" ).removeChild( progressContainer ); + } + } + else { + // generate zip for download + var blob = Recorder.zip.generate( {type:"blob"} ); + var a = document.createElement('a'); + document.body.appendChild(a); + try { + a.download = "audio.zip"; + a.href = window.URL.createObjectURL( blob ); + } catch( error ) { + a.innerHTML += " (" + error + ")"; + } + a.click(); + document.body.removeChild(a); + // remove progress bar + document.querySelector( ".reveal" ).removeChild( progressContainer ); + } + } + + var TTS = document.querySelectorAll('audio>source[data-tts]'); + if ( TTS.length ) { + // show progress bar + var progressContainer = document.createElement( 'div' ); + progressContainer.className = "progress"; + progressContainer.setAttribute( 'style', "display: block; top: 0; bottom: auto; height: 12px;" ); + var progressBar = document.createElement( 'span' ); + progressBar.setAttribute( 'style', "width: 0%;" ); + progressBar.setAttribute( 'data-max', TTS.length ); + progressContainer.appendChild( progressBar ); + document.querySelector( ".reveal" ).appendChild( progressContainer ); + + fetchAudio( Array.prototype.slice.call(TTS) ); + } + else { + alert("Either there is no audio to fetch from the text to speech generator or all audio files are already provided."); + } + } + + +}; + + +const initAudioRecorder = function(Reveal){ + Reveal.addKeyBinding( { keyCode: 82, key: 'R', description: 'Toggle recording' }, function() { Recorder.toggleRecording(); } ); + Reveal.addKeyBinding( { keyCode: 90, key: 'Z', description: 'Download recordings' }, function() { Recorder.downloadZip(); } ); + Reveal.addKeyBinding( { keyCode: 84, key: 'T', description: 'Fetch Text-to-speech audio files' }, function() { Recorder.fetchTTS(); } ); + + Reveal.addEventListener( 'fragmentshown', function( event ) { + if ( Recorder.isRecording ) { + if ( recordedAudioExists( Reveal.getIndices() ) ) { + Recorder.isPaused = true; + Recorder.next(); + } + else if ( Recorder.isPaused ) { + // resume recording + Recorder.isPaused = false; + Recorder.start(); + } + else { + Recorder.next(); + } + } + } ); + + Reveal.addEventListener( 'fragmenthidden', function( event ) { + if ( Recorder.isRecording ) { + if ( recordedAudioExists( Reveal.getIndices() ) ) { + Recorder.isPaused = true; + Recorder.next(); + } + else if ( Recorder.isPaused ) { + // resume recording + Recorder.isPaused = false; + Recorder.start(); + } + else { + Recorder.next(); + } + } + } ); + Reveal.addEventListener( 'overviewshown', function( event ) { + Recorder.toggleRecording( false ); + } ); + + Reveal.addEventListener( 'paused', function( event ) { + Recorder.toggleRecording( false ); + } ); + + Reveal.addEventListener( 'ready', function( event ) { + Recorder.initialize(); + } ); + + Reveal.addEventListener( 'slidechanged', function( event ) { + if ( Recorder.isRecording ) { + if ( recordedAudioExists( Reveal.getIndices() ) ) { + Recorder.isPaused = true; + Recorder.next(); + } + else if ( Recorder.isPaused ) { + // resume recording + Recorder.isPaused = false; + Recorder.start(); + } + else { + Recorder.next(); + } + } + } ); + + function recordedAudioExists( indices ) { + var id = "audioplayer-" + indices.h + "." + indices.v; + if ( indices.f != undefined && indices.f >= 0 ) id = id + "." + indices.f; + return ( document.getElementById( id ).src.substring(0,4) == "blob"); + } + + + +}; + + +/***************************************************************** +** jszip.js +******************************************************************/ + +/*! +JSZip - A Javascript class for generating and reading zip files + +(c) 2009-2014 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/master/LICENSE +*/ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.lengtha)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;gc;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";w+="\n\x00",w+=p||q?"\x00\b":"\x00\x00",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2);var x=f.LOCAL_FILE_HEADER+w+m+t,y=f.CENTRAL_FILE_HEADER+"\x00"+w+s(o.length,2)+"\x00\x00\x00\x00"+(j===!0?"\x00\x00\x00":"\x00\x00\x00\x00")+s(g,4)+m+t+o;return{fileRecord:x,dirRecord:y,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;cg&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;cb?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header) +};s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead=hb&&(a.ins_h=(a.ins_h<=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=hb&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<q&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<q&&(p+=B[f++]<>>=w,q-=w),15>q&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<q&&(p+=B[f++]<q&&(p+=B[f++]<k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whaven;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<n;){if(0===i)break a;i--,m+=e[g++]<>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.haven;){if(0===i)break a;i--,m+=e[g++]<>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Ab=c.lencode[m&(1<>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a; +if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<n;){if(0===i)break a;i--,m+=e[g++]<=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++hh?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++jj){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ab=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)}); diff --git a/yknjs/reveal.js-plugins/bower.json b/yknjs/reveal.js-plugins/bower.json new file mode 100644 index 0000000..e37b825 --- /dev/null +++ b/yknjs/reveal.js-plugins/bower.json @@ -0,0 +1,24 @@ +{ + "name": "reveal.js-plugins", + "version": "4.0.2", + "homepage": "https://github.com/rajgoel/reveal.js-plugins", + "authors": [ + "Asvin Goel" + ], + "description": "A collection of plugins for Reveal.js", + "keywords": [ + "reveal", + "plugin", + "audio", + "chart" + ], + "license": "MIT, Copyright (C) 2020 Asvin Goel", + "ignore": [ + "**/.*", + "menu", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/yknjs/reveal.js-plugins/chalkboard/README.md b/yknjs/reveal.js-plugins/chalkboard/README.md new file mode 100644 index 0000000..be96469 --- /dev/null +++ b/yknjs/reveal.js-plugins/chalkboard/README.md @@ -0,0 +1,140 @@ +# Chalkboard + +With this plugin you can add a chalkboard to reveal.js. The plugin provides two possibilities to include handwritten notes to your presentation: + +- you can make notes directly on the slides, e.g. to comment on certain aspects, +- you can open a chalkboard or whiteboard on which you can make notes. + +The main use case in mind when implementing the plugin is classroom usage in which you may want to explain some course content and quickly need to make some notes. + +The plugin records all drawings made so that they can be play backed using the ```autoSlide``` feature or the ```audio-slideshow``` plugin. + +[Check out the live demo](https://rajgoel.github.io/reveal.js-demos/chalkboard-demo.html) + +The chalkboard effect is based on [Chalkboard](https://github.com/mmoustafa/Chalkboard) by Mohamed Moustafa. + +Multi color support added by Kurt Rinnert [GitHub](https://github.com/rinnert). + +## Installation + +Copy the file ```plugin.js``` and the ```img``` directory into the plugin folder of your reveal.js presentation, i.e. ```plugin/chalkboard``` and load the plugin as shown below. + +```html + + + +``` + +In order to include buttons for opening and closing the notes canvas or the chalkboard you should make sure that ```font-awesome``` is available. The easiest way is to include +``` + +``` +to the ```head``` section of you HTML-file. + +## Usage + +### Enable & disable + +With above configuration the notes canvas is opened and closed when pressing 'c' and the chalkboard is opened and closed when pressing 'b'. + +### Mouse +- Click the left mouse button and drag to write on notes canvas or chalkboard +- Click the right mouse button and drag to wipe away previous drawings + +### Touch +- Touch and move to write on notes canvas or chalkboard +- Touch and hold for half a second, then move to wipe away previous drawings + +### Keyboard +- Press the 'DEL' key to clear the chalkboard +- Press the 'd' key to download chalkboard drawings +- Press the 'BACKSPACE' key to delete all chalkboard drawings on the current slide +- Press the 'x' key to cycle colors forward +- Press the 'y' key to cycle colors backward + +## Playback + +If the ```autoSlide``` feature is set or if the ```audio-slideshow``` plugin is used, pre-recorded chalkboard drawings can be played. The slideshow plays back the user interaction with the chalkboard in the same way as it was conducted when recording the data. + +## PDF-Export + +If the slideshow is opened in [print mode](https://github.com/hakimel/reveal.js/#pdf-export) the pre-recorded chalkboard drawings (which must be provided in a file, see ```src``` option) are included in the PDF-file. Each drawing on the chalkboard is added after the slide that was shown when opening the chalkboard. Drawings are also included if they had been cleared (using the 'DEL' key). Drawings on the notes canvas are not included in the PDF-file. + + +## Configuration + +The plugin has several configuration options: + +- ```boardmarkerWidth```: an integer, the drawing width of the boardmarker; larger values draw thicker lines. +- ```chalkWidth```: an integer, the drawing width of the chalk; larger values draw thicker lines. +- ```chalkEffect```: a float in the range ```[0.0, 1.0]```, the intesity of the chalk effect on the chalk board. Full effect (default) ```1.0```, no effect ```0.0```. +- ```src```: Optional filename for pre-recorded drawings. +- ```readOnly```: Configuation option allowing to prevent changes to existing drawings. If set to ```true``` no changes can be made, if set to false ```false``` changes can be made, if unset or set to ```undefined``` no changes to the drawings can be made after returning to a slide or fragment for which drawings had been recorded before. In any case the recorded drawings for a slide or fragment can be cleared by pressing the 'DEL' key (i.e. by using the ```RevealChalkboard.clear()``` function). +- ```toggleNotesButton```: If set to ```true``` a button for opening and closing the notes canvas is shown. Alternatively, the css position attributes can be provided if the default position is not appropriate. +- ```toggleChalkboardButton```: If set to ```true``` a button for opening and closing the chalkboard is shown. Alternatively, the css position attributes can be provided if the default position is not appropriate. +- ```transition```: Gives the duration (in milliseconds) of the transition for a slide change, so that the notes canvas is drawn after the transition is completed. +- ```theme```: Can be set to either ```"chalkboard"``` or ```"whiteboard"```. + +The following configuration options allow to change the appearance of the notes canvas and the chalkboard. All of these options require two values, the first gives the value for the notes canvas, the second for the chalkboard. + +- ```background```: The first value expects a (semi-)transparent color which is used to provide visual feedback that the notes canvas is enabled, the second value expects a filename to a background image for the chalkboard. +- ```grid```: By default whiteboard and chalkboard themes include a grid pattern on the background. This pattern can be modified by setting the color, the distance between lines, and the line width, e.g. ```{ color: 'rgb(127,127,255,0.1)', distance: 40, width: 2}```. Alternatively, the grid can be removed by setting the value to ```false```. +- ```eraser```: An image path and radius for the eraser. +- ```boardmarkers```: A list of boardmarkers with given color and cursor. +- ```chalks```: A list of chalks with given color and cursor. +- ```rememberColor```: Whether to remember the last selected color for the slide canvas or the board. + +All of the configurations are optional and the default values shown below are used if the options are not provided. + +```javascript +Reveal.initialize({ + // ... + chalkboard: { + boardmarkerWidth: 3, + chalkWidth: 7, + chalkEffect: 1.0, + src: null, + readOnly: undefined, + toggleChalkboardButton: { left: "30px", bottom: "30px", top: "auto", right: "auto" }, + toggleNotesButton: { left: "30px", bottom: "30px", top: "auto", right: "auto" }, + transition: 800, + theme: "chalkboard", + background: [ 'rgba(127,127,127,.1)' , path + 'img/blackboard.png' ], + grid: { color: 'rgb(50,50,10,0.5)', distance: 80, width: 2}, + eraser: { src: path + 'img/sponge.png', radius: 20}, + boardmarkers : [ + { color: 'rgba(100,100,100,1)', cursor: 'url(' + path + 'img/boardmarker-black.png), auto'}, + { color: 'rgba(30,144,255, 1)', cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'}, + { color: 'rgba(220,20,60,1)', cursor: 'url(' + path + 'img/boardmarker-red.png), auto'}, + { color: 'rgba(50,205,50,1)', cursor: 'url(' + path + 'img/boardmarker-green.png), auto'}, + { color: 'rgba(255,140,0,1)', cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'}, + { color: 'rgba(150,0,20150,1)', cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'}, + { color: 'rgba(255,220,0,1)', cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'} + ], + chalks: [ + { color: 'rgba(255,255,255,0.5)', cursor: 'url(' + path + 'img/chalk-white.png), auto'}, + { color: 'rgba(96, 154, 244, 0.5)', cursor: 'url(' + path + 'img/chalk-blue.png), auto'}, + { color: 'rgba(237, 20, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-red.png), auto'}, + { color: 'rgba(20, 237, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-green.png), auto'}, + { color: 'rgba(220, 133, 41, 0.5)', cursor: 'url(' + path + 'img/chalk-orange.png), auto'}, + { color: 'rgba(220,0,220,0.5)', cursor: 'url(' + path + 'img/chalk-purple.png), auto'}, + { color: 'rgba(255,220,0,0.5)', cursor: 'url(' + path + 'img/chalk-yellow.png), auto'} + ] + }, + // ... + +}); +``` + + +## License + +MIT licensed + +Copyright (C) 2020 Asvin Goel diff --git a/yknjs/reveal.js-plugins/chalkboard/img/blackboard.png b/yknjs/reveal.js-plugins/chalkboard/img/blackboard.png new file mode 100644 index 0000000000000000000000000000000000000000..50a2f6435287dec404a8d2107fa21f86ddaf4ba8 GIT binary patch literal 32733 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 a|2XCdq$HyJiB6J$lLNg4H>x#oiTodH$#--B literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-black.png b/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-black.png new file mode 100644 index 0000000000000000000000000000000000000000..170b520061b66e1d24e888836e893e5a865c01bb GIT binary patch literal 2142 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 FV1oGf3+Vs= literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-green.png b/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-green.png new file mode 100644 index 0000000000000000000000000000000000000000..28a42218c9c8deeca5c2155987d12b36339d114b GIT binary patch literal 2106 zcmV-A2*vk_P)CR~gG2T~;n zC2FfwRnsa})kY;%l*?PCK2(X)KJ}sMOW!IbYMVkpn2;|n;jH_zT| zc0IGRvoog;i`!HcDvDs;^EC4`pO^EW?>Vfcr6us=H(vSOTKAd_cfY(dTPPHA_&-{- zy>nCW!^p*hQ}x=LufF;7zbJ}Qx6-JuF6MMrxqG(ypFef&995OV`hDAWZcNU_V%dAy zJ1dO?0G3LnBHw%NJKMwgWZP6BMsBs|J1cXvnkJ1Kd0kgm9BA8i@%-5M$NdKepT1s< z)o~7LZFYKwx}Vq{Z0l;cd1LabWm$z40|Ef&oYgC?^-DF}pEdKWpqXqc7hPN1vu^jk zz|OARz1(6luFk9&(6TID%VeXSHBIh#jp4NfO64jC@vd5nt5&#Up@|(3qxx7rvvjxI zK)U>(s_M1ut;7*uWwQaxMm~|nx%nyb{jOnRnO3#%Lf1Q$_0^sg0|LP0jmgu`c(&c6 z8G}O+kcy`9o4>!0*LHr37@E=I`cdFrL6K@#44BX76H9k8m*gS=3=5DMV#yTVz5NMZ z-TE9BNTF}@i-W&sj7jAJvah}nLL|yb3wKga#?-2z2n3X3KAnP4A>dHY0rL96m%J{A zvuFoV-+S zATpWE9JRrkl={MwZ1xnnExtbZUA(;Qc`(W#%Muu+bocI|Jr^!q_#zw*Pn8u20E>%@ zb5(L>mB-!8p7L$$eAYWe852MW0SDkvWQd|94)5K&fAph|&ZJVQXjy>(_`<@%Ei9Rf zTUxxeO-)T6(<~54l0j){UnzW;T^d6}x-7yD6o$ zj0uDZA_yg5lt2LoJjsf6h1p?rzs!pl%D);;STP&;Slq3;?Ab@i~ z6h#PvKzh2nHz!l6;*~2`&XyYp&bg_o>eNzhNeKpn0ZrE=Symu01`a@$BrwM4jvYI8 z{9|HbZgzI|^RfbgQcy&r(HYKpU9ZpQ(=?4qvJ6HkY;Y)w3?>L{&z{}Gr%#_AOC%DH zBzPYh2mpmbVKE#I->IyuTGiXy}1s;Sgwd2*Nl&kkK${NpRWz%oLj1@-dxBmAP@`&^SY);vP}N9vt@}; zM#;dyKxl4mE;BJPaiOe00I+Sl5R1iTwI$6N>ON?}o7U%zToXGiG7$cgtX%QDLf1WI9{s;b`W^Yxa( zf)PO!K>#quAjuNh(Aw7Gs;+K1bLPzPhZ#SQ6bOJPlga6LJZ^_VeF3v*R*Iqofe8Qs z1VMlx2*l^}b*D2Ke);m{zm*#Z&UsN))tkDmI|6}#U(=Q(S(ZUr=~I#4 z{v8%hr?b)1zOlnF@}++^Eqzicg@v?Z$M)e9Cq6jwps;vsK%f*BsZ=W6(9qD-;BIKO zEenz)6GA9JI2;az)YR0tLZQ&m;loG%SSF@9FyM22uef|3N zi)94@rLc%ZBGa0#IsJja7G2jwNm0P)a{b8Ai+TJxGyde=Nce`OE?qAx5CDqBVlEnu z&MLC9+UxapX_`it&oxttFY(Uj$4PP_L#N&Pej3SrY%dz&vH}6XFpP987MrhjRW~*_ zulE$qBDtvE#7jrs!l~KIIMDS3u?$m*wb6ZKB7L~*Kmf>Qv*CC=zSz>-vhmaTFV?;F z=^x0VWPuw+T+PhkhyJIql-H|0t|q!7KmbUm(=)xjz5N^dHwQkv^a-&E2P!3)IRiOv z;J3qXz)-XED+UC>XJ%$*UVHK7XI!qTn)5fVf(sO(bshLg^FgjJW+#62_S?T)L0@Tg zcX#idoW7a*_OE|xKmCgz*drf|SceY1a@ON%e-;2CD-8sIfq|{xbT}*O`h&skpI!QF k^2X%kSS%Jh&p9vt6PICzSH!DRyZ`_I07*qoM6N<$f(wfA!2kdN literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-orange.png b/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-orange.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8c2d2bb415d576f49c8faea365d8a90f04614f GIT binary patch literal 2240 zcmV;x2tW6UP)ftU@_RnfQ@S~7@LcYjlp1pFExq1IH~R8 z)JdAgk(#QNsx}W%t336gRWEOCrAkp$sfyGpPfah0l2*M1;}{HP7nX~`c){!%_QJBu z?(BVMcjokA?I>-PI!^J@?`>XYemZB)@B4p8*j`!LbpBk=SD9Q;yt3k7;+*UFKPuYW zbG+|L>Ecg*ak>88*MIus-!aC_8x8gG5^C%A9B445Ey2mZ2^}?sdn($_?OY8-Lo0s2 zbEDw^0A{nf>iXMnxPN=GlwW_*#C<=gH)j6yOMhKmUB^bV0f3-sTErPhtbFU4&Wi@#!nZf>n}4PSWWBNHPX<>z5F@`fK5MPkY0yusPv$xyB5`$mRo( ze*D4X@!WFgRAw>A3m#%01%STKm z)0V!zz8AKv-L5oZYeb@eL4i!j0n?5aknN{P$+2h68ezu5!a`70RcBrSbzM)pS5=&S z`8#d;?dyd^OAsaiIuVhn?7*hJ??EUmC9Q`JH7zbKuDRXrKs+Az<_!=4_j1&o{R>3)k$QTF!LI@ODhN37+`;qp8gM&j0kx0ay&1TnKKc9FK)9JJt3Werv zR@*>tZ|^f{EnO%I0ueM1F^GZ)01zb+q99=B&YhKog@q-PQ&a9}H0r`S_U=#RvOplP==FI0r%#_g z7mY>)Cd&{65u9_#G6NxmG&VKXCK8G4y?ggUs;av33J3sBr_;{4A+@$1>W;@_l*tMN zL4aWZCPfAS($>~?U~cZt>eAAZHC|R4NtDDZHmthA)0I;-oDWR}wp07a1@3Zm5A z-PLyE#_+=0+L|Ym$^1|HdE|bo>w0=*c;tgqCr>^_DcwvcA(AM85&}Xf6j?@rsi2^# zv2owkfq}VbG`egUhL$%#07#`$s?BB_vh-Rmrc>!6QIa5vA_#K&kt7La+sZaqS65e$ zjg2j-s_Oi#`uWU>L{(Mq-0ivBXU?3t5Q|2cEXxoC0UUtDBnX6(n(FEu0GPw!2!_Mq zyLkl!0H4q22(ATVCr%uHG8&CirsPgGH#ihU0Rc!$OUu5Mm6f>D>Ga3raZg?W0bt%S zKWZu{C~n^0+?j~Sb0=HOIr4#iy1TksXJ%)8KA+G3sB_JFgidZBw_mH;QPr^Xb5#u) zO(T-TK<{t2$)o@PJ$CHq;Tt!G?*@ZG&!fyW>ynB&=UJ=O+TY&ZcG7G%SLucUNs>S) z1tB^8NTS3#Iyw#x4-YRyA`zdaX`f0z>lWLy*=%C;=4gM<6Fpxr45LI41R{ze2&JHu zK$aOPHk*r@nws_vT)XB_Rn^5gf9PDZu5(2qkqB8wt;3dH%NJA0RDr}8g!{ol5=Drj zNXpC0x0aP{t(cgYaI31ih=&A=bsv1f;jr7e=yaVq`{enE8WEWye+0>x1WGBXudm<5 zITu|nS7>c*?Z4{hu}o&m%gZx~L{jhU>^v2VMX4++pp=4hK$c|?fE+q>uyKBVA?S2E zy~$+KpI1Ntn4O&+E-EZ4YiMX_OC%FS&W#E8^`ihBr2BaH;faY!cQ63&QK`iOQ+NSp`XV(d>e+586C9_ zbRO;OF_}yi03b1z(+>y~Stg1}Q4Sn9(AeMKe>)nDy8r!J<+0xmXqpxs8M%4&si)5M zrPHY*Q51P{0)c?j=%V?$$YG9D#mWn~pJv$NK`0s?^3>71a1O0BJ}$7Asrd7vNgTs!3PAlYaA+5YFh z{?b{;8o4(!Gi%Q)AOJo&IeC4{=FL0n>grmOsU&1sA(RTx7Y89t{SiiRg`{k6(aW!X zzqj8uKbUVo05HbK#|N65n>#jd*;1qHSz?-dAKCX`McQ>8CGF25&cJX~|-< zx$69p-A7_G9||Jp5CtFu4QVJOeg5a$6Nf@qLVKhi45U- zn()YW3&wVR&FKH|!~R>-(*ql}f&ef#H#fe0M^(MB>#$TI8x;;yQ&Q{rhVX}X-uug& zZ~p2>%gf7y8}<)AD8`uS(xpqUd6r#{P&jJT*46D992|Vt@Appt;Qs{h-P4jXxLaKS O0000~$IV8*S3jU9VZi+YO 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 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-yellow.png b/yknjs/reveal.js-plugins/chalkboard/img/boardmarker-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..23e87f52e2961d8d6843009de2318156d92c86f4 GIT binary patch literal 2105 zcmV-92*&q`P) zyL51~Gj!xB`wzd}f0lDzzS5=#ila&D+nrmogI z1E+pI-QB(IJA@Fvk~RhaQcC%?XP*C78UMH(G6T!b5wCKt?73$;_S6LSbWBXmrgh!C zV;IKLib+GEV9&*~ucfCi2q*rrCKHz`W$N;moW!Lj=hmm)*6)A!i=&F76uIqU_ZR7O zdNPyqv0Y!lQ%ug2ys->Tk)*inyCjqN8`;uaQs?pQ^`AcTK_39=IuHP2vDujyzPay3 zYFrSU19|H<;KWhpdzoaDZ;{B3mM5o^>z1!v8UDa6AboI?$z)=Oj@>?`>nfxLFha4U zkH9w1psezHxSM#BzWUPoSA`IMw}9+(dncJ(^lqrL+E!QSr9uTH2y|-#8m|Rqdr?yT ztY;}tiv|Y=kHUqk{yY$=^qr9#lVx^C6A71k4NVgimd&8k4iwe=3<~#=a96l>cz8H7 zHa7N=>p&@`oxZIP&m>nBbv9e=9#tv^e+6vSPXWfD2?53!-MxGF&VhjoH{$X5h^s&V za2!WpNIRo>V~syl^Yq4i$qSSzDhMbbB|IJtT;)o4clT5M{rzXN*=)>JAOIMKkr|uR zM{Mur`no_MU^@=soP$sbLI6z&6nnj%)|QqXhkAQ^4a3N|3IqVtG#93)XJ(#Q|3q_n zdHGt#7*SLe1O${(a8*TBRaIpu6zb^h?S02_9NkqQ0OWGHsfqE4Oehp;)ihDTxk?yQ zKnQ`VDnwBf5)1^^sa&l)d-hx}0NYg{0Awu{S3JAc-X0zAhu{hhleOp-9b(ISZOkt2xLem5&r8E+WgolQP zZcR)~eCjq3j^h~f^Yg=ViMfjQ_O=$&G#TdtlrcyNcr*Cexw(>UU0vbhmy{!NXIjizN%Rpp?J0g&)$9>P_w?u|kAD*^9yt(zb0>S}dMp-G!`s4JO~X)y5TLa1W^1AlEOtgB;foh9&P+{B4Y>`3 z<2YtAnY_9%zu;?YZ+p@*O~yqbSU8aIXj%ceGtzVX`00gmiA*+H(E+wfwF4t*Bv|OKt+; zIF6N0r>`bv6Q$v<&NkD~6)rqr^nUu$KxCfuG#~4E`k8%SedpavZ|l0Aa}9V8sn5^P z4_lV)Z*1JyXxS!J3v&_DoIp|jFp+mZp_SebA8Xt8a@&DJAO6)d zej=1bn6?RN{~cw%ALI7Ifb-^`M^CQ^5CE2zmL?&k`1UvaU)Hndi9#K4g<{#x!E$oA zQ}i2h_QJ%a6$1jm^z_W7)&5h0iH$MFIy=~UHcXwFFjvREp|ASXPUbk-D9snv?X&?Z2z23*yRj=+21{>R|s{Fxs j4jlMnI-Pz`N@@KA_3U%TKl-+c00000NkvXXu0mjf*%$6m literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/chalk-blue.png b/yknjs/reveal.js-plugins/chalkboard/img/chalk-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f70c2991ee48c22d5e65b64f9799686ae6c33a6e GIT binary patch literal 5150 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 M07*qoM6N<$f;c6y;{X5v literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/chalk-green.png b/yknjs/reveal.js-plugins/chalkboard/img/chalk-green.png new file mode 100644 index 0000000000000000000000000000000000000000..39f3b20fc7fb1755496e83b7ce85620d99326743 GIT binary patch literal 4801 zcmV;y5Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Re2o@6tH3yIWf&c&q^GQTO zR9M5sm|Lt|WfjN&|8LLb3@yE24F()$52;!OZ?Op)jh6@XK~2OLiI*3n5BfkPK47#_ z6OB+ILAf>dO1Y$s5hzswBS;9^BEe`uti?mmX=^X%%${@Rwr5|zwS3rn=A6>1By^wi zB|9_OvuEd*|62d`t@ZJRm#1;<;F`-(wp zui!Tue|=l^)3tAFr~m=8)&LU(1c2ft2(CT0ZhB@p0L{MAL!`mSH67gnWL6-jEI~mg+Ka zxSlK61rc$bV_9XUm__!4D6}h?-VQE>!LCNzUA1%yh8m|Y#4T9uA<__lg(2YNkjQdU zyD|#(2SMDvbU6rY5BCmFq%S3H9Y|kejYtSguA~4Up@Bku&F&d|^@^5z!;*x!S*{<{ zzU&Ei4o=Ex+tscFYBdI+Fa$IYH3{uWW*P^8!7UBX{n%0{2v)hz9v`3#$=w44gjlwL+C)EgWNR4cN(7i<-!30fMq@|o;)3HA9&J} zzIG+lRFg3zkQMO~p&bDd03`qhw>LcZ>cRn=PCa3bJJNq7e~3+IeH88PP_`}oCStDD&n^`Ja=QEfO)8W)_8|KnodOz_#HSL zYDW?ss-?-59NBMzklFE0vjztDH$3;!LIHEgy-jZJf1!*e$k4w(P* zL5=l~!A`#|XRHrJsB>b+&K|8AAzjG|c?S7|hUb2+aKNThk67WIa@tM?+Xr)qG}KUI z?TYX$rXc0Lt06C}-@b^Z5`Ix4q%5 z?sX>0Lo|3Me9)gyk0gDT8Hp!W?b+$bT3*B#O!M`I=YF%W5HC_OMu~T*uZP1Oen;lT zht*i;MHWA&3h-hBnHOkZfieIGw>3QXBZUIykh83Evzs>7n_C-!5Sea$K%44Fu3P@L5P|$i{`68lHQ7u?l989agwmJUJEK>vs`osEMXJXU`S9DufzLLI;t63?%vs_YN9hPZW;ds|(nLw)0zJO~DK)eOO<+uAkd$dqM0O+9i z5{awqk@U?@vs`s9b4u!~VU1*IbO?}}W~e}{;A#UX-UGpj!U5Ns)o};CBO2<5y-slXmlx0OpXdc1-VLd)#h-V50o~ii21k4MA3O$lNq$H4#4*!M~~Vu)$I;VjHVG z5I-Ky#m`0|S1>`OA~O~mDd=RqV|qBz;O@SPC##kWaB_MI_C)H#;1;!dJlyT~?Z485 zt7t)}b_Hso$y1^AzuS%Fl$~LXPn)8lUVAXrbn3@g=1;XJy6u+uhCU#*=?)8N)# z?EkPENXzy(!5f=S{nZkdVKtrllT#BXcG;upH-Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Re2o?|;D1f+eUjP6I#7RU! zR9M5sm|KipWfjN&>-+ZY3^Q|1X`!V(l@`jirxJw+6DNk4$eW4!BGLG!56**;_#lZy zeUbx`pe+nuKtwKH5L7S%;g&*4S|~-J2yLhKbSUl2oSC!FZC}6reanZv&$JytjPy*u zWIvsKlHXoy{nz?`i}t?NfPeSrH@KGgt}W^7<0TOTcsnuEx!^%b9_ddV~0F(xV031mG=u@p1r~Jyqe_VoD@VeEe}AJpt2Fn!u}K9{Mg*1xBnr{^ z;gV=BDw?=8v=pCPsQ>_MZ#-btdv|(1x%z^#?X4TPOAMB-B_xn{Kf?@55;Bvke8dp| zXbS^QWn%K#p#m0=b8*y-56vZ)ZC&r#o-J%kkYx#apJ-ymkb>Yy0y9ncyQU6TCMMq) zN{UZCw!{;yKtKPx-Tp!^F}-eV;>Y)M_kiKiv9Xk*9XLcU! zFEDf9hgtzJM1Y{&R0sl$$wfoCXs#l{_C~!X&M4q?u_fL2$iB|pzfL4= zZ8+@4MhT(r1 zLFRP_!+Soz2LAH!-gfiILfSTl<94Vs08Erea**m!F*=dSMI-1t zje6~yLkHZlX)|nz`~5)gxqr7m-%m_0Qk(>d(Sq{kn71FmwFvD{BT`FE{HKk2?V6zi z7WEi-4sCBNq(}a=x80V6uoGz&rbY`Q9`r~;9?51egVKN{s6vGM8}-`Sp#m0=Gp}3PdTuy|$h9Z&=5Y3E9diJ6DOOS*_GqeFlT>*fuXuUY4D-)A13@w67e-wBy&3M;?FZ+x0y)0lL_5-bp zF?}-PHlZ79bYnA^G(T$8YhM~VV5wY99E*0$b+YLPcKfX)<2cDo+Kux`b2_BJLO(;C zi^d|tosD|!(xCztkjFiTe!l;`c?Y^+fpX|8jl( zziMzO)ZJ-L1Ny1V7K3H zM>^1qv>gr>C?`$ss4LJ8HTsExEdfDvTcci^7%E@^Iq%wZ%gkar_t2hp2S6Mvll5Z5 z@AI0Dz-%{nK9)d<2={&1_4Q-d;Iew0W7Uh_ZK-WiQ0dAGJS$X2I#LM75;P!{#kA?h z24kLt6ts$gOWM1p9I(-oA{s}`^ibs5YhJ=_1g7A z1uP)jjzzb$0)71VFZ-QHnOJGg1{;Y}&!{V~*v}B8xoC*6qfxJI9V%b}`IhIOwG z5{@O7@@-3j%rN>fqf(L}&^iV-_%BZVZK!~SXx=2Et<&?#c^9sB+_mGD6{RdZTaYCP zT-2i@2|>zGCKnBZKFN%ChYo0a^pdH-SvsY1HHtdNZju6Dkw6>3tEF=F c?d9+N2W^z;=u>E^>;M1&07*qoM6N<$f{9LPe*gdg literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/chalk-purple.png b/yknjs/reveal.js-plugins/chalkboard/img/chalk-purple.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd29fb85484cddbe9bcc71a87f7b9a8b243b9b8 GIT binary patch literal 5250 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 IM6N<$f^h91asU7T literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/img/chalk-red.png b/yknjs/reveal.js-plugins/chalkboard/img/chalk-red.png new file mode 100644 index 0000000000000000000000000000000000000000..18d4dc7893adb93ee7feb3beb066d63de403e3f1 GIT binary patch literal 4786 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 i(I@&upXd|)|McHWtasDPViX|&0000d zv|$3j{vg0Z0;g~!113zO$z#clLX(DR_4)Fl4CdblOn@+(Y!DU?2+%ZO<(K9UfF=Ob z1Yj9Z!z5q;fYoYp{sQ?M`Ab8#Eg5W?co$6*by_?^*SD7dxEe6nJ?2(-KB@0vC!5C8#hw+(|rn|U7CP?%L_@IcoIlCCTO^73dHEcEZUN^QHbFFCF5D~Gpn=n3Gw+Nxq&}UqNjCP| zDgo|%Jwvbx04U*L4liX{Wy4r(8}t8!VLOK-=RVI1u*r6Vw)%8igq0)S_k9ETm;B?0 z!6X;FzpD(-HHVEi*uS-0@*8HU4d;-pGD-R*_?bn|RVPspO;lkn)8am+dm?8-!Gdeq zAe2vrSI(Z>1Xo$gdteTAGxvuukY7pg{F5kxB&-6-xy@~M-Y)EfKIWJ}ZD1E{dfkAU z*nrMMG7X3%*=*Y+0iK52`s+`w#0?wRgnw_ZIyCtDT7W!vPOUHQ`~c^hK%P)6!imE@ zPX+*0LPJ33>${&QHkTK4Hwl^KF~CAM%W_i$78B);4Z6{toWQr3|2e0H@C0=9a|`pS z02^&!$&`JVv$9Q4jfSzFYyz}RA2#y}8W!>qI+-S)y+Hmcn(u$K+B6fVY~s6N2n|vI zasVK*76HP37<pB=>xg4V>Ik zO~N8hZk8rH69nX@6Nq6`c>zMwI{|?pl8OvdXyj;O$~FMtf>Wp@W`Zlvk)59o^8TZ_ zf`rY5Tbt(OI(2L3I#Q==HDM*?Ch`O5*3>I+|52$ad`meSI9$aPLIz=hoafj!<;iPP z2~By>uWMKnJ=LEB>efM4Q$@Br4ulj|D1XcppUWqRuiU8_Q|`HWh@gV z(y6k6?nHb-K7HUr-CsP{`a!3nPU$~IhVFoCl{`WWVM(zK-KTHj-3kZu%EoWu{B zQVL@k^tnNNF0K+}a{#PmxSO16g!G|EqFX|5y3ebUWbC)uop-6F1Z;JaRH2n>mWJ6- zA}@#rkJ`w&1q)hzlrktEl`W7)&o^(-61t7~{yZt9VOu^=SCX<1wo(<+H24Wa2frg&yFdZTA`)ke&-^&1-WOFZ=Xj(b_vSol< zGABjeE_+kc7AJ?(vL}q^(MHRY2e3FjXymfKs2fU}`#TsL-sr0u#LQ z%{*nx{C3jk&Z!7+&gFsmlA?k=Ck!AY4iU%e-Kn#BfCAjHxV*;C=Wzo+ub)g(adPNF); zq?rnTgPk%SYdsCg0@$5cE8Y{BTQJS&bR8Q{fub8Wr`GQaFZh;vbGk&5og;MIPh`=A z6LBygz@$*h`*_N=ce4)(dD1=lwEzi);vgQKDmrkHZw(3w-DeuVL}7hRjS&1Rm!$)V z)Dp=ij6-=~HSOVYvuGgt%I4+@;ua$yT15g^@4qriZixOD`43jo`6 zi$+^M^9xNZPGt@QeD$Ce(^}FjG>tCtWi*qWj?@?LmL15PeNh3-m-a#7P0;&ACcqA4 z#HKw_Hs`+q_JWU{8PW_5AYbbDnR|Kmc6a zN0_^uwu;>Yr`wj8snvWM3upmubb@W_+ujCo46F-x0u(8BFf`-{D1q=cLzC^C%i!Wk z=IQO4oJtOAJktTA1)(QA<4%0A83m^ns0fE=Bqmj9iwmdO|9 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 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js-plugins/chalkboard/plugin.js b/yknjs/reveal.js-plugins/chalkboard/plugin.js new file mode 100644 index 0000000..f146c02 --- /dev/null +++ b/yknjs/reveal.js-plugins/chalkboard/plugin.js @@ -0,0 +1,1617 @@ +/***************************************************************** +** Author: Asvin Goel, goel@telematique.eu +** +** A plugin for reveal.js adding a chalkboard. +** +** Version: 1.0.5 +** +** License: MIT license (see LICENSE.md) +** +** Credits: +** Chalkboard effect by Mohamed Moustafa https://github.com/mmoustafa/Chalkboard +** Multi color support by Kurt Rinnert https://github.com/rinnert +** Compatibility with reveal.js v4 by Hakim El Hattab https://github.com/hakimel +******************************************************************/ + +window.RevealChalkboard = window.RevealChalkboard || { + id: 'RevealChalkboard', + init: function(deck) { + initChalkboard(deck); + }, + configure: function(config) { configure(config); }, + toggleNotesCanvas: function() { toggleNotesCanvas(); }, + toggleChalkboard: function() { toggleChalkboard(); }, + colorNext: function() { colorNext(); }, + colorPrev: function() {colorPrev(); }, + clear: function() { clear(); }, + reset: function() { reset(); }, + resetAll: function() { resetAll(); }, + download: function() { download(); }, +}; + +function scriptPath() { + // obtain plugin path from the script element + var src; + if (document.currentScript) { + src = document.currentScript.src; + } else { + var sel = document.querySelector('script[src$="/chalkboard/plugin.js"]') + if (sel) { + src = sel.src; + } + } + var path = (src === undefined) ? "" : src.slice(0, src.lastIndexOf("/") + 1); +//console.log("Path: " + path); + return path; +} +var path = scriptPath(); + +const initChalkboard = function(Reveal){ +//console.warn(path); + /* Feature detection for passive event handling*/ + var passiveSupported = false; + + try { + window.addEventListener("test", null, Object.defineProperty({}, "passive", { get: function() { passiveSupported = true; } })); + } catch(err) {} + + +/***************************************************************** +** Configuration +******************************************************************/ + var background, pen, draw, color; + var grid = false; + var boardmarkerWidth = 3; + var chalkWidth = 7; + var chalkEffect = 1.0; + var rememberColor = [true, false]; + var eraser = { src: path + 'img/sponge.png', radius: 20}; + var boardmarkers = [ + { color: 'rgba(100,100,100,1)', cursor: 'url(' + path + 'img/boardmarker-black.png), auto'}, + { color: 'rgba(30,144,255, 1)', cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'}, + { color: 'rgba(220,20,60,1)', cursor: 'url(' + path + 'img/boardmarker-red.png), auto'}, + { color: 'rgba(50,205,50,1)', cursor: 'url(' + path + 'img/boardmarker-green.png), auto'}, + { color: 'rgba(255,140,0,1)', cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'}, + { color: 'rgba(150,0,20150,1)', cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'}, + { color: 'rgba(255,220,0,1)', cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'} + ]; + var chalks = [ + { color: 'rgba(255,255,255,0.5)', cursor: 'url(' + path + 'img/chalk-white.png), auto'}, + { color: 'rgba(96, 154, 244, 0.5)', cursor: 'url(' + path + 'img/chalk-blue.png), auto'}, + { color: 'rgba(237, 20, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-red.png), auto'}, + { color: 'rgba(20, 237, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-green.png), auto'}, + { color: 'rgba(220, 133, 41, 0.5)', cursor: 'url(' + path + 'img/chalk-orange.png), auto'}, + { color: 'rgba(220,0,220,0.5)', cursor: 'url(' + path + 'img/chalk-purple.png), auto'}, + { color: 'rgba(255,220,0,0.5)', cursor: 'url(' + path + 'img/chalk-yellow.png), auto'} + ]; + var keyBindings = { + toggleNotesCanvas: { keyCode: 67, key: 'C', description: 'Toggle notes canvas' }, + toggleChalkboard: { keyCode: 66, key: 'B', description: 'Toggle chalkboard' }, + clear: { keyCode: 171, key: '+', description: 'Clear drawings on slide' }, + reset: { keyCode: 46, key: 'DEL', description: 'Reset drawings on slide' }, + resetAll: { keyCode: 8, key: 'BACKSPACE', description: 'Reset all drawings' }, + colorNext: { keyCode: 88, key: 'X', description: 'Next color' }, + colorPrev: { keyCode: 89, key: 'Y', description: 'Previous color' }, + download: { keyCode: 68, key: 'D', description: 'Download drawings' } + }; + + + var theme = "chalkboard"; + var color = [0, 0]; + var toggleChalkboardButton = true; + var toggleNotesButton = true; + var transition = 800; + + var readOnly = undefined; + + var config = configure( Reveal.getConfig().chalkboard || {} ); + if ( config.keyBindings ) { + for (var key in config.keyBindings) { + keyBindings[key] = config.keyBindings[key]; + }; + } + + function configure( config ) { + + if ( config.boardmarkerWidth || config.penWidth ) boardmarkerWidth = config.boardmarkerWidth || config.penWidth; + if ( config.chalkWidth ) chalkWidth = config.chalkWidth; + if ( "chalkEffect" in config ) chalkEffect = ("chalkEffect" in config); + if ( config.rememberColor ) rememberColor = config.rememberColor; + if ( config.eraser ) eraser = config.eraser; + if ("boardmarkers" in config) boardmarkers = config.boardmarkers; + if ("chalks" in config) chalks = config.chalks; + + if ( config.theme ) theme = config.theme; + switch ( theme ) { + case "whiteboard": + background = [ 'rgba(127,127,127,.1)' , path + 'img/whiteboard.png' ]; + draw = [ drawWithBoardmarker , drawWithBoardmarker ]; + pens = [ boardmarkers, boardmarkers ]; + grid = { color: 'rgb(127,127,255,0.1)', distance: 40, width: 2}; + break; + case "chalkboard": + default: + background = [ 'rgba(127,127,127,.1)' , path + 'img/blackboard.png' ]; + draw = [ drawWithBoardmarker , drawWithChalk ]; + pens = [ boardmarkers, chalks ]; + grid = { color: 'rgb(50,50,10,0.5)', distance: 80, width: 2}; + } + + if ( config.background ) background = config.background; + if ( config.grid != undefined ) grid = config.grid; + + if (config.toggleChalkboardButton != undefined) toggleChalkboardButton = config.toggleChalkboardButton; + if (config.toggleNotesButton != undefined) toggleNotesButton = config.toggleNotesButton; + if (config.transition) transition = config.transition; + + if (config.readOnly) readOnly = config.readOnly; + + if ( drawingCanvas && ( config.theme || config.background || config.grid ) ) { + var canvas = document.getElementById( drawingCanvas[1].id ); + canvas.style.background = 'url("' + background[1] + '") repeat'; + clearCanvas( 1 ); + drawGrid(); + } + return config; + } +/***************************************************************** +** Setup +******************************************************************/ + + function whenReady( callback ) { + // wait for drawings to be loaded and markdown to be parsed + if ( document.querySelectorAll(".pdf-page").length && loaded !== null ) { + callback(); + } + else { +console.log("Wait for pdf pages to be created and drawings to be loaded"); + setTimeout( whenReady, 500, callback ) + } + } + + + if ( toggleChalkboardButton ) { +//console.log("toggleChalkboardButton") + var button = document.createElement( 'div' ); + button.className = "chalkboard-button"; + button.id = "toggle-chalkboard"; + button.style.visibility = "visible"; + button.style.position = "absolute"; + button.style.zIndex = 30; + button.style.fontSize = "24px"; + + button.style.left = toggleChalkboardButton.left || "30px"; + button.style.bottom = toggleChalkboardButton.bottom || "30px"; + button.style.top = toggleChalkboardButton.top || "auto"; + button.style.right = toggleChalkboardButton.right || "auto"; + + button.innerHTML = '
    ' + document.querySelector(".reveal").appendChild( button ); + } + if ( toggleNotesButton ) { +//console.log("toggleNotesButton") + var button = document.createElement( 'div' ); + button.className = "chalkboard-button"; + button.id = "toggle-notes"; + button.style.position = "absolute"; + button.style.zIndex = 30; + button.style.fontSize = "24px"; + + button.style.left = toggleNotesButton.left || "70px"; + button.style.bottom = toggleNotesButton.bottom || "30px"; + button.style.top = toggleNotesButton.top || "auto"; + button.style.right = toggleNotesButton.right || "auto"; + + button.innerHTML = '' + document.querySelector(".reveal").appendChild( button ); + } +//alert("Buttons"); + + var drawingCanvas = [ {id: "notescanvas" }, {id: "chalkboard" } ]; + setupDrawingCanvas(0); + setupDrawingCanvas(1); + + var mode = 0; // 0: notes canvas, 1: chalkboard + + var mouseX = 0; + var mouseY = 0; + var xLast = null; + var yLast = null; + + var slideStart = Date.now(); + var slideIndices = { h:0, v:0 }; + var event = null; + var timeouts = [ [], [] ]; + var touchTimeout = null; + var slidechangeTimeout = null; + var playback = false; + + function setupDrawingCanvas( id ) { + var container = document.createElement( 'div' ); + container.id = drawingCanvas[id].id; + container.classList.add( 'overlay' ); + container.setAttribute( 'data-prevent-swipe', '' ); + container.oncontextmenu = function() { return false; } + container.style.cursor = pens[ id ][ color[id] ].cursor; + + drawingCanvas[id].width = window.innerWidth; + drawingCanvas[id].height = window.innerHeight; + drawingCanvas[id].scale = 1; + drawingCanvas[id].xOffset = 0; + drawingCanvas[id].yOffset = 0; + + + if ( id == "0" ) { + container.style.background = 'rgba(0,0,0,0)'; + container.style.zIndex = 24; + container.style.opacity = 1; + container.style.visibility = 'visible'; + container.style.pointerEvents = "none"; + + var slides = document.querySelector(".slides"); + var aspectRatio = Reveal.getConfig().width / Reveal.getConfig().height; + if ( drawingCanvas[id].width > drawingCanvas[id].height*aspectRatio ) { + drawingCanvas[id].xOffset = (drawingCanvas[id].width - drawingCanvas[id].height*aspectRatio) / 2; + } + else if ( drawingCanvas[id].height > drawingCanvas[id].width/aspectRatio ) { + drawingCanvas[id].yOffset = ( drawingCanvas[id].height - drawingCanvas[id].width/aspectRatio ) / 2; + } + } + else { + container.style.background = 'url("' + background[id] + '") repeat'; + container.style.zIndex = 26; + container.style.opacity = 0; + container.style.visibility = 'hidden'; + } + + var sponge = document.createElement( 'img' ); + sponge.src = eraser.src; + sponge.id = "sponge"; + sponge.style.visibility = "hidden"; + sponge.style.position = "absolute"; + container.appendChild( sponge ); + drawingCanvas[id].sponge = sponge; + + var canvas = document.createElement( 'canvas' ); + canvas.width = drawingCanvas[id].width; + canvas.height = drawingCanvas[id].height; + canvas.setAttribute( 'data-chalkboard', id ); + canvas.style.cursor = pens[ id ][ color[id] ].cursor; + container.appendChild( canvas ); + drawingCanvas[id].canvas = canvas; + + drawingCanvas[id].context = canvas.getContext("2d"); + + + document.querySelector( '.reveal' ).appendChild( container ); + drawingCanvas[id].container = container; + } + + +/***************************************************************** +** Storage +******************************************************************/ + + var storage = [ + { width: Reveal.getConfig().width, height: Reveal.getConfig().height, data: []}, + { width: Reveal.getConfig().width, height: Reveal.getConfig().height, data: []} + ]; +//console.log( JSON.stringify(storage)); + + var loaded = null; + if ( config.src != null ) { + loadData( config.src ); + } + + + /** + * Load data. + */ + function loadData( filename ) { + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + if (xhr.readyState === 4 && xhr.status != 404 ) { + storage = JSON.parse(xhr.responseText); + for (var id = 0; id < storage.length; id++) { + if ( drawingCanvas[id].width != storage[id].width || drawingCanvas[id].height != storage[id].height ) { + drawingCanvas[id].scale = Math.min( drawingCanvas[id].width/storage[id].width, drawingCanvas[id].height/storage[id].height); + drawingCanvas[id].xOffset = (drawingCanvas[id].width - storage[id].width * drawingCanvas[id].scale)/2; + drawingCanvas[id].yOffset = (drawingCanvas[id].height - storage[id].height * drawingCanvas[id].scale)/2; + } + if ( config.readOnly ) { + drawingCanvas[id].container.style.cursor = 'default'; + drawingCanvas[id].canvas.style.cursor = 'default'; + } + } + loaded = true; +//console.log("Drawings loaded"); + } + else { + config.readOnly = undefined; + readOnly = undefined; + console.warn( 'Failed to get file ' + filename +". ReadyState: " + xhr.readyState + ", Status: " + xhr.status); + loaded = false; + } + }; + + xhr.open( 'GET', filename, true ); + try { + xhr.send(); + } + catch ( error ) { + config.readOnly = undefined; + readOnly = undefined; + console.warn( 'Failed to get file ' + filename + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + error ); + loaded = false; + } + } + + /** + * Download data. + */ + function downloadData() { + var a = document.createElement('a'); + document.body.appendChild(a); + try { + // cleanup slide data without events + for (var id = 0; id < 2; id++) { + for (var i = storage[id].data.length-1; i >= 0; i--) { + if (storage[id].data[i].events.length == 0) { + storage[id].data.splice(i, 1); + } + } + } + a.download = "chalkboard.json"; + var blob = new Blob( [ JSON.stringify( storage ) ], { type: "application/json"} ); + a.href = window.URL.createObjectURL( blob ); + } catch( error ) { + a.innerHTML += " (" + error + ")"; + } + a.click(); + document.body.removeChild(a); + } + + /** + * Returns data object for the slide with the given indices. + */ + function getSlideData( indices, id ) { + if ( id == undefined ) id = mode; + if (!indices) indices = slideIndices; + var data; + for (var i = 0; i < storage[id].data.length; i++) { + if (storage[id].data[i].slide.h === indices.h && storage[id].data[i].slide.v === indices.v && storage[id].data[i].slide.f === indices.f ) { + data = storage[id].data[i]; + return data; + } + } + storage[id].data.push( { slide: indices, events: [], duration: 0 } ); + data = storage[id].data[storage[id].data.length-1]; + return data; + } + + /** + * Returns maximum duration of slide playback for both modes + */ + function getSlideDuration( indices ) { + if (!indices) indices = slideIndices; + var duration = 0; + for (var id = 0; id < 2; id++) { + for (var i = 0; i < storage[id].data.length; i++) { + if (storage[id].data[i].slide.h === indices.h && storage[id].data[i].slide.v === indices.v && storage[id].data[i].slide.f === indices.f ) { + duration = Math.max( duration, storage[id].data[i].duration ); + break; + } + } + } +//console.log( duration ); + return duration; + } + +/***************************************************************** +** Print +******************************************************************/ + var printMode = ( /print-pdf/gi ).test( window.location.search ); +//console.log("createPrintout" + printMode) + + function createPrintout( ) { +console.warn(Reveal.getTotalSlides(),Reveal.getSlidesElement()); + if ( storage[1].data.length == 0 ) return; +console.log( 'Create printout for ' + storage[1].data.length + " slides"); + drawingCanvas[0].container.style.opacity = 0; // do not print notes canvas + drawingCanvas[0].container.style.visibility = 'hidden'; + + var patImg = new Image(); + patImg.onload = function () { + var slides = getSlidesArray(); + for (var i = storage[1].data.length-1; i>=0; i--) { +console.log( 'Create printout for slide ' + storage[1].data[i].slide.h + "." + storage[1].data[i].slide.v ); + var slideData = getSlideData( storage[1].data[i].slide, 1 ); + var drawings = createDrawings( slideData, patImg ); + var slide = slides[ storage[1].data[i].slide.h][ storage[1].data[i].slide.v ]; +//console.log("Slide:", slide); + addDrawings( slide, drawings ); + + } +// Reveal.sync(); + }; + patImg.src = background[1]; + } + + function getSlidesArray() { + var horizontal = document.querySelectorAll('.slides > div.pdf-page > section, .slides > section'); + var slides = []; + var slidenumber = undefined; + for ( var i=0; i < horizontal.length; i++) { + if ( horizontal[i].parentElement.classList.contains("pdf-page") ) { + // Horizontal slide + if ( horizontal[i].getAttribute("data-slide-number") != slidenumber ) { + // new slide + slides.push([]); + slides[slides.length-1].push(horizontal[i]); + slidenumber = horizontal[i].getAttribute("data-slide-number"); + } + else { + // fragment of same slide + slides[slides.length-1][slides[slides.length-1].length-1] = horizontal[i]; + } + } + else { + // Vertical slides + var vertical = horizontal[i].querySelectorAll('section'); + slides.push([]); + var slidenumber = undefined; + for ( var j=0; j < vertical.length; j++) { + if ( vertical[j].getAttribute("data-slide-number") != slidenumber ) { + // new slide + slides[slides.length-1].push(vertical[j]); + slidenumber = vertical[j].getAttribute("data-slide-number"); + } + else { + // fragment of same slide + slides[slides.length-1][slides[slides.length-1].length-1] = vertical[j]; + } + } + } + } +//console.log("Slides:", slides); + return slides; + } + + function cloneCanvas(oldCanvas) { + //create a new canvas + var newCanvas = document.createElement('canvas'); + var context = newCanvas.getContext('2d'); + //set dimensions + newCanvas.width = oldCanvas.width; + newCanvas.height = oldCanvas.height; + //apply the old canvas to the new one + context.drawImage(oldCanvas, 0, 0); + //return the new canvas + return newCanvas; + } + + function createDrawings( slideData, patImg ) { + var width = Reveal.getConfig().width; + var height = Reveal.getConfig().height; + var scale = 1; + var xOffset = 0; + var yOffset = 0; + if ( width != storage[1].width || height != storage[1].height ) { + scale = Math.min( width/storage[1].width, height/storage[1].height); + xOffset = (width - storage[1].width * scale)/2; + yOffset = (height - storage[1].height * scale)/2; + } + mode = 1; +console.log( 'Create printout for slide ', slideData/*+ data.slide.h + "." + data.slide.v */); +// var parent = Reveal.getSlide( data.slide.h, data.slide.v ).parentElement; +// var slideData = getSlideData( data.slide, 1 ); + + var drawings = []; + var imgCanvas = document.createElement('canvas'); + imgCanvas.width = width; + imgCanvas.height = height; + + var imgCtx = imgCanvas.getContext("2d"); + imgCtx.fillStyle = imgCtx.createPattern( patImg ,'repeat'); + imgCtx.rect(0,0,imgCanvas.width,imgCanvas.height); + imgCtx.fill(); + + for (var j = 0; j < slideData.events.length; j++) { + switch ( slideData.events[j].type ) { + case "draw": + for (var k = 1; k < slideData.events[j].curve.length; k++) { + draw[1]( imgCtx, + xOffset + slideData.events[j].curve[k-1].x*scale, + yOffset + slideData.events[j].curve[k-1].y*scale, + xOffset + slideData.events[j].curve[k].x*scale, + yOffset + slideData.events[j].curve[k].y*scale + ); + } + break; + case "erase": + for (var k = 0; k < slideData.events[j].curve.length; k++) { + eraseWithSponge( imgCtx, + xOffset + slideData.events[j].curve[k].x*scale, + yOffset + slideData.events[j].curve[k].y*scale + ); + } + break; + case "setcolor": + setColor(slideData.events[j].index); + break; + case "clear": + drawings.push( cloneCanvas(imgCanvas) ); +// addPrintout( parent, nextSlide[i], imgCanvas, patImg ); + imgCtx.clearRect(0,0,imgCanvas.width,imgCanvas.height); + imgCtx.fill(); + break; + default: + break; + } + } + drawings.push( cloneCanvas(imgCanvas) ); + + mode = 0; + + return drawings; + } + + function addDrawings( slide, drawings ) { + var parent = slide.parentElement.parentElement; + var nextSlide = slide.parentElement.nextElementSibling; + + for (var i = 0; i < drawings.length; i++) { + var newPDFPage = document.createElement( 'div' ); + newPDFPage.classList.add('pdf-page'); + newPDFPage.style.height = Reveal.getConfig().height; +// newPDFPage.innerHTML = '

    Drawing should be here!

    '; + newPDFPage.append(drawings[i]); +//console.log("Add drawing", newPDFPage); + if ( nextSlide != null ) { + parent.insertBefore( newPDFPage, nextSlide ); + } + else { + parent.append( newPDFPage ); + } + } + } + +/***************************************************************** +** Drawings +******************************************************************/ + + function drawWithBoardmarker(context,fromX,fromY,toX,toY){ + context.lineWidth = boardmarkerWidth; + context.lineCap = 'round'; + context.strokeStyle = boardmarkers[color[mode]].color; + context.beginPath(); + context.moveTo(fromX, fromY); + context.lineTo(toX, toY); + context.stroke(); + } + + function drawWithChalk(context,fromX,fromY,toX,toY) { + var brushDiameter = chalkWidth; + context.lineWidth = brushDiameter; + context.lineCap = 'round'; + context.fillStyle = chalks[color[mode]].color; // 'rgba(255,255,255,0.5)'; + context.strokeStyle = chalks[color[mode]].color; + /*var opacity = Math.min(0.8, Math.max(0,color[1].replace(/^.*,(.+)\)/,'$1') - 0.1)) + Math.random()*0.2;*/ + var opacity = 1.0; + context.strokeStyle = context.strokeStyle.replace(/[\d\.]+\)$/g, opacity + ')'); + context.beginPath(); + context.moveTo(fromX, fromY); + context.lineTo(toX, toY); + context.stroke(); + // Chalk Effect + var length = Math.round(Math.sqrt(Math.pow(toX-fromX,2)+Math.pow(toY-fromY,2))/(5/brushDiameter)); + var xUnit = (toX-fromX)/length; + var yUnit = (toY-fromY)/length; + for(var i=0; i (Math.random() * 0.9)) { + var xCurrent = fromX+(i*xUnit); + var yCurrent = fromY+(i*yUnit); + var xRandom = xCurrent+(Math.random()-0.5)*brushDiameter*1.2; + var yRandom = yCurrent+(Math.random()-0.5)*brushDiameter*1.2; + context.clearRect( xRandom, yRandom, Math.random()*2+2, Math.random()+1); + } + } + } + + function eraseWithSponge(context,x,y) { + context.save(); + context.beginPath(); + context.arc(x, y, eraser.radius, 0, 2 * Math.PI, false); + context.clip(); + context.clearRect(x - eraser.radius - 1, y - eraser.radius - 1, eraser.radius * 2 + 2, eraser.radius * 2 + 2); + context.restore(); + if ( mode == 1 && grid) { + redrawGrid(x,y,eraser.radius); + } + } + + + + /** + * Oboardmarkers an overlay for the chalkboard. + */ + function showChalkboard() { +//console.log("showChalkboard"); + clearTimeout(touchTimeout); + touchTimeout = null; + drawingCanvas[0].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].container.style.opacity = 1; + drawingCanvas[1].container.style.visibility = 'visible'; + mode = 1; + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'showChalkboard' }; + document.dispatchEvent( message ); + } + + + /** + * Closes open chalkboard. + */ + function closeChalkboard() { + clearTimeout(touchTimeout); + touchTimeout = null; + drawingCanvas[0].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].container.style.opacity = 0; + drawingCanvas[1].container.style.visibility = 'hidden'; + xLast = null; + yLast = null; + event = null; + mode = 0; + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'closeChalkboard' }; + document.dispatchEvent( message ); + } + + /** + * Clear current canvas. + */ + function clearCanvas( id ) { + if ( id == 0 ) clearTimeout( slidechangeTimeout ); + drawingCanvas[id].context.clearRect(0,0,drawingCanvas[id].width,drawingCanvas[id].height); + if ( id == 1 && grid ) drawGrid(); + } + + /** + * Draw grid on background + */ + function drawGrid() { + var context = drawingCanvas[1].context; + + drawingCanvas[1].scale = Math.min( drawingCanvas[1].width/storage[1].width, drawingCanvas[1].height/storage[1].height ); + drawingCanvas[1].xOffset = (drawingCanvas[1].width - storage[1].width * drawingCanvas[1].scale)/2; + drawingCanvas[1].yOffset = (drawingCanvas[1].height - storage[1].height * drawingCanvas[1].scale)/2; + + var scale = drawingCanvas[1].scale; + var xOffset = drawingCanvas[1].xOffset; + var yOffset = drawingCanvas[1].yOffset; + + var distance = grid.distance*scale; + + var fromX = drawingCanvas[1].width/2 - distance/2 - Math.floor( (drawingCanvas[1].width - distance)/2 / distance ) * distance; + for( var x=fromX; x < drawingCanvas[1].width; x+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(x, 0); + context.lineTo(x, drawingCanvas[1].height); + context.stroke(); + } + var fromY = drawingCanvas[1].height/2 - distance/2 - Math.floor( (drawingCanvas[1].height - distance)/2 / distance ) * distance ; + + for( var y=fromY; y < drawingCanvas[1].height; y+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(0, y); + context.lineTo(drawingCanvas[1].width, y); + context.stroke(); + } + } + + function redrawGrid(centerX,centerY,diameter) { + var context = drawingCanvas[1].context; + + drawingCanvas[1].scale = Math.min( drawingCanvas[1].width/storage[1].width, drawingCanvas[1].height/storage[1].height ); + drawingCanvas[1].xOffset = (drawingCanvas[1].width - storage[1].width * drawingCanvas[1].scale)/2; + drawingCanvas[1].yOffset = (drawingCanvas[1].height - storage[1].height * drawingCanvas[1].scale)/2; + + var scale = drawingCanvas[1].scale; + var xOffset = drawingCanvas[1].xOffset; + var yOffset = drawingCanvas[1].yOffset; + + var distance = grid.distance*scale; + + var fromX = drawingCanvas[1].width/2 - distance/2 - Math.floor( (drawingCanvas[1].width - distance)/2 / distance ) * distance; + + for( var x=fromX + distance* Math.ceil( (centerX-diameter-fromX) / distance); x <= fromX + distance* Math.floor( (centerX+diameter-fromX) / distance); x+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(x, centerY - Math.sqrt( diameter*diameter - (centerX-x)*(centerX-x) )); + context.lineTo(x, centerY + Math.sqrt( diameter*diameter - (centerX-x)*(centerX-x) ) ); + context.stroke(); + } + var fromY = drawingCanvas[1].height/2 - distance/2 - Math.floor( (drawingCanvas[1].height - distance)/2 / distance ) * distance ; + for( var y=fromY + distance* Math.ceil( (centerY-diameter-fromY) / distance); y <= fromY + distance* Math.floor( (centerY+diameter-fromY) / distance); y+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(centerX - Math.sqrt( diameter*diameter - (centerY-y)*(centerY-y) ), y ); + context.lineTo(centerX + Math.sqrt( diameter*diameter - (centerY-y)*(centerY-y) ), y ); + context.stroke(); + } + } + + /** + * Set the color + */ + function setColor( index ) { + // protect against out of bounds (this could happen when + // replaying events recorded with different color settings). + if ( index >= boardmarkers[mode].length ) index = 0; + color[mode] = index; + drawingCanvas[mode].canvas.style.cursor = pens[mode][color[mode]].cursor; + } + + /** + * Forward cycle color + */ + function cycleColorNext() { + color[mode] = (color[mode] + 1) % pens[mode].length; + return color[mode]; + } + + /** + * Backward cycle color + */ + function cycleColorPrev() { + color[mode] = (color[mode] + (pens[mode].length - 1)) % pens[mode].length; + return color[mode]; + } + +/***************************************************************** +** Broadcast +******************************************************************/ + document.addEventListener( 'received', function ( message ) { +//console.log(JSON.stringify(message)); + if ( message.content && message.content.sender == 'chalkboard-plugin' ) { + switch ( message.content.type ) { + case 'showChalkboard': + showChalkboard(); + break; + case 'closeChalkboard': + closeChalkboard(); + break; + case 'startDrawing': + startDrawing(message.content.x, message.content.y, message.content.erase); + break; + case 'startErasing': + if ( message.content ) { + message.content.type = "erase"; + message.content.begin = Date.now() - slideStart; + eraseWithSponge(drawingCanvas[mode].context, message.content.x, message.content.y); + } + break; + case 'drawSegment': + drawSegment(message.content.x, message.content.y, message.content.erase); + break; + case 'stopDrawing': + stopDrawing(); + break; + case 'clear': + clear(); + break; + case 'setcolor': + setColor(message.content.index); + break; + case 'resetSlide': + resetSlide(true); + break; + case 'init': + storage = message.content.storage; + for (var id = 0; id < 2; id++ ) { + drawingCanvas[id].scale = Math.min( drawingCanvas[id].width/storage[id].width, drawingCanvas[id].height/storage[id].height ); + drawingCanvas[id].xOffset = (drawingCanvas[id].width - storage[id].width * drawingCanvas[id].scale)/2; + drawingCanvas[id].yOffset = (drawingCanvas[id].height - storage[id].height * drawingCanvas[id].scale)/2; + } + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( !playback ) { + slidechangeTimeout = setTimeout( startPlayback, transition, getSlideDuration(), 0 ); + } + if ( mode == 1 && message.content.mode == 0) { + setTimeout( closeChalkboard, transition + 50 ); + } + if ( mode == 0 && message.content.mode == 1) { + setTimeout( showChalkboard, transition + 50 ); + } + mode = message.content.mode; + break; + default: + break; + } + } + }); + + document.addEventListener( 'newclient', function() { + // broadcast storage + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'init', storage: storage, mode: mode }; + document.dispatchEvent( message ); + }); + +/***************************************************************** +** Playback +******************************************************************/ + + document.addEventListener('seekplayback', function( event ) { +//console.log('event seekplayback ' + event.timestamp); + stopPlayback(); + if ( !playback || event.timestamp == 0) { + // in other cases startplayback fires after seeked + startPlayback( event.timestamp ); + } +//console.log('seeked'); + }); + + + document.addEventListener('startplayback', function( event ) { +//console.log('event startplayback ' + event.timestamp); + stopPlayback(); + playback = true; + startPlayback( event.timestamp ); + }); + + document.addEventListener('stopplayback', function( event ) { +//console.log('event stopplayback ' + (Date.now() - slideStart) ); + playback = false; + stopPlayback(); + }); + + document.addEventListener('startrecording', function( event ) { +//console.log('event startrecording ' + event.timestamp); + startRecording(); + }); + + function recordEvent( event ) { + var slideData = getSlideData(); + var i = slideData.events.length; + while ( i > 0 && event.begin < slideData.events[i-1].begin ) { + i--; + } + slideData.events.splice( i, 0, event); + slideData.duration = Math.max( slideData.duration, Date.now() - slideStart ) + 1; + } + + function startRecording() { + resetSlide( true ); + updateReadOnlyMode(); + slideStart = Date.now(); + } + + function startPlayback( timestamp, finalMode, resized ) { +//console.log("playback " + timestamp ); + if ( resized == undefined ) { + updateReadOnlyMode(); + } + slideStart = Date.now() - timestamp; + closeChalkboard(); + mode = 0; + for ( var id = 0; id < 2; id++ ) { + clearCanvas( id ); + var slideData = getSlideData( slideIndices, id ); +//console.log( timestamp +" / " + JSON.stringify(slideData)); + var index = 0; + while ( index < slideData.events.length && slideData.events[index].begin < (Date.now() - slideStart) ) { + playEvent( id, slideData.events[index], timestamp ); + index++; + } + + while ( playback && index < slideData.events.length ) { + timeouts[id].push( setTimeout( playEvent, slideData.events[index].begin - (Date.now() - slideStart), id, slideData.events[index], timestamp ) ); + index++; + } + } +//console.log("Mode: " + finalMode + "/" + mode ); + if ( finalMode != undefined ) { + mode = finalMode; + } + if( mode == 1 ) showChalkboard(); +//console.log("playback (ok)"); + + }; + + function stopPlayback() { +//console.log("stopPlayback"); +//console.log("Timeouts: " + timeouts[0].length + "/"+ timeouts[1].length); + for ( var id = 0; id < 2; id++ ) { + for (var i = 0; i < timeouts[id].length; i++) { + clearTimeout(timeouts[id][i]); + } + timeouts[id] = []; + } + }; + + function playEvent( id, event, timestamp ) { +//console.log( timestamp +" / " + JSON.stringify(event)); +//console.log( id + ": " + timestamp +" / " + event.begin +" / " + event.type +" / " + mode ); + switch ( event.type ) { + case "open": + if ( timestamp <= event.begin ) { + showChalkboard(); + } + else { + mode = 1; + } + + break; + case "close": + if ( timestamp < event.begin ) { + closeChalkboard(); + } + else { + mode = 0; + } + break; + case "clear": + clearCanvas( id ); + break; + case "setcolor": + setColor(event.index); + break; + case "draw": + drawCurve( id, event, timestamp ); + break; + case "erase": + eraseCurve( id, event, timestamp ); + break; + + } + }; + + function drawCurve( id, event, timestamp ) { + if ( event.curve.length > 1 ) { + var ctx = drawingCanvas[id].context; + var scale = drawingCanvas[id].scale; + var xOffset = drawingCanvas[id].xOffset; + var yOffset = drawingCanvas[id].yOffset; + + var stepDuration = ( event.end - event.begin )/ ( event.curve.length - 1 ); +//console.log("---"); + for (var i = 1; i < event.curve.length; i++) { + if (event.begin + i * stepDuration <= (Date.now() - slideStart)) { +//console.log( "Draw " + timestamp +" / " + event.begin + " + " + i + " * " + stepDuration ); + draw[id](ctx, xOffset + event.curve[i-1].x*scale, yOffset + event.curve[i-1].y*scale, xOffset + event.curve[i].x*scale, yOffset + event.curve[i].y*scale); + } + else if ( playback ) { +//console.log( "Cue " + timestamp +" / " + (Date.now() - slideStart) +" / " + event.begin + " + " + i + " * " + stepDuration + " = " + Math.max(0,event.begin + i * stepDuration - timestamp) ); + timeouts.push( setTimeout( + draw[id], Math.max(0,event.begin + i * stepDuration - (Date.now() - slideStart)), ctx, + xOffset + event.curve[i-1].x*scale, + yOffset + event.curve[i-1].y*scale, + xOffset + event.curve[i].x*scale, + yOffset + event.curve[i].y*scale + ) + ); + } + } + } + + }; + + function eraseCurve( id, event, timestamp ) { + if ( event.curve.length > 1 ) { + var ctx = drawingCanvas[id].context; + var scale = drawingCanvas[id].scale; + var xOffset = drawingCanvas[id].xOffset; + var yOffset = drawingCanvas[id].yOffset; + + var stepDuration = ( event.end - event.begin )/ event.curve.length; + for (var i = 0; i < event.curve.length; i++) { + if (event.begin + i * stepDuration <= (Date.now() - slideStart)) { + eraseWithSponge(ctx, xOffset + event.curve[i].x*scale, yOffset + event.curve[i].y*scale); + } + else if ( playback ) { + timeouts.push( setTimeout( + eraseWithSponge, Math.max(0,event.begin + i * stepDuration - (Date.now() - slideStart)), ctx, + xOffset + event.curve[i].x * scale, + yOffset + event.curve[i].y * scale + ) + ); + } + } + } + + }; + + + function startDrawing( x, y, erase ) { + var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + xLast = x * scale + xOffset; + yLast = y * scale + yOffset; + if ( erase == true) { + event = { type: "erase", begin: Date.now() - slideStart, end: null, curve: [{x: x, y: y}]}; + drawingCanvas[mode].canvas.style.cursor = 'url("' + eraser.src + '") ' + eraser.radius + ' ' + eraser.radius + ', auto'; + eraseWithSponge(ctx, x * scale + xOffset, y * scale + yOffset); + } + else { + event = { type: "draw", begin: Date.now() - slideStart, end: null, curve: [{x: x, y: y}] }; + } + } + + + function showSponge(x,y) { + if ( event ) { + event.type = "erase"; + event.begin = Date.now() - slideStart; + // show sponge image + drawingCanvas[mode].sponge.style.left = (x - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.top = (y - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.visibility = "visible"; + eraseWithSponge(drawingCanvas[mode].context,x,y); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'startErasing', x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale }; + document.dispatchEvent( message ); + } + } + + function drawSegment( x, y, erase ) { + var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + if ( !event ) { + // safeguard if broadcast hickup + startDrawing( x, y, erase ); + } + event.curve.push({x: x, y: y}); + if(y * scale + yOffset < drawingCanvas[mode].height && x * scale + xOffset < drawingCanvas[mode].width) { + if ( erase ) { + eraseWithSponge(ctx, x * scale + xOffset, y * scale + yOffset); + } + else { + draw[mode](ctx, xLast, yLast, x * scale + xOffset, y * scale + yOffset); + } + xLast = x * scale + xOffset; + yLast = y * scale + yOffset; + } + } + + function stopDrawing() { + if ( event ) { + event.end = Date.now() - slideStart; + if ( event.type == "erase" || event.curve.length > 1 ) { + // do not save a line with a single point only + recordEvent( event ); + } + event = null; + } + } + + +/***************************************************************** +** User interface +******************************************************************/ + + +// TODO: check all touchevents + document.addEventListener('touchstart', function(evt) { +//console.log("Touch start"); + if ( !readOnly && evt.target.getAttribute('data-chalkboard') == mode ) { +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + evt.preventDefault(); + var touch = evt.touches[0]; + mouseX = touch.pageX; + mouseY = touch.pageY; + startDrawing( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, false ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'startDrawing', x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: false }; + document.dispatchEvent( message ); +/* + xLast = mouseX; + yLast = mouseY; + event = { type: "draw", begin: Date.now() - slideStart, end: null, curve: [{x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}] }; +*/ + touchTimeout = setTimeout( showSponge, 500, mouseX, mouseY ); + } + }, passiveSupported ? {passive: false} : false); + + document.addEventListener('touchmove', function(evt) { +//console.log("Touch move"); + clearTimeout( touchTimeout ); + touchTimeout = null; + if ( event ) { +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + var touch = evt.touches[0]; + mouseX = touch.pageX; + mouseY = touch.pageY; + if (mouseY < drawingCanvas[mode].height && mouseX < drawingCanvas[mode].width) { + evt.preventDefault(); + // move sponge + if ( event.type == "erase" ) { + drawingCanvas[mode].sponge.style.left = (mouseX - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.top = (mouseY - eraser.radius) +"px" ; + } + } + + drawSegment( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, ( event.type == "erase" ) ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'drawSegment', x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: ( event.type == "erase" ) }; + document.dispatchEvent( message ); +/* + if (mouseY < drawingCanvas[mode].height && mouseX < drawingCanvas[mode].width) { + evt.preventDefault(); + event.curve.push({x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}); + if ( event.type == "erase" ) { + drawingCanvas[mode].sponge.style.left = (mouseX - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.top = (mouseY - eraser.radius) +"px" ; + eraseWithSponge(ctx, mouseX, mouseY); + } + else { + draw[mode](ctx, xLast, yLast, mouseX, mouseY); + } + xLast = mouseX; + yLast = mouseY; + } +*/ + } + }, false); + + + document.addEventListener('touchend', function(evt) { + clearTimeout( touchTimeout ); + touchTimeout = null; + // hide sponge image + drawingCanvas[mode].sponge.style.visibility = "hidden"; + stopDrawing(); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'stopDrawing' }; + document.dispatchEvent( message ); +/* + if ( event ) { + event.end = Date.now() - slideStart; + if ( event.type == "erase" || event.curve.length > 1 ) { + // do not save a line with a single point only + recordEvent( event ); + } + event = null; + } +*/ + }, false); + + document.addEventListener( 'mousedown', function( evt ) { +//console.log("Mouse down"); +//console.log( "Read only: " + readOnly ); + if ( !readOnly && evt.target.getAttribute('data-chalkboard') == mode ) { +//console.log( "mousedown: " + evt.button ); +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + mouseX = evt.pageX; + mouseY = evt.pageY; + startDrawing( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, ( evt.button == 2 || evt.button == 1) ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'startDrawing', x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: ( evt.button == 2 || evt.button == 1) }; + document.dispatchEvent( message ); +/* + xLast = mouseX; + yLast = mouseY; + if ( evt.button == 2) { + event = { type: "erase", begin: Date.now() - slideStart, end: null, curve: [{x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}]}; + drawingCanvas[mode].canvas.style.cursor = 'url("' + path + 'img/sponge.png") ' + eraser.radius + ' ' + eraser.radius + ', auto'; + eraseWithSponge(ctx,mouseX,mouseY); + } + else { + event = { type: "draw", begin: Date.now() - slideStart, end: null, curve: [{x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}] }; + } +*/ + } + } ); + + document.addEventListener( 'mousemove', function( evt ) { +//console.log("Mouse move"); + if ( event ) { +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + mouseX = evt.pageX; + mouseY = evt.pageY; + drawSegment( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, ( event.type == "erase" ) ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'drawSegment', x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: ( event.type == "erase" ) }; + document.dispatchEvent( message ); +/* + event.curve.push({x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}); + if(mouseY < drawingCanvas[mode].height && mouseX < drawingCanvas[mode].width) { + if ( event.type == "erase" ) { + eraseWithSponge(ctx,mouseX,mouseY); + } + else { + draw[mode](ctx, xLast, yLast, mouseX,mouseY); + } + xLast = mouseX; + yLast = mouseY; + } +*/ + } + } ); + + + document.addEventListener( 'mouseup', function( evt ) { + drawingCanvas[mode].canvas.style.cursor = pens[mode][color[mode]].cursor; + if ( event ) { + stopDrawing(); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'stopDrawing' }; + document.dispatchEvent( message ); +/* if(evt.button == 2){ + } + event.end = Date.now() - slideStart; + if ( event.type == "erase" || event.curve.length > 1 ) { + // do not save a line with a single point only + recordEvent( event ); + } + event = null; +*/ + } + } ); + + + window.addEventListener( "resize", function() { +//console.log("resize"); + // Resize the canvas and draw everything again + var timestamp = Date.now() - slideStart; + if ( !playback ) { + timestamp = getSlideDuration(); + } + +//console.log( drawingCanvas[0].scale + "/" + drawingCanvas[0].xOffset + "/" +drawingCanvas[0].yOffset ); + for (var id = 0; id < 2; id++ ) { + drawingCanvas[id].width = window.innerWidth; + drawingCanvas[id].height = window.innerHeight; + drawingCanvas[id].canvas.width = drawingCanvas[id].width; + drawingCanvas[id].canvas.height = drawingCanvas[id].height; + drawingCanvas[id].context.canvas.width = drawingCanvas[id].width; + drawingCanvas[id].context.canvas.height = drawingCanvas[id].height; + + drawingCanvas[id].scale = Math.min( drawingCanvas[id].width/storage[id].width, drawingCanvas[id].height/storage[id].height ); + drawingCanvas[id].xOffset = (drawingCanvas[id].width - storage[id].width * drawingCanvas[id].scale)/2; + drawingCanvas[id].yOffset = (drawingCanvas[id].height - storage[id].height * drawingCanvas[id].scale)/2; +//console.log( drawingCanvas[id].scale + "/" + drawingCanvas[id].xOffset + "/" +drawingCanvas[id].yOffset ); + } +//console.log( window.innerWidth + "/" + window.innerHeight); + startPlayback( timestamp, mode, true ); + + } ); + + function updateReadOnlyMode() { +//console.log("updateReadOnlyMode"); + if ( config.readOnly == undefined ) { + readOnly = ( getSlideDuration() > 0 ); + if ( readOnly ) { + drawingCanvas[0].container.style.cursor = 'default'; + drawingCanvas[1].container.style.cursor = 'default'; + drawingCanvas[0].canvas.style.cursor = 'default'; + drawingCanvas[1].canvas.style.cursor = 'default'; + if ( notescanvas.style.pointerEvents != "none" ) { + event = null; + notescanvas.style.background = 'rgba(0,0,0,0)'; + notescanvas.style.pointerEvents = "none"; + } + + } + else { + drawingCanvas[0].container.style.cursor = pens[0][color[0]].cursor; + drawingCanvas[1].container.style.cursor = pens[1][color[1]].cursor; + drawingCanvas[0].canvas.style.cursor = pens[0][color[0]].cursor; + drawingCanvas[1].canvas.style.cursor = pens[1][color[1]].cursor; + } + } + } + + Reveal.addEventListener( 'ready', function( evt ) { +//console.log('ready'); + if ( !printMode ) { + slideStart = Date.now(); + slideIndices = Reveal.getIndices(); + if ( !playback ) { + startPlayback( getSlideDuration(), 0 ); + } + if ( Reveal.isAutoSliding() ) { + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + } + updateReadOnlyMode(); + } + else { +console.log("Create printout when ready"); + whenReady( createPrintout ); + } + }); + Reveal.addEventListener( 'slidechanged', function( evt ) { +// clearTimeout( slidechangeTimeout ); +//console.log('slidechanged'); + if ( !printMode ) { + slideStart = Date.now(); + slideIndices = Reveal.getIndices(); + closeChalkboard(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( !playback ) { + slidechangeTimeout = setTimeout( startPlayback, transition, getSlideDuration(), 0 ); + } + if ( Reveal.isAutoSliding() ) { + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + } + + updateReadOnlyMode(); + } + }); + Reveal.addEventListener( 'fragmentshown', function( evt ) { +// clearTimeout( slidechangeTimeout ); +//console.log('fragmentshown'); + if ( !printMode ) { + slideStart = Date.now(); + slideIndices = Reveal.getIndices(); + closeChalkboard(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( Reveal.isAutoSliding() ) { + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + } + else if ( !playback ) { + // + startPlayback( getSlideDuration(), 0 ); +// closeChalkboard(); + } + updateReadOnlyMode(); + } + }); + Reveal.addEventListener( 'fragmenthidden', function( evt ) { +// clearTimeout( slidechangeTimeout ); +//console.log('fragmenthidden'); + if ( !printMode ) { + slideStart = Date.now(); + slideIndices = Reveal.getIndices(); + closeChalkboard(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( Reveal.isAutoSliding() ) { + document.dispatchEvent( new CustomEvent('stopplayback') ); + } + else if ( !playback ) { + startPlayback( getSlideDuration() ); + closeChalkboard(); + } + updateReadOnlyMode(); + } + }); + + Reveal.addEventListener( 'autoslideresumed', function( evt ) { +//console.log('autoslideresumed'); + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + }); + Reveal.addEventListener( 'autoslidepaused', function( evt ) { +//console.log('autoslidepaused'); + document.dispatchEvent( new CustomEvent('stopplayback') ); + + // advance to end of slide +// closeChalkboard(); + startPlayback( getSlideDuration(), 0 ); + }); + + function toggleNotesCanvas() { + if ( !readOnly ) { + if ( mode == 1 ) { + toggleChalkboard(); + notescanvas.style.background = background[0]; //'rgba(255,0,0,0.5)'; + notescanvas.style.pointerEvents = "auto"; + } + else { + if ( notescanvas.style.pointerEvents != "none" ) { + event = null; + notescanvas.style.background = 'rgba(0,0,0,0)'; + notescanvas.style.pointerEvents = "none"; + } + else { + setColor(0); + recordEvent( { type:"setcolor", index: 0, begin: Date.now() - slideStart } ); + if (color[mode]) { + let idx = color[mode]; + setColor(idx); + recordEvent( { type:"setcolor", index: idx, begin: Date.now() - slideStart } ); + } else { + color[mode] = 0; + } + notescanvas.style.background = background[0]; //'rgba(255,0,0,0.5)'; + notescanvas.style.pointerEvents = "auto"; + } + } + } + }; + + function toggleChalkboard() { +//console.log("toggleChalkboard " + mode); + if ( mode == 1 ) { + event = null; + if ( !readOnly ) { + recordEvent( { type:"close", begin: Date.now() - slideStart } ); + } + closeChalkboard(); + } + else { + showChalkboard(); + if ( !readOnly ) { + recordEvent( { type:"open", begin: Date.now() - slideStart } ); + setColor(0); + recordEvent( { type:"setcolor", index: 0, begin: Date.now() - slideStart } ); + if (rememberColor[mode]) { + let idx = color[mode]; + setColor(idx); + recordEvent( { type:"setcolor", index: idx, begin: Date.now() - slideStart } ); + } else { + color[mode] = 0; + } + } + } + }; + + function clear() { + if ( !readOnly ) { + recordEvent( { type:"clear", begin: Date.now() - slideStart } ); + clearCanvas( mode ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'clear' }; + document.dispatchEvent( message ); + } + }; + + function colorNext() { + if ( !readOnly ) { + let idx = cycleColorNext(); + setColor(idx); + recordEvent( { type: "setcolor", index: idx, begin: Date.now() - slideStart } ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', index: idx }; + document.dispatchEvent( message ); + } + } + + function colorPrev() { + if ( !readOnly ) { + let idx = cycleColorPrev(); + setColor(idx); + recordEvent( { type: "setcolor", index: idx, begin: Date.now() - slideStart } ); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', index: idx }; + document.dispatchEvent( message ); + } + } + + function resetSlide( force ) { + var ok = force || confirm("Please confirm to delete chalkboard drawings on this slide!"); + if ( ok ) { +//console.log("resetSlide "); + stopPlayback(); + slideStart = Date.now(); + event = null; + closeChalkboard(); + + clearCanvas( 0 ); + clearCanvas( 1 ); + + mode = 1; + var slideData = getSlideData(); + slideData.duration = 0; + slideData.events = []; + mode = 0; + var slideData = getSlideData(); + slideData.duration = 0; + slideData.events = []; + + updateReadOnlyMode(); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'resetSlide' }; + document.dispatchEvent( message ); + } + }; + + function resetStorage( force ) { + var ok = force || confirm("Please confirm to delete all chalkboard drawings!"); + if ( ok ) { + stopPlayback(); + slideStart = Date.now(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( mode == 1 ) { + event = null; + closeChalkboard(); + } + storage = [ + { width: drawingCanvas[0].width - 2 * drawingCanvas[0].xOffset, height: drawingCanvas[0].height - 2 * drawingCanvas[0].yOffset, data: []}, + { width: drawingCanvas[1].width, height: drawingCanvas[1].height, data: []} + ]; + + updateReadOnlyMode(); + // broadcast + var message = new CustomEvent('send'); + message.content = { sender: 'chalkboard-plugin', type: 'init', storage: storage, mode: mode }; + document.dispatchEvent( message ); + } + }; + + +/* + this.drawWithBoardmarker = drawWithBoardmarker; + this.drawWithChalk = drawWithChalk; + this.startRecording = startRecording; +*/ + this.toggleNotesCanvas = toggleNotesCanvas; + this.toggleChalkboard = toggleChalkboard; + this.colorNext = colorNext; + this.colorPrev = colorPrev; + this.clear = clear; + this.reset = resetSlide; + this.resetAll = resetStorage; + this.download = downloadData; + this.configure = configure; + + + for (var key in keyBindings) { + if ( keyBindings[key] ) { + Reveal.addKeyBinding( keyBindings[key], RevealChalkboard[key] ); + } + }; + + return this; +}; diff --git a/yknjs/reveal.js-plugins/chart/Chart.js b/yknjs/reveal.js-plugins/chart/Chart.js new file mode 100644 index 0000000..e8d937c --- /dev/null +++ b/yknjs/reveal.js-plugins/chart/Chart.js @@ -0,0 +1,16151 @@ +/*! + * Chart.js v2.9.3 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : +typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : +(global = global || self, global.Chart = factory(global.moment)); +}(this, (function (moment) { 'use strict'; + +moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +function getCjsExportFromNamespace (n) { + return n && n['default'] || n; +} + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +var conversions = createCommonjsModule(function (module) { +/* MIT license */ + + +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) + +var reverseKeywords = {}; +for (var key in colorName) { + if (colorName.hasOwnProperty(key)) { + reverseKeywords[colorName[key]] = key; + } +} + +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; + +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } + + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } + + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } + + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } +} + +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } + + h = Math.min(h * 60, 360); + + if (h < 0) { + h += 360; + } + + l = (min + max) / 2; + + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + + return [h, s * 100, l * 100]; +}; + +convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; + + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; + + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } + + return [ + h * 360, + s * 100, + v * 100 + ]; +}; + +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); + + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +}; + +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + + return [c * 100, m * 100, y * 100, k * 100]; +}; + +/** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); +} + +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + + var currentClosestDistance = Infinity; + var currentClosestKeyword; + + for (var keyword in colorName) { + if (colorName.hasOwnProperty(keyword)) { + var value = colorName[keyword]; + + // Compute comparative distance + var distance = comparativeDistance(rgb, value); + + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } + + return currentClosestKeyword; +}; + +convert.keyword.rgb = function (keyword) { + return colorName[keyword]; +}; + +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y * 100, z * 100]; +}; + +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +}; + +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; + + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } + + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + + rgb[i] = val * 255; + } + + return rgb; +}; + +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + + return [h, sv * 100, v * 100]; +}; + +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; + + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; + + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; + +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; + + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + + return [h, sl * 100, l * 100]; +}; + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + + if ((i & 0x01) !== 0) { + f = 1 - f; + } + + n = wh + f * (v - wh); // linear interpolation + + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +}; + +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + + return [r * 255, g * 255, b * 255]; +}; + +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; + + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; + + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +}; + +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +}; + +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; + + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; + + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + + x *= 95.047; + y *= 100; + z *= 108.883; + + return [x, y, z]; +}; + +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + + if (h < 0) { + h += 360; + } + + c = Math.sqrt(a * a + b * b); + + return [l, c, h]; +}; + +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + + return [l, a, b]; +}; + +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + + value = Math.round(value / 50); + + if (value === 0) { + return 30; + } + + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + + if (value === 2) { + ansi += 60; + } + + return ansi; +}; + +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; + +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } + + if (r > 248) { + return 231; + } + + return Math.round(((r - 8) / 247) * 24) + 232; + } + + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); + + return ansi; +}; + +convert.ansi16.rgb = function (args) { + var color = args % 10; + + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } + + color = color / 10.5 * 255; + + return [color, color, color]; + } + + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; + + return [r, g, b]; +}; + +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } + + args -= 16; + + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; + + return [r, g, b]; +}; + +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; + +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + + var colorString = match[0]; + + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } + + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; + + return [r, g, b]; +}; + +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; + + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } + + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } + + hue /= 6; + hue %= 1; + + return [hue * 360, chroma * 100, grayscale * 100]; +}; + +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; + + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } + + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } + + return [hsl[0], c * 100, f * 100]; +}; + +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; + + var c = s * v; + var f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); + } + + return [hsv[0], c * 100, f * 100]; +}; + +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } + + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; + + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + + mg = (1.0 - c) * g; + + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; + +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var v = c + g * (1.0 - c); + var f = 0; + + if (v > 0.0) { + f = c / v; + } + + return [hcg[0], f * 100, v * 100]; +}; + +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; + + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + + return [hcg[0], s * 100, l * 100]; +}; + +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; + +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; + + if (c < 1) { + g = (v - c) / (1 - c); + } + + return [hwb[0], c * 100, g * 100]; +}; + +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; +}; + +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; + +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; + +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; + +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; + +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; + +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; +}; + +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; + +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; +}); +var conversions_1 = conversions.rgb; +var conversions_2 = conversions.hsl; +var conversions_3 = conversions.hsv; +var conversions_4 = conversions.hwb; +var conversions_5 = conversions.cmyk; +var conversions_6 = conversions.xyz; +var conversions_7 = conversions.lab; +var conversions_8 = conversions.lch; +var conversions_9 = conversions.hex; +var conversions_10 = conversions.keyword; +var conversions_11 = conversions.ansi16; +var conversions_12 = conversions.ansi256; +var conversions_13 = conversions.hcg; +var conversions_14 = conversions.apple; +var conversions_15 = conversions.gray; + +/* + this function routes a model to all other models. + + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). + + conversions that are not possible simply are not included. +*/ + +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; +} + +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop + + graph[fromModel].distance = 0; + + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); + + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; +} + +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} + +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; + + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } + + fn.conversion = path; + return fn; +} + +var route = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; + + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; + + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; +}; + +var convert = {}; + +var models = Object.keys(conversions); + +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + return fn(args); + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; +} + +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + var result = fn(args); + + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; +} + +models.forEach(function (fromModel) { + convert[fromModel] = {}; + + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); + + var routes = route(fromModel); + var routeModels = Object.keys(routes); + + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); + +var colorConvert = convert; + +var colorName$1 = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName$1[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName$1) { + reverseNames[colorName$1[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: Object.assign || function(target) { + return helpers.merge(target, [].slice.call(arguments, 1), { + merger: function(key, dst, src) { + dst[key] = src[key]; + } + }); + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + }, + + _deprecated: function(scope, value, previous, current) { + if (value !== undefined) { + console.warn(scope + ': "' + previous + + '" is deprecated. Please use "' + current + '" instead'); + } + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.save(); + ctx.translate(x, y); + ctx.rotate(rad); + ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); + ctx.restore(); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +// TODO(v3): remove 'global' from namespace. all default are global and +// there's inconsistency around which options are under 'global' +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @param {object} [info] - object to return information about resolution in + * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable. + * @since 2.7.0 + */ + resolve: function(inputs, context, index, info) { + var cacheable = true; + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + cacheable = false; + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + cacheable = false; + } + if (value !== undefined) { + if (info && !cacheable) { + info.cacheable = false; + } + return value; + } + } + } +}; + +/** + * @alias Chart.helpers.math + * @namespace + */ +var exports$2 = { + /** + * Returns an array of factors sorted from 1 to sqrt(value) + * @private + */ + _factorize: function(value) { + var result = []; + var sqrt = Math.sqrt(value); + var i; + + for (i = 1; i < sqrt; i++) { + if (value % i === 0) { + result.push(i); + result.push(value / i); + } + } + if (sqrt === (sqrt | 0)) { // if value is a square number + result.push(sqrt); + } + + result.sort(function(a, b) { + return a - b; + }).pop(); + return result; + }, + + log10: Math.log10 || function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + } +}; + +var helpers_math = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.math.log10 instead. + * @namespace Chart.helpers.log10 + * @deprecated since version 2.9.0 + * @todo remove at version 3 + * @private + */ +helpers_core.log10 = exports$2.log10; + +var getRtlAdapter = function(rectX, width) { + return { + x: function(x) { + return rectX + rectX + width - x; + }, + setWidth: function(w) { + width = w; + }, + textAlign: function(align) { + if (align === 'center') { + return align; + } + return align === 'right' ? 'left' : 'right'; + }, + xPlus: function(x, value) { + return x - value; + }, + leftForLtr: function(x, itemWidth) { + return x - itemWidth; + }, + }; +}; + +var getLtrAdapter = function() { + return { + x: function(x) { + return x; + }, + setWidth: function(w) { // eslint-disable-line no-unused-vars + }, + textAlign: function(align) { + return align; + }, + xPlus: function(x, value) { + return x + value; + }, + leftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars + return x; + }, + }; +}; + +var getAdapter = function(rtl, rectX, width) { + return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter(); +}; + +var overrideTextDirection = function(ctx, direction) { + var style, original; + if (direction === 'ltr' || direction === 'rtl') { + style = ctx.canvas.style; + original = [ + style.getPropertyValue('direction'), + style.getPropertyPriority('direction'), + ]; + + style.setProperty('direction', direction, 'important'); + ctx.prevTextDirection = original; + } +}; + +var restoreTextDirection = function(ctx) { + var original = ctx.prevTextDirection; + if (original !== undefined) { + delete ctx.prevTextDirection; + ctx.canvas.style.setProperty('direction', original[0], original[1]); + } +}; + +var helpers_rtl = { + getRtlAdapter: getAdapter, + overrideTextDirection: overrideTextDirection, + restoreTextDirection: restoreTextDirection, +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +var math = helpers_math; +var rtl = helpers_rtl; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; +helpers$1.math = math; +helpers$1.rtl = rtl; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + _type: undefined, + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.extend({}, me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = helpers$1.extend({}, model); + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$3 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$3; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$3.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$3.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + /** + * Dataset element option keys to be resolved in _resolveDatasetElementOptions. + * A derived controller may override this to resolve controller-specific options. + * The keys defined here are for backward compatibility for legend styles. + * @private + */ + _datasetElementOptions: [ + 'backgroundColor', + 'borderCapStyle', + 'borderColor', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'borderWidth' + ], + + /** + * Data element option keys to be resolved in _resolveDataElementOptions. + * A derived controller may override this to resolve controller-specific options. + * The keys defined here are for backward compatibility for legend styles. + * @private + */ + _dataElementOptions: [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'pointStyle' + ], + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + me._type = me.getMeta().type; + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var chart = me.chart; + var scales = chart.scales; + var dataset = me.getDataset(); + var scalesOpts = chart.options.scales; + + if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) { + meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) { + meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this._update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + /** + * Returns the merged user-supplied and default dataset-level options + * @private + */ + _configure: function() { + var me = this; + me._config = helpers$1.merge({}, [ + me.chart.options.datasets[me._type], + me.getDataset(), + ], { + merger: function(key, target, source) { + if (key !== '_meta' && key !== 'data') { + helpers$1._merger(key, target, source); + } + } + }); + }, + + _update: function(reset) { + var me = this; + me._configure(); + me._cachedDataOpts = null; + me.update(reset); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + /** + * Returns a set of predefined style properties that should be used to represent the dataset + * or the data if the index is specified + * @param {number} index - data index + * @return {IStyleInterface} style object + */ + getStyle: function(index) { + var me = this; + var meta = me.getMeta(); + var dataset = meta.dataset; + var style; + + me._configure(); + if (dataset && index === undefined) { + style = me._resolveDatasetElementOptions(dataset || {}); + } else { + index = index || 0; + style = me._resolveDataElementOptions(meta.data[index] || {}, index); + } + + if (style.fill === false || style.fill === null) { + style.backgroundColor = style.borderColor; + } + + return style; + }, + + /** + * @private + */ + _resolveDatasetElementOptions: function(element, hover) { + var me = this; + var chart = me.chart; + var datasetOpts = me._config; + var custom = element.custom || {}; + var options = chart.options.elements[me.datasetElementType.prototype._type] || {}; + var elementOptions = me._datasetElementOptions; + var values = {}; + var i, ilen, key, readKey; + + // Scriptable options + var context = { + chart: chart, + dataset: me.getDataset(), + datasetIndex: me.index, + hover: hover + }; + + for (i = 0, ilen = elementOptions.length; i < ilen; ++i) { + key = elementOptions[i]; + readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key; + values[key] = resolve([ + custom[readKey], + datasetOpts[readKey], + options[readKey] + ], context); + } + + return values; + }, + + /** + * @private + */ + _resolveDataElementOptions: function(element, index) { + var me = this; + var custom = element && element.custom; + var cached = me._cachedDataOpts; + if (cached && !custom) { + return cached; + } + var chart = me.chart; + var datasetOpts = me._config; + var options = chart.options.elements[me.dataElementType.prototype._type] || {}; + var elementOptions = me._dataElementOptions; + var values = {}; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: me.getDataset(), + datasetIndex: me.index + }; + + // `resolve` sets cacheable to `false` if any option is indexed or scripted + var info = {cacheable: !custom}; + + var keys, i, ilen, key; + + custom = custom || {}; + + if (helpers$1.isArray(elementOptions)) { + for (i = 0, ilen = elementOptions.length; i < ilen; ++i) { + key = elementOptions[i]; + values[key] = resolve([ + custom[key], + datasetOpts[key], + options[key] + ], context, index, info); + } + } else { + keys = Object.keys(elementOptions); + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve([ + custom[key], + datasetOpts[elementOptions[key]], + datasetOpts[key], + options[key] + ], context, index, info); + } + } + + if (info.cacheable) { + me._cachedDataOpts = Object.freeze(values); + } + + return values; + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + _removeDatasetHoverStyle: function() { + var element = this.getMeta().dataset; + + if (element) { + this.removeHoverStyle(element); + } + }, + + /** + * @private + */ + _setDatasetHoverStyle: function() { + var element = this.getMeta().dataset; + var prev = {}; + var i, ilen, key, keys, hoverOptions, model; + + if (!element) { + return; + } + + model = element._model; + hoverOptions = this._resolveDatasetElementOptions(element, true); + + keys = Object.keys(hoverOptions); + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + prev[key] = model[key]; + model[key] = hoverOptions[key]; + } + + element.$previousStyle = prev; + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +var TAU = Math.PI * 2; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +function clipArc(ctx, arc) { + var startAngle = arc.startAngle; + var endAngle = arc.endAngle; + var pixelMargin = arc.pixelMargin; + var angleMargin = pixelMargin / arc.outerRadius; + var x = arc.x; + var y = arc.y; + + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin); + if (arc.innerRadius > pixelMargin) { + angleMargin = pixelMargin / arc.innerRadius; + ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true); + } else { + ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); +} + +function drawFullCircleBorders(ctx, vm, arc, inner) { + var endAngle = arc.endAngle; + var i; + + if (inner) { + arc.endAngle = arc.startAngle + TAU; + clipArc(ctx, arc); + arc.endAngle = endAngle; + if (arc.endAngle === arc.startAngle && arc.fullCircles) { + arc.endAngle += TAU; + arc.fullCircles--; + } + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true); + for (i = 0; i < arc.fullCircles; ++i) { + ctx.stroke(); + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU); + for (i = 0; i < arc.fullCircles; ++i) { + ctx.stroke(); + } +} + +function drawBorder(ctx, vm, arc) { + var inner = vm.borderAlign === 'inner'; + + if (inner) { + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + if (arc.fullCircles) { + drawFullCircleBorders(ctx, vm, arc, inner); + } + + if (inner) { + clipArc(ctx, arc); + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); + ctx.closePath(); + ctx.stroke(); +} + +var element_arc = core_element.extend({ + _type: 'arc', + + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += TAU; + } + while (angle > endAngle) { + angle -= TAU; + } + while (angle < startAngle) { + angle += TAU; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var arc = { + x: vm.x, + y: vm.y, + innerRadius: vm.innerRadius, + outerRadius: Math.max(vm.outerRadius - pixelMargin, 0), + pixelMargin: pixelMargin, + startAngle: vm.startAngle, + endAngle: vm.endAngle, + fullCircles: Math.floor(vm.circumference / TAU) + }; + var i; + + ctx.save(); + + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + + if (arc.fullCircles) { + arc.endAngle = arc.startAngle + TAU; + ctx.beginPath(); + ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); + ctx.closePath(); + for (i = 0; i < arc.fullCircles; ++i) { + ctx.fill(); + } + arc.endAngle = arc.startAngle + vm.circumference % TAU; + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); + ctx.closePath(); + ctx.fill(); + + if (vm.borderWidth) { + drawBorder(ctx, vm, arc); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + _type: 'line', + + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var closePath = me._loop; + var index, previous, currentVM; + + if (!points.length) { + return; + } + + if (me._loop) { + for (index = 0; index < points.length; ++index) { + previous = helpers$1.previousItem(points, index); + // If the line has an open path, shift the point array + if (!points[index]._view.skip && previous._view.skip) { + points = points.slice(index).concat(points.slice(0, index)); + closePath = spanGaps; + break; + } + } + // If the line has a close path, add the first point again + if (closePath) { + points.push(points[0]); + } + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + + // First point moves to it's starting position no matter what + currentVM = points[0]._view; + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = 0; + } + + for (index = 1; index < points.length; ++index) { + currentVM = points[index]._view; + previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, currentVM); + } + lastDrawnIndex = index; + } + } + + if (closePath) { + ctx.closePath(); + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + _type: 'point', + + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + _type: 'rectangle', + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var deprecated = helpers$1._deprecated; +var valueOrDefault$3 = helpers$1.valueOrDefault; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +core_defaults._set('global', { + datasets: { + bar: { + categoryPercentage: 0.8, + barPercentage: 0.9 + } + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale._length; + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var min = helpers$1.isNullOrUndef(thickness) + ? computeMinSampleSize(ruler.scale, ruler.pixels) + : -1; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + /** + * @private + */ + _dataElementOptions: [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth', + 'barPercentage', + 'barThickness', + 'categoryPercentage', + 'maxBarThickness', + 'minBarLength' + ], + + initialize: function() { + var me = this; + var meta, scaleOpts; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + + scaleOpts = me._getIndexScale().options; + deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage'); + deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness'); + deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage'); + deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength'); + deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness'); + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveDataElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + if (helpers$1.isArray(dataset.data[index])) { + rectangle._model.borderSkipped = null; + } + + me._updateElementGeometry(rectangle, index, reset, options); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset, options) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index, options); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var scale = me._getIndexScale(); + var metasets = scale._getMatchingVisibleMetas(me._type); + var stacked = scale.options.stacked; + var ilen = metasets.length; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = metasets[i]; + // stacked | meta.stack + // | found | not found | undefined + // false | x | x | x + // true | | x | + // undefined | | x | x + if (stacked === false || stacks.indexOf(meta.stack) === -1 || + (stacked === undefined && meta.stack === undefined)) { + stacks.push(meta.stack); + } + if (meta.index === last) { + break; + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var pixels = []; + var i, ilen; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, me.index)); + } + + return { + pixels: pixels, + start: scale._startPixel, + end: scale._endPixel, + stackCount: me.getStackCount(), + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index, options) { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var metasets = scale._getMatchingVisibleMetas(me._type); + var value = scale._parseValue(datasets[datasetIndex].data[index]); + var minBarLength = options.minBarLength; + var stacked = scale.options.stacked; + var stack = me.getMeta().stack; + var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max; + var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max; + var ilen = metasets.length; + var i, imeta, ivalue, base, head, size, stackLength; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < ilen; ++i) { + imeta = metasets[i]; + + if (imeta.index === datasetIndex) { + break; + } + + if (imeta.stack === stack) { + stackLength = scale._parseValue(datasets[imeta.index].data[index]); + ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min; + + if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + length); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler, options) { + var me = this; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + valueOrDefault$3(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + var val = scale._parseValue(dataset.data[i]); + if (!isNaN(val.min) && !isNaN(val.max)) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveDataElementOptions: function() { + var me = this; + var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments)); + var indexOpts = me._getIndexScale().options; + var valueOpts = me._getValueScale().options; + + values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage); + values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness); + values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage); + values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness); + values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength); + + return values; + } + +}); + +var valueOrDefault$4 = helpers$1.valueOrDefault; +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @private + */ + _dataElementOptions: [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ], + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveDataElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveDataElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = point.custom || {}; + var data = dataset.data[index] || {}; + var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments); + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + // In case values were cached (and thus frozen), we need to clone the values + if (me._cachedDataOpts === values) { + values = helpers$1.extend({}, values); + } + + // Custom radius resolution + values.radius = resolve$1([ + custom.radius, + data.r, + me._config.radius, + chart.options.elements.point.radius + ], context, index); + + return values; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; + +var PI$1 = Math.PI; +var DOUBLE_PI$1 = PI$1 * 2; +var HALF_PI$1 = PI$1 / 2; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var list = document.createElement('ul'); + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + var i, ilen, listItem, listItemSpan; + + list.setAttribute('class', chart.id + '-legend'); + if (datasets.length) { + for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) { + listItem = list.appendChild(document.createElement('li')); + listItemSpan = listItem.appendChild(document.createElement('span')); + listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i]; + if (labels[i]) { + listItem.appendChild(document.createTextNode(labels[i])); + } + } + } + + return list.outerHTML; + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var style = meta.controller.getStyle(i); + + return { + text: label, + fillStyle: style.backgroundColor, + strokeStyle: style.borderColor, + lineWidth: style.borderWidth, + hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: -HALF_PI$1, + + // The total circumference of the chart. + circumference: DOUBLE_PI$1, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + /** + * @private + */ + _dataElementOptions: [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ], + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var ratioX = 1; + var ratioY = 1; + var offsetX = 0; + var offsetY = 0; + var meta = me.getMeta(); + var arcs = meta.data; + var cutout = opts.cutoutPercentage / 100 || 0; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var maxWidth, maxHeight, i, ilen; + + // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc + if (circumference < DOUBLE_PI$1) { + var startAngle = opts.rotation % DOUBLE_PI$1; + startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0; + var endAngle = startAngle + circumference; + var startX = Math.cos(startAngle); + var startY = Math.sin(startAngle); + var endX = Math.cos(endAngle); + var endY = Math.sin(endAngle); + var contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1; + var contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1; + var contains180 = startAngle === -PI$1 || endAngle >= PI$1; + var contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1; + var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout); + var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout); + var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout); + var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout); + ratioX = (maxX - minX) / 2; + ratioY = (maxY - minY) / 2; + offsetX = -(maxX + minX) / 2; + offsetY = -(maxY + minY) / 2; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveDataElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX; + maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY; + chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); + chart.innerRadius = Math.max(chart.outerRadius * cutout, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offsetX * chart.outerRadius; + chart.offsetY = offsetY * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return DOUBLE_PI$1 * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + if (controller) { + controller._configure(); + options = controller._resolveDataElementOptions(arc, i); + } else { + options = arc._options; + } + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +core_defaults._set('global', { + datasets: { + horizontalBar: { + categoryPercentage: 0.8, + barPercentage: 0.9 + } + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function scaleClip(scale, halfBorderWidth) { + var tickOpts = scale && scale.options.ticks || {}; + var reverse = tickOpts.reverse; + var min = tickOpts.min === undefined ? halfBorderWidth : 0; + var max = tickOpts.max === undefined ? halfBorderWidth : 0; + return { + start: reverse ? max : min, + end: reverse ? min : max + }; +} + +function defaultClip(xScale, yScale, borderWidth) { + var halfBorderWidth = borderWidth / 2; + var x = scaleClip(xScale, halfBorderWidth); + var y = scaleClip(yScale, halfBorderWidth); + + return { + top: y.end, + right: x.end, + bottom: y.start, + left: x.start + }; +} + +function toClip(value) { + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = value.top; + r = value.right; + b = value.bottom; + l = value.left; + } else { + t = r = b = l = value; + } + + return { + top: t, + right: r, + bottom: b, + left: l + }; +} + + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + /** + * @private + */ + _datasetElementOptions: [ + 'backgroundColor', + 'borderCapStyle', + 'borderColor', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'borderWidth', + 'cubicInterpolationMode', + 'fill' + ], + + /** + * @private + */ + _dataElementOptions: { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var options = me.chart.options; + var config = me._config; + var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines); + var i, ilen; + + me._xScale = me.getScaleForId(meta.xAxisID); + me._yScale = me.getScaleForId(meta.yAxisID); + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if (config.tension !== undefined && config.lineTension === undefined) { + config.lineTension = config.tension; + } + + // Utility + line._scale = me._yScale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveDatasetElementOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var xScale = me._xScale; + var yScale = me._yScale; + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolveDataElementOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolveDatasetElementOptions: function(element) { + var me = this; + var config = me._config; + var custom = element.custom || {}; + var options = me.chart.options; + var lineOptions = options.elements.line; + var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps); + values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension); + values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]); + values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth))); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var yScale = me._yScale; + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen; + + if (yScale.options.stacked) { + rightValue = +yScale.getRightValue(value); + metasets = chart._getSortedVisibleDatasetMetas(); + ilen = metasets.length; + + for (i = 0; i < ilen; ++i) { + dsMeta = metasets[i]; + if (dsMeta.index === datasetIndex) { + break; + } + + ds = chart.data.datasets[dsMeta.index]; + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) { + stackedRightValue = +yScale.getRightValue(ds.data[index]); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var canvas = chart.canvas; + var i = 0; + var ilen = points.length; + var clip; + + if (me._showLine) { + clip = meta.dataset._model.clip; + + helpers$1.canvas.clipArea(chart.ctx, { + left: clip.left === false ? 0 : area.left - clip.left, + right: clip.right === false ? canvas.width : area.right + clip.right, + top: clip.top === false ? 0 : area.top - clip.top, + bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + }, +}); + +var resolve$3 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var list = document.createElement('ul'); + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + var i, ilen, listItem, listItemSpan; + + list.setAttribute('class', chart.id + '-legend'); + if (datasets.length) { + for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) { + listItem = list.appendChild(document.createElement('li')); + listItemSpan = listItem.appendChild(document.createElement('span')); + listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i]; + if (labels[i]) { + listItem.appendChild(document.createTextNode(labels[i])); + } + } + } + + return list.outerHTML; + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var style = meta.controller.getStyle(i); + + return { + text: label, + fillStyle: style.backgroundColor, + strokeStyle: style.borderColor, + lineWidth: style.borderWidth, + hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + /** + * @private + */ + _dataElementOptions: [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ], + + /** + * @private + */ + _getIndexScaleId: function() { + return this.chart.scale.id; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.chart.scale.id; + }, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveDataElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$3([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('radar', { + spanGaps: false, + scale: { + type: 'radialLinear' + }, + elements: { + line: { + fill: 'start', + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + /** + * @private + */ + _datasetElementOptions: [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ], + + /** + * @private + */ + _dataElementOptions: { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.chart.scale.id; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.chart.scale.id; + }, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var config = me._config; + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if (config.tension !== undefined && config.lineTension === undefined) { + config.lineTension = config.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveDatasetElementOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolveDataElementOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolveDatasetElementOptions: function() { + var me = this; + var config = me._config; + var options = me.chart.options; + var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); + + values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps); + values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (meta.dataset._model.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$7(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +core_defaults._set('global', { + datasets: { + scatter: { + showLine: false + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var metasets = chart._getSortedVisibleDatasetMetas(); + var metadata, i, j, ilen, jlen, element; + + for (i = 0, ilen = metasets.length; i < ilen; ++i) { + metadata = metasets[i].data; + for (j = 0, jlen = metadata.length; j < jlen; ++j) { + element = metadata[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart._getSortedVisibleDatasetMetas().forEach(function(meta) { + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +var extend = helpers$1.extend; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.pos === position; + }); +} + +function sortByWeight(array, reverse) { + return array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0.index - v1.index : + v0.weight - v1.weight; + }); +} + +function wrapBoxes(boxes) { + var layoutBoxes = []; + var i, ilen, box; + + for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { + box = boxes[i]; + layoutBoxes.push({ + index: i, + box: box, + pos: box.position, + horizontal: box.isHorizontal(), + weight: box.weight + }); + } + return layoutBoxes; +} + +function setLayoutDims(layouts, params) { + var i, ilen, layout; + for (i = 0, ilen = layouts.length; i < ilen; ++i) { + layout = layouts[i]; + // store width used instead of chartArea.w in fitBoxes + layout.width = layout.horizontal + ? layout.box.fullWidth && params.availableWidth + : params.vBoxMaxWidth; + // store height used instead of chartArea.h in fitBoxes + layout.height = layout.horizontal && params.hBoxMaxHeight; + } +} + +function buildLayoutBoxes(boxes) { + var layoutBoxes = wrapBoxes(boxes); + var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true); + var right = sortByWeight(filterByPosition(layoutBoxes, 'right')); + var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true); + var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom')); + + return { + leftAndTop: left.concat(top), + rightAndBottom: right.concat(bottom), + chartArea: filterByPosition(layoutBoxes, 'chartArea'), + vertical: left.concat(right), + horizontal: top.concat(bottom) + }; +} + +function getCombinedMax(maxPadding, chartArea, a, b) { + return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); +} + +function updateDims(chartArea, params, layout) { + var box = layout.box; + var maxPadding = chartArea.maxPadding; + var newWidth, newHeight; + + if (layout.size) { + // this layout was already counted for, lets first reduce old size + chartArea[layout.pos] -= layout.size; + } + layout.size = layout.horizontal ? box.height : box.width; + chartArea[layout.pos] += layout.size; + + if (box.getPadding) { + var boxPadding = box.getPadding(); + maxPadding.top = Math.max(maxPadding.top, boxPadding.top); + maxPadding.left = Math.max(maxPadding.left, boxPadding.left); + maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); + maxPadding.right = Math.max(maxPadding.right, boxPadding.right); + } + + newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'); + newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'); + + if (newWidth !== chartArea.w || newHeight !== chartArea.h) { + chartArea.w = newWidth; + chartArea.h = newHeight; + + // return true if chart area changed in layout's direction + return layout.horizontal ? newWidth !== chartArea.w : newHeight !== chartArea.h; + } +} + +function handleMaxPadding(chartArea) { + var maxPadding = chartArea.maxPadding; + + function updatePos(pos) { + var change = Math.max(maxPadding[pos] - chartArea[pos], 0); + chartArea[pos] += change; + return change; + } + chartArea.y += updatePos('top'); + chartArea.x += updatePos('left'); + updatePos('right'); + updatePos('bottom'); +} + +function getMargins(horizontal, chartArea) { + var maxPadding = chartArea.maxPadding; + + function marginForPositions(positions) { + var margin = {left: 0, top: 0, right: 0, bottom: 0}; + positions.forEach(function(pos) { + margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); + }); + return margin; + } + + return horizontal + ? marginForPositions(['left', 'right']) + : marginForPositions(['top', 'bottom']); +} + +function fitBoxes(boxes, chartArea, params) { + var refitBoxes = []; + var i, ilen, layout, box, refit, changed; + + for (i = 0, ilen = boxes.length; i < ilen; ++i) { + layout = boxes[i]; + box = layout.box; + + box.update( + layout.width || chartArea.w, + layout.height || chartArea.h, + getMargins(layout.horizontal, chartArea) + ); + if (updateDims(chartArea, params, layout)) { + changed = true; + if (refitBoxes.length) { + // Dimensions changed and there were non full width boxes before this + // -> we have to refit those + refit = true; + } + } + if (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case + refitBoxes.push(layout); + } + } + + return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed; +} + +function placeBoxes(boxes, chartArea, params) { + var userPadding = params.padding; + var x = chartArea.x; + var y = chartArea.y; + var i, ilen, layout, box; + + for (i = 0, ilen = boxes.length; i < ilen; ++i) { + layout = boxes[i]; + box = layout.box; + if (layout.horizontal) { + box.left = box.fullWidth ? userPadding.left : chartArea.left; + box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w; + box.top = y; + box.bottom = y + box.height; + box.width = box.right - box.left; + y = box.bottom; + } else { + box.left = x; + box.right = x + box.width; + box.top = chartArea.top; + box.bottom = chartArea.top + chartArea.h; + box.height = box.bottom - box.top; + x = box.right; + } + } + + chartArea.x = x; + chartArea.y = y; +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + item._layers = item._layers || function() { + return [{ + z: 0, + draw: function() { + item.draw.apply(item, arguments); + } + }]; + }; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + + var availableWidth = width - padding.width; + var availableHeight = height - padding.height; + var boxes = buildLayoutBoxes(chart.boxes); + var verticalBoxes = boxes.vertical; + var horizontalBoxes = boxes.horizontal; + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + + var params = Object.freeze({ + outerWidth: width, + outerHeight: height, + padding: padding, + availableWidth: availableWidth, + vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length, + hBoxMaxHeight: availableHeight / 2 + }); + var chartArea = extend({ + maxPadding: extend({}, padding), + w: availableWidth, + h: availableHeight, + x: padding.left, + y: padding.top + }, padding); + + setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); + + // First fit vertical boxes + fitBoxes(verticalBoxes, chartArea, params); + + // Then fit horizontal boxes + if (fitBoxes(horizontalBoxes, chartArea, params)) { + // if the area changed, re-fit vertical boxes + fitBoxes(verticalBoxes, chartArea, params); + } + + handleMaxPadding(chartArea); + + // Finally place the boxes to correct coordinates + placeBoxes(boxes.leftAndTop, chartArea, params); + + // Move to opposite side of chart + chartArea.x += chartArea.w; + chartArea.y += chartArea.h; + + placeBoxes(boxes.rightAndBottom, chartArea, params); + + chart.chartArea = { + left: chartArea.left, + top: chartArea.top, + right: chartArea.left + chartArea.w, + bottom: chartArea.top + chartArea.h + }; + + // Finally update boxes in chartArea (radial scale for example) + helpers$1.each(boxes.chartArea, function(layout) { + var box = layout.box; + extend(box, chart.chartArea); + box.update(chartArea.w, chartArea.h); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +__proto__: null, +'default': platform_dom +}); + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +/** + * Injects CSS styles inline if the styles are not already present. + * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the ",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("vbscript",function(e){return{aliases:["vbs"],cI:!0,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C(/'/,/$/,{r:0}),e.CNM]}});hljs.registerLanguage("vbscript-html",function(r){return{sL:"xml",c:[{b:"<%",e:"%>",sL:"vbscript"}]}});hljs.registerLanguage("typescript",function(e){var r={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"};return{aliases:["ts"],k:r,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+e.IR+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:e.IR},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:["self",e.CLCM,e.CBCM]}]}]}],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:r,c:["self",e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/%/,r:0},{bK:"constructor",e:/\{/,eE:!0,c:["self",{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}]},{b:/module\./,k:{built_in:"module"},r:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("bnf",function(e){return{c:[{cN:"attribute",b://},{b:/::=/,starts:{e:/$/,c:[{b://},e.CLCM,e.CBCM,e.ASM,e.QSM]}}]}});hljs.registerLanguage("moonscript",function(e){var t={keyword:"if then not for in while do return else elseif break continue switch and or unless when class extends super local import export from using",literal:"true false nil",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},r="[A-Za-z$_][0-9A-Za-z$_]*",s={cN:"subst",b:/#\{/,e:/}/,k:t},a=[e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'/,e:/'/,c:[e.BE]},{b:/"/,e:/"/,c:[e.BE,s]}]},{cN:"built_in",b:"@__"+e.IR},{b:"@"+e.IR},{b:e.IR+"\\\\"+e.IR}];s.c=a;var c=e.inherit(e.TM,{b:r}),n="(\\(.*\\))?\\s*\\B[-=]>",i={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:t,c:["self"].concat(a)}]};return{aliases:["moon"],k:t,i:/\/\*/,c:a.concat([e.C("--","$"),{cN:"function",b:"^\\s*"+r+"\\s*=\\s*"+n,e:"[-=]>",rB:!0,c:[c,i]},{b:/[\(,:=]\s*/,r:0,c:[{cN:"function",b:n,e:"[-=]>",rB:!0,c:[i]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[c]},c]},{cN:"name",b:r+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("fsharp",function(e){var t={b:"<",e:">",c:[e.inherit(e.TM,{b:/'[a-zA-Z0-9_]+/})]};return{aliases:["fs"],k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",i:/\/\*/,c:[{cN:"keyword",b:/\b(yield|return|let|do)!/},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},e.C("\\(\\*","\\*\\)"),{cN:"class",bK:"type",e:"\\(|=|$",eE:!0,c:[e.UTM,t]},{cN:"meta",b:"\\[<",e:">\\]",r:10},{cN:"symbol",b:"\\B('[A-Za-z])\\b",c:[e.BE]},e.CLCM,e.inherit(e.QSM,{i:null}),e.CNM]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U)?L?"',e:'"',i:"\\n",c:[t.BE]},{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("lua",function(e){var t="\\[=*\\[",a="\\]=*\\]",r={b:t,e:a,c:["self"]},n=[e.C("--(?!"+t+")","$"),e.C("--"+t,a,{c:[r],r:10})];return{l:e.UIR,k:{literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},c:n.concat([{cN:"function",bK:"function",e:"\\)",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:!0,c:n}].concat(n)},e.CNM,e.ASM,e.QSM,{cN:"string",b:t,e:a,c:[r],r:5}])}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u,l.c[1].c=u;var h={cN:"params",b:"\\(",e:"\\)",c:u};return{aliases:["erl"],k:b,i:"(",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("htmlbars",function(e){var a="action collection component concat debugger each each-in else get hash if input link-to loc log mut outlet partial query-params render textarea unbound unless with yield view",t={i:/\}\}/,b:/[a-zA-Z0-9_]+=/,rB:!0,r:0,c:[{cN:"attr",b:/[a-zA-Z0-9_]+/}]},i=({i:/\}\}/,b:/\)/,e:/\)/,c:[{b:/[a-zA-Z\.\-]+/,k:{built_in:a},starts:{eW:!0,r:0,c:[e.QSM]}}]},{eW:!0,r:0,k:{keyword:"as",built_in:a},c:[e.QSM,t,e.NM]});return{cI:!0,sL:"xml",c:[e.C("{{!(--)?","(--)?}}"),{cN:"template-tag",b:/\{\{[#\/]/,e:/\}\}/,c:[{cN:"name",b:/[a-zA-Z\.\-]+/,k:{"builtin-name":a},starts:i}]},{cN:"template-variable",b:/\{\{[a-zA-Z][a-zA-Z\-]+/,e:/\}\}/,k:{keyword:"as",built_in:a},c:[e.QSM]}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("haml",function(s){return{cI:!0,c:[{cN:"meta",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},s.C("^\\s*(!=#|=#|-#|/).*$",!1,{r:0}),{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"selector-tag",b:"\\w+"},{cN:"selector-id",b:"#[\\w-]+"},{cN:"selector-class",b:"\\.[\\w-]+"},{b:"{\\s*",e:"\\s*}",c:[{b:":\\w+\\s*=>",e:",\\s+",rB:!0,eW:!0,c:[{cN:"attr",b:":\\w+"},s.ASM,s.QSM,{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:!0,c:[{b:"\\w+\\s*=",e:"\\s+",rB:!0,eW:!0,c:[{cN:"attr",b:"\\w+",r:0},s.ASM,s.QSM,{b:"\\w+",r:0}]}]}]},{b:"^\\s*[=~]\\s*"},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("mizar",function(e){return{k:"environ vocabularies notations constructors definitions registrations theorems schemes requirements begin end definition registration cluster existence pred func defpred deffunc theorem proof let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from be being by means equals implies iff redefine define now not or attr is mode suppose per cases set thesis contradiction scheme reserve struct correctness compatibility coherence symmetry assymetry reflexivity irreflexivity connectedness uniqueness commutativity idempotence involutiveness projectivity",c:[e.C("::","$")]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("django",function(e){var t={b:/\|[A-Za-z]+:?/,k:{name:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone"},c:[e.QSM,e.ASM]};return{aliases:["jinja"],cI:!0,sL:"xml",c:[e.C(/\{%\s*comment\s*%}/,/\{%\s*endcomment\s*%}/),e.C(/\{#/,/#}/),{cN:"template-tag",b:/\{%/,e:/%}/,c:[{cN:"name",b:/\w+/,k:{name:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim"},starts:{eW:!0,k:"in by as",c:[t],r:0}}]},{cN:"template-variable",b:/\{\{/,e:/}}/,c:[t]}]}});hljs.registerLanguage("avrasm",function(r){return{cI:!0,l:"\\.?"+r.IR,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf",meta:".byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list .listmac .macro .nolist .org .set"},c:[r.CBCM,r.C(";","$",{r:0}),r.CNM,r.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},r.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"symbol",b:"^[A-Za-z0-9_.$]+:"},{cN:"meta",b:"#",e:"$"},{cN:"subst",b:"@[0-9]+"}]}});hljs.registerLanguage("q",function(e){var s={keyword:"do while select delete by update from",literal:"0b 1b",built_in:"neg not null string reciprocal floor ceiling signum mod xbar xlog and or each scan over prior mmu lsq inv md5 ltime gtime count first var dev med cov cor all any rand sums prds mins maxs fills deltas ratios avgs differ prev next rank reverse iasc idesc asc desc msum mcount mavg mdev xrank mmin mmax xprev rotate distinct group where flip type key til get value attr cut set upsert raze union inter except cross sv vs sublist enlist read0 read1 hopen hclose hdel hsym hcount peach system ltrim rtrim trim lower upper ssr view tables views cols xcols keys xkey xcol xasc xdesc fkeys meta lj aj aj0 ij pj asof uj ww wj wj1 fby xgroup ungroup ej save load rsave rload show csv parse eval min max avg wavg wsum sin cos tan sum",type:"`float `double int `timestamp `timespan `datetime `time `boolean `symbol `char `byte `short `long `real `month `date `minute `second `guid"};return{aliases:["k","kdb"],k:s,l:/(`?)[A-Za-z0-9_]+\b/,c:[e.CLCM,e.QSM,e.CNM]}});hljs.registerLanguage("brainfuck",function(r){var n={cN:"literal",b:"[\\+\\-]",r:0};return{aliases:["bf"],c:[r.C("[^\\[\\]\\.,\\+\\-<> \r\n]","[\\[\\]\\.,\\+\\-<> \r\n]",{rE:!0,r:0}),{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:!0,c:[n]},n]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("excel",function(E){return{aliases:["xlsx","xls"],cI:!0,l:/[a-zA-Z][\w\.]*/,k:{built_in:"ABS ACCRINT ACCRINTM ACOS ACOSH ACOT ACOTH AGGREGATE ADDRESS AMORDEGRC AMORLINC AND ARABIC AREAS ASC ASIN ASINH ATAN ATAN2 ATANH AVEDEV AVERAGE AVERAGEA AVERAGEIF AVERAGEIFS BAHTTEXT BASE BESSELI BESSELJ BESSELK BESSELY BETADIST BETA.DIST BETAINV BETA.INV BIN2DEC BIN2HEX BIN2OCT BINOMDIST BINOM.DIST BINOM.DIST.RANGE BINOM.INV BITAND BITLSHIFT BITOR BITRSHIFT BITXOR CALL CEILING CEILING.MATH CEILING.PRECISE CELL CHAR CHIDIST CHIINV CHITEST CHISQ.DIST CHISQ.DIST.RT CHISQ.INV CHISQ.INV.RT CHISQ.TEST CHOOSE CLEAN CODE COLUMN COLUMNS COMBIN COMBINA COMPLEX CONCAT CONCATENATE CONFIDENCE CONFIDENCE.NORM CONFIDENCE.T CONVERT CORREL COS COSH COT COTH COUNT COUNTA COUNTBLANK COUNTIF COUNTIFS COUPDAYBS COUPDAYS COUPDAYSNC COUPNCD COUPNUM COUPPCD COVAR COVARIANCE.P COVARIANCE.S CRITBINOM CSC CSCH CUBEKPIMEMBER CUBEMEMBER CUBEMEMBERPROPERTY CUBERANKEDMEMBER CUBESET CUBESETCOUNT CUBEVALUE CUMIPMT CUMPRINC DATE DATEDIF DATEVALUE DAVERAGE DAY DAYS DAYS360 DB DBCS DCOUNT DCOUNTA DDB DEC2BIN DEC2HEX DEC2OCT DECIMAL DEGREES DELTA DEVSQ DGET DISC DMAX DMIN DOLLAR DOLLARDE DOLLARFR DPRODUCT DSTDEV DSTDEVP DSUM DURATION DVAR DVARP EDATE EFFECT ENCODEURL EOMONTH ERF ERF.PRECISE ERFC ERFC.PRECISE ERROR.TYPE EUROCONVERT EVEN EXACT EXP EXPON.DIST EXPONDIST FACT FACTDOUBLE FALSE|0 F.DIST FDIST F.DIST.RT FILTERXML FIND FINDB F.INV F.INV.RT FINV FISHER FISHERINV FIXED FLOOR FLOOR.MATH FLOOR.PRECISE FORECAST FORECAST.ETS FORECAST.ETS.CONFINT FORECAST.ETS.SEASONALITY FORECAST.ETS.STAT FORECAST.LINEAR FORMULATEXT FREQUENCY F.TEST FTEST FV FVSCHEDULE GAMMA GAMMA.DIST GAMMADIST GAMMA.INV GAMMAINV GAMMALN GAMMALN.PRECISE GAUSS GCD GEOMEAN GESTEP GETPIVOTDATA GROWTH HARMEAN HEX2BIN HEX2DEC HEX2OCT HLOOKUP HOUR HYPERLINK HYPGEOM.DIST HYPGEOMDIST IF|0 IFERROR IFNA IFS IMABS IMAGINARY IMARGUMENT IMCONJUGATE IMCOS IMCOSH IMCOT IMCSC IMCSCH IMDIV IMEXP IMLN IMLOG10 IMLOG2 IMPOWER IMPRODUCT IMREAL IMSEC IMSECH IMSIN IMSINH IMSQRT IMSUB IMSUM IMTAN INDEX INDIRECT INFO INT INTERCEPT INTRATE IPMT IRR ISBLANK ISERR ISERROR ISEVEN ISFORMULA ISLOGICAL ISNA ISNONTEXT ISNUMBER ISODD ISREF ISTEXT ISO.CEILING ISOWEEKNUM ISPMT JIS KURT LARGE LCM LEFT LEFTB LEN LENB LINEST LN LOG LOG10 LOGEST LOGINV LOGNORM.DIST LOGNORMDIST LOGNORM.INV LOOKUP LOWER MATCH MAX MAXA MAXIFS MDETERM MDURATION MEDIAN MID MIDBs MIN MINIFS MINA MINUTE MINVERSE MIRR MMULT MOD MODE MODE.MULT MODE.SNGL MONTH MROUND MULTINOMIAL MUNIT N NA NEGBINOM.DIST NEGBINOMDIST NETWORKDAYS NETWORKDAYS.INTL NOMINAL NORM.DIST NORMDIST NORMINV NORM.INV NORM.S.DIST NORMSDIST NORM.S.INV NORMSINV NOT NOW NPER NPV NUMBERVALUE OCT2BIN OCT2DEC OCT2HEX ODD ODDFPRICE ODDFYIELD ODDLPRICE ODDLYIELD OFFSET OR PDURATION PEARSON PERCENTILE.EXC PERCENTILE.INC PERCENTILE PERCENTRANK.EXC PERCENTRANK.INC PERCENTRANK PERMUT PERMUTATIONA PHI PHONETIC PI PMT POISSON.DIST POISSON POWER PPMT PRICE PRICEDISC PRICEMAT PROB PRODUCT PROPER PV QUARTILE QUARTILE.EXC QUARTILE.INC QUOTIENT RADIANS RAND RANDBETWEEN RANK.AVG RANK.EQ RANK RATE RECEIVED REGISTER.ID REPLACE REPLACEB REPT RIGHT RIGHTB ROMAN ROUND ROUNDDOWN ROUNDUP ROW ROWS RRI RSQ RTD SEARCH SEARCHB SEC SECH SECOND SERIESSUM SHEET SHEETS SIGN SIN SINH SKEW SKEW.P SLN SLOPE SMALL SQL.REQUEST SQRT SQRTPI STANDARDIZE STDEV STDEV.P STDEV.S STDEVA STDEVP STDEVPA STEYX SUBSTITUTE SUBTOTAL SUM SUMIF SUMIFS SUMPRODUCT SUMSQ SUMX2MY2 SUMX2PY2 SUMXMY2 SWITCH SYD T TAN TANH TBILLEQ TBILLPRICE TBILLYIELD T.DIST T.DIST.2T T.DIST.RT TDIST TEXT TEXTJOIN TIME TIMEVALUE T.INV T.INV.2T TINV TODAY TRANSPOSE TREND TRIM TRIMMEAN TRUE|0 TRUNC T.TEST TTEST TYPE UNICHAR UNICODE UPPER VALUE VAR VAR.P VAR.S VARA VARP VARPA VDB VLOOKUP WEBSERVICE WEEKDAY WEEKNUM WEIBULL WEIBULL.DIST WORKDAY WORKDAY.INTL XIRR XNPV XOR YEAR YEARFRAC YIELD YIELDDISC YIELDMAT Z.TEST ZTEST"},c:[{b:/^=/,e:/[^=]/,rE:!0,i:/=/,r:10},{cN:"symbol",b:/\b[A-Z]{1,2}\d+\b/,e:/[^\d]/,eE:!0,r:0},{cN:"symbol",b:/[A-Z]{0,2}\d*:[A-Z]{0,2}\d*/,r:0},E.BE,E.QSM,{cN:"number",b:E.NR+"(%)?",r:0},E.C(/\bN\(/,/\)/,{eB:!0,eE:!0,i:/\n/})]}});hljs.registerLanguage("aspectj",function(e){var t="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",i="get set args call";return{k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"aspect",e:/[{;=]/,eE:!0,i:/[:;"\[\]]/,c:[{bK:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},e.UTM,{b:/\([^\)]*/,e:/[)]+/,k:t+" "+i,eE:!1}]},{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,r:0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"pointcut after before around throwing returning",e:/[)]/,eE:!1,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",rB:!0,c:[e.UTM]}]},{b:/[:]/,rB:!0,e:/[{;]/,r:0,eE:!1,k:t,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",k:t+" "+i,r:0},e.QSM]},{bK:"new throw",r:0},{cN:"function",b:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,rB:!0,e:/[{;=]/,k:t,eE:!0,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,r:0,k:t,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]},l={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,c]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:l.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,l]}});hljs.registerLanguage("tap",function(b){return{cI:!0,c:[b.HCM,{cN:"meta",v:[{b:"^TAP version (\\d+)$"},{b:"^1\\.\\.(\\d+)$"}]},{b:"(s+)?---$",e:"\\.\\.\\.$",sL:"yaml",r:0},{cN:"number",b:" (\\d+) "},{cN:"symbol",v:[{b:"^ok"},{b:"^not ok"}]}]}});hljs.registerLanguage("stan",function(e){return{c:[e.HCM,e.CLCM,e.CBCM,{b:e.UIR,l:e.UIR,k:{name:"for in while repeat until if then else",symbol:"bernoulli bernoulli_logit binomial binomial_logit beta_binomial hypergeometric categorical categorical_logit ordered_logistic neg_binomial neg_binomial_2 neg_binomial_2_log poisson poisson_log multinomial normal exp_mod_normal skew_normal student_t cauchy double_exponential logistic gumbel lognormal chi_square inv_chi_square scaled_inv_chi_square exponential inv_gamma weibull frechet rayleigh wiener pareto pareto_type_2 von_mises uniform multi_normal multi_normal_prec multi_normal_cholesky multi_gp multi_gp_cholesky multi_student_t gaussian_dlm_obs dirichlet lkj_corr lkj_corr_cholesky wishart inv_wishart","selector-tag":"int real vector simplex unit_vector ordered positive_ordered row_vector matrix cholesky_factor_corr cholesky_factor_cov corr_matrix cov_matrix",title:"functions model data parameters quantities transformed generated",literal:"true false"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0}]}});hljs.registerLanguage("ebnf",function(a){var e=a.C(/\(\*/,/\*\)/),t={cN:"attribute",b:/^[ ]*[a-zA-Z][a-zA-Z-]*([\s-]+[a-zA-Z][a-zA-Z]*)*/},r={cN:"meta",b:/\?.*\?/},b={b:/=/,e:/;/,c:[e,r,a.ASM,a.QSM]};return{i:/\S/,c:[e,t,b]}});hljs.registerLanguage("scheme",function(e){var t="[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+",r="(\\-|\\+)?\\d+([./]\\d+)?",a=r+"[+\\-]"+r+"i",i={"builtin-name":"case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules ' * + , ,@ - ... / ; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"},n={cN:"meta",b:"^#!",e:"$"},c={cN:"literal",b:"(#t|#f|#\\\\"+t+"|#\\\\.)"},l={cN:"number",v:[{b:r,r:0},{b:a,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"}]},s=e.QSM,o=[e.C(";","$",{r:0}),e.C("#\\|","\\|#")],u={b:t,r:0},p={cN:"symbol",b:"'"+t},d={eW:!0,r:0},m={v:[{b:/'/},{b:"`"}],c:[{b:"\\(",e:"\\)",c:["self",c,s,l,u,p]}]},g={cN:"name",b:t,l:t,k:i},h={b:/lambda/,eW:!0,rB:!0,c:[g,{b:/\(/,e:/\)/,endsParent:!0,c:[u]}]},b={v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}],c:[h,g,d]};return d.c=[c,l,s,u,p,m,b].concat(o),{i:/\S/,c:[n,l,s,p,m,b].concat(o)}});hljs.registerLanguage("mipsasm",function(s){return{cI:!0,aliases:["mips"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .ltorg ",built_in:"$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 zero at v0 v1 a0 a1 a2 a3 a4 a5 a6 a7 t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 s0 s1 s2 s3 s4 s5 s6 s7 s8 k0 k1 gp sp fp ra $f0 $f1 $f2 $f2 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11 $f12 $f13 $f14 $f15 $f16 $f17 $f18 $f19 $f20 $f21 $f22 $f23 $f24 $f25 $f26 $f27 $f28 $f29 $f30 $f31 Context Random EntryLo0 EntryLo1 Context PageMask Wired EntryHi HWREna BadVAddr Count Compare SR IntCtl SRSCtl SRSMap Cause EPC PRId EBase Config Config1 Config2 Config3 LLAddr Debug DEPC DESAVE CacheErr ECC ErrorEPC TagLo DataLo TagHi DataHi WatchLo WatchHi PerfCtl PerfCnt "},c:[{cN:"keyword",b:"\\b(addi?u?|andi?|b(al)?|beql?|bgez(al)?l?|bgtzl?|blezl?|bltz(al)?l?|bnel?|cl[oz]|divu?|ext|ins|j(al)?|jalr(.hb)?|jr(.hb)?|lbu?|lhu?|ll|lui|lw[lr]?|maddu?|mfhi|mflo|movn|movz|move|msubu?|mthi|mtlo|mul|multu?|nop|nor|ori?|rotrv?|sb|sc|se[bh]|sh|sllv?|slti?u?|srav?|srlv?|subu?|sw[lr]?|xori?|wsbh|abs.[sd]|add.[sd]|alnv.ps|bc1[ft]l?|c.(s?f|un|u?eq|[ou]lt|[ou]le|ngle?|seq|l[et]|ng[et]).[sd]|(ceil|floor|round|trunc).[lw].[sd]|cfc1|cvt.d.[lsw]|cvt.l.[dsw]|cvt.ps.s|cvt.s.[dlw]|cvt.s.p[lu]|cvt.w.[dls]|div.[ds]|ldx?c1|luxc1|lwx?c1|madd.[sd]|mfc1|mov[fntz]?.[ds]|msub.[sd]|mth?c1|mul.[ds]|neg.[ds]|nmadd.[ds]|nmsub.[ds]|p[lu][lu].ps|recip.fmt|r?sqrt.[ds]|sdx?c1|sub.[ds]|suxc1|swx?c1|break|cache|d?eret|[de]i|ehb|mfc0|mtc0|pause|prefx?|rdhwr|rdpgpr|sdbbp|ssnop|synci?|syscall|teqi?|tgei?u?|tlb(p|r|w[ir])|tlti?u?|tnei?|wait|wrpgpr)",e:"\\s"},s.C("[;#]","$"),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"0x[0-9a-f]+"},{b:"\\b-?\\d+"}],r:0},{cN:"symbol",v:[{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"^\\s*[0-9]+:"},{b:"[0-9]+[bf]"}],r:0}],i:"/"}});hljs.registerLanguage("purebasic",function(e){var r={cN:"string",b:'(~)?"',e:'"',i:"\\n"},t={cN:"symbol",b:"#[a-zA-Z_]\\w*\\$?"};return{aliases:["pb","pbi"],k:"And As Break CallDebugger Case CompilerCase CompilerDefault CompilerElse CompilerEndIf CompilerEndSelect CompilerError CompilerIf CompilerSelect Continue Data DataSection EndDataSection Debug DebugLevel Default Define Dim DisableASM DisableDebugger DisableExplicit Else ElseIf EnableASM EnableDebugger EnableExplicit End EndEnumeration EndIf EndImport EndInterface EndMacro EndProcedure EndSelect EndStructure EndStructureUnion EndWith Enumeration Extends FakeReturn For Next ForEach ForEver Global Gosub Goto If Import ImportC IncludeBinary IncludeFile IncludePath Interface Macro NewList Not Or ProcedureReturn Protected Prototype PrototypeC Read ReDim Repeat Until Restore Return Select Shared Static Step Structure StructureUnion Swap To Wend While With XIncludeFile XOr Procedure ProcedureC ProcedureCDLL ProcedureDLL Declare DeclareC DeclareCDLL DeclareDLL",c:[e.C(";","$",{r:0}),{cN:"function",b:"\\b(Procedure|Declare)(C|CDLL|DLL)?\\b",e:"\\(",eE:!0,rB:!0,c:[{cN:"keyword",b:"(Procedure|Declare)(C|CDLL|DLL)?",eE:!0},{cN:"type",b:"\\.\\w*"},e.UTM]},r,t]}});hljs.registerLanguage("jboss-cli",function(e){var a={b:/[\w-]+ *=/,rB:!0,r:0,c:[{cN:"attr",b:/[\w-]+/}]},r={cN:"params",b:/\(/,e:/\)/,c:[a],r:0},o={cN:"function",b:/:[\w\-.]+/,r:0},t={cN:"string",b:/\B(([\/.])[\w\-.\/=]+)+/},c={cN:"params",b:/--[\w\-=\/]+/};return{aliases:["wildfly-cli"],l:"[a-z-]+",k:{keyword:"alias batch cd clear command connect connection-factory connection-info data-source deploy deployment-info deployment-overlay echo echo-dmr help history if jdbc-driver-info jms-queue|20 jms-topic|20 ls patch pwd quit read-attribute read-operation reload rollout-plan run-batch set shutdown try unalias undeploy unset version xa-data-source",literal:"true false"},c:[e.HCM,e.QSM,c,o,t,r]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("tex",function(c){var e={cN:"tag",b:/\\/,r:0,c:[{cN:"name",v:[{b:/[a-zA-Zа-яА-я]+[*]?/},{b:/[^a-zA-Zа-яА-я0-9]/}],starts:{eW:!0,r:0,c:[{cN:"string",v:[{b:/\[/,e:/\]/},{b:/\{/,e:/\}/}]},{b:/\s*=\s*/,eW:!0,r:0,c:[{cN:"number",b:/-?\d*\.?\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?/}]}]}}]};return{c:[e,{cN:"formula",c:[e],r:0,v:[{b:/\$\$/,e:/\$\$/},{b:/\$/,e:/\$/}]},c.C("%","$",{r:0})]}});hljs.registerLanguage("profile",function(e){return{c:[e.CNM,{b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:!0},{b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{b:"function calls",e:"$",c:[e.CNM],r:10},e.ASM,e.QSM,{cN:"string",b:"\\(",e:"\\)$",eB:!0,eE:!0,r:0}]}});hljs.registerLanguage("gherkin",function(e){return{aliases:["feature"],k:"Feature Background Ability Business Need Scenario Scenarios Scenario Outline Scenario Template Examples Given And Then But When",c:[{cN:"symbol",b:"\\*",r:0},{cN:"meta",b:"@[^@\\s]+"},{b:"\\|",e:"\\|\\w*$",c:[{cN:"string",b:"[^|]+"}]},{cN:"variable",b:"<",e:">"},e.HCM,{cN:"string",b:'"""',e:'"""'},e.QSM]}});hljs.registerLanguage("smalltalk",function(e){var s="[a-z][a-zA-Z0-9_]*",a={cN:"string",b:"\\$.{1}"},r={cN:"symbol",b:"#"+e.UIR};return{aliases:["st"],k:"self super nil true false thisContext",c:[e.C('"','"'),e.ASM,{cN:"type",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{b:s+":",r:0},e.CNM,r,a,{b:"\\|[ ]*"+s+"([ ]+"+s+")*[ ]*\\|",rB:!0,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+s}]},{b:"\\#\\(",e:"\\)",c:[e.ASM,a,e.CNM,r]}]}});hljs.registerLanguage("arduino",function(e){var t=e.getLanguage("cpp").exports;return{k:{keyword:"boolean byte word string String array "+t.k.keyword,built_in:"setup loop while catch for if do goto try switch case else default break continue return KeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",literal:"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW"},c:[t.preprocessor,e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("mathematica",function(e){return{aliases:["mma"],l:"(\\$|\\b)"+e.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber", +c:[{cN:"comment",b:/\(\*/,e:/\*\)/},e.ASM,e.QSM,e.CNM,{b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("roboconf",function(a){var e="[a-zA-Z-_][^\\n{]+\\{",n={cN:"attribute",b:/[a-zA-Z-_]+/,e:/\s*:/,eE:!0,starts:{e:";",r:0,c:[{cN:"variable",b:/\.[a-zA-Z-_]+/},{cN:"keyword",b:/\(optional\)/}]}};return{aliases:["graph","instances"],cI:!0,k:"import",c:[{b:"^facet "+e,e:"}",k:"facet",c:[n,a.HCM]},{b:"^\\s*instance of "+e,e:"}",k:"name count channels instance-data instance-state instance of",i:/\S/,c:["self",n,a.HCM]},{b:"^"+e,e:"}",c:[n,a.HCM]},a.HCM]}});hljs.registerLanguage("vim",function(e){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp"},i:/;/,c:[e.NM,e.ASM,{cN:"string",b:/"(\\"|\n\\|[^"\n])*"/},e.C('"',"$"),{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",r:0,c:[e.TM,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"symbol",b:/<[\w-]+>/}]}});hljs.registerLanguage("d",function(e){var t={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},r="(0|[1-9][\\d_]*)",a="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",i="0[bB][01_]+",n="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",_="0[xX]"+n,c="([eE][+-]?"+a+")",d="("+a+"(\\.\\d*|"+c+")|\\d+\\."+a+a+"|\\."+r+c+"?)",o="(0[xX]("+n+"\\."+n+"|\\.?"+n+")[pP][+-]?"+a+")",s="("+r+"|"+i+"|"+_+")",l="("+o+"|"+d+")",u="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",b={cN:"number",b:"\\b"+s+"(L|u|U|Lu|LU|uL|UL)?",r:0},f={cN:"number",b:"\\b("+l+"([fF]|L|i|[fF]i|Li)?|"+s+"(i|[fF]i|Li))",r:0},g={cN:"string",b:"'("+u+"|.)",e:"'",i:"."},h={b:u,r:0},p={cN:"string",b:'"',c:[h],e:'"[cwd]?'},m={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5},w={cN:"string",b:"`",e:"`[cwd]?"},N={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10},A={cN:"string",b:'q"\\{',e:'\\}"'},F={cN:"meta",b:"^#!",e:"$",r:5},y={cN:"meta",b:"#(line)",e:"$",r:5},L={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"},v=e.C("\\/\\+","\\+\\/",{c:["self"],r:10});return{l:e.UIR,k:t,c:[e.CLCM,e.CBCM,v,N,p,m,w,A,f,b,g,F,y,L]}});hljs.registerLanguage("scilab",function(e){var s=[e.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[e.BE,{b:"''"}]}];return{aliases:["sci"],l:/%?\w+/,k:{keyword:"abort break case clear catch continue do elseif else endfunction end for function global if pause return resume select try then while",literal:"%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan type typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},{b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{b:"\\[",e:"\\]'*[\\.']*",r:0,c:s},e.C("//","$")].concat(s)}});hljs.registerLanguage("lisp",function(b){var e="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",c="\\|[^]*?\\|",r="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",a={cN:"meta",b:"^#!",e:"$"},l={cN:"literal",b:"\\b(t{1}|nil)\\b"},n={cN:"number",v:[{b:r,r:0},{b:"#(b|B)[0-1]+(/[0-1]+)?"},{b:"#(o|O)[0-7]+(/[0-7]+)?"},{b:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{b:"#(c|C)\\("+r+" +"+r,e:"\\)"}]},i=b.inherit(b.QSM,{i:null}),t=b.C(";","$",{r:0}),s={b:"\\*",e:"\\*"},u={cN:"symbol",b:"[:&]"+e},d={b:e,r:0},f={b:c},m={b:"\\(",e:"\\)",c:["self",l,i,n,d]},o={c:[n,i,s,u,m,d],v:[{b:"['`]\\(",e:"\\)"},{b:"\\(quote ",e:"\\)",k:{name:"quote"}},{b:"'"+c}]},v={v:[{b:"'"+e},{b:"#'"+e+"(::"+e+")*"}]},N={b:"\\(\\s*",e:"\\)"},A={eW:!0,r:0};return N.c=[{cN:"name",v:[{b:e},{b:c}]},A],A.c=[o,v,N,l,n,i,t,s,u,f,d],{i:/\S/,c:[n,a,l,i,t,o,v,N,d]}});hljs.registerLanguage("xquery",function(e){var t="for let if while then else return where group by xquery encoding versionmodule namespace boundary-space preserve strip default collation base-uri orderingcopy-namespaces order declare import schema namespace function option in allowing emptyat tumbling window sliding window start when only end when previous next stable ascendingdescending empty greatest least some every satisfies switch case typeswitch try catch andor to union intersect instance of treat as castable cast map array delete insert intoreplace value rename copy modify update",a="false true xs:string xs:integer element item xs:date xs:datetime xs:float xs:double xs:decimal QName xs:anyURI xs:long xs:int xs:short xs:byte attribute",s={b:/\$[a-zA-Z0-9\-]+/},n={cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},r={cN:"string",v:[{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]},i={cN:"meta",b:"%\\w+"},c={cN:"comment",b:"\\(:",e:":\\)",r:10,c:[{cN:"doctag",b:"@\\w+"}]},o={b:"{",e:"}"},l=[s,r,n,c,i,o];return o.c=l,{aliases:["xpath","xq"],cI:!1,l:/[a-zA-Z\$][a-zA-Z0-9_:\-]*/,i:/(proc)|(abstract)|(extends)|(until)|(#)/,k:{keyword:t,literal:a},c:l}});hljs.registerLanguage("csp",function(r){return{cI:!1,l:"[a-zA-Z][a-zA-Z0-9_-]*",k:{keyword:"base-uri child-src connect-src default-src font-src form-action frame-ancestors frame-src img-src media-src object-src plugin-types report-uri sandbox script-src style-src"},c:[{cN:"string",b:"'",e:"'"},{cN:"attribute",b:"^Content",e:":",eE:!0}]}});hljs.registerLanguage("twig",function(e){var t={cN:"params",b:"\\(",e:"\\)"},a="attribute block constant cycle date dump include max min parent random range source template_from_string",r={bK:a,k:{name:a},r:0,c:[t]},c={b:/\|[A-Za-z_]+:?/,k:"abs batch capitalize convert_encoding date date_modify default escape first format join json_encode keys last length lower merge nl2br number_format raw replace reverse round slice sort split striptags title trim upper url_encode",c:[r]},s="autoescape block do embed extends filter flush for if import include macro sandbox set spaceless use verbatim";return s=s+" "+s.split(" ").map(function(e){return"end"+e}).join(" "),{aliases:["craftcms"],cI:!0,sL:"xml",c:[e.C(/\{#/,/#}/),{cN:"template-tag",b:/\{%/,e:/%}/,c:[{cN:"name",b:/\w+/,k:s,starts:{eW:!0,c:[c,r],r:0}}]},{cN:"template-variable",b:/\{\{/,e:/}}/,c:["self",c,r]}]}});hljs.registerLanguage("accesslog",function(T){return{c:[{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+\\b",r:0},{cN:"string",b:'"(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|PATCH|TRACE)',e:'"',k:"GET POST HEAD PUT DELETE CONNECT OPTIONS PATCH TRACE",i:"\\n",r:10},{cN:"string",b:/\[/,e:/\]/,i:"\\n"},{cN:"string",b:'"',e:'"',i:"\\n"}]}});hljs.registerLanguage("smali",function(t){var s=["add","and","cmp","cmpg","cmpl","const","div","double","float","goto","if","int","long","move","mul","neg","new","nop","not","or","rem","return","shl","shr","sput","sub","throw","ushr","xor"],e=["aget","aput","array","check","execute","fill","filled","goto/16","goto/32","iget","instance","invoke","iput","monitor","packed","sget","sparse"],r=["transient","constructor","abstract","final","synthetic","public","private","protected","static","bridge","system"];return{aliases:["smali"],c:[{cN:"string",b:'"',e:'"',r:0},t.C("#","$",{r:0}),{cN:"keyword",v:[{b:"\\s*\\.end\\s[a-zA-Z0-9]*"},{b:"^[ ]*\\.[a-zA-Z]*",r:0},{b:"\\s:[a-zA-Z_0-9]*",r:0},{b:"\\s("+r.join("|")+")"}]},{cN:"built_in",v:[{b:"\\s("+s.join("|")+")\\s"},{b:"\\s("+s.join("|")+")((\\-|/)[a-zA-Z0-9]+)+\\s",r:10},{b:"\\s("+e.join("|")+")((\\-|/)[a-zA-Z0-9]+)*\\s",r:10}]},{cN:"class",b:"L[^(;:\n]*;",r:0},{b:"[vp][0-9]+"}]}});hljs.registerLanguage("rsl",function(e){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"\\<:\-,()$\[\]_.{}!+%^]+)+/,r:0}]};return{aliases:["gms"],cI:!0,k:a,c:[e.C(/^\$ontext/,/^\$offtext/),{cN:"meta",b:"^\\$[a-z0-9]+",e:"$",rB:!0,c:[{cN:"meta-keyword",b:"^\\$[a-z0-9]+"}]},e.C("^\\*","$"),e.CLCM,e.CBCM,e.QSM,e.ASM,{bK:"set sets parameter parameters variable variables scalar scalars equation equations",e:";",c:[e.C("^\\*","$"),e.CLCM,e.CBCM,e.QSM,e.ASM,i,l]},{bK:"table",e:";",rB:!0,c:[{bK:"table",e:"$",c:[l]},e.C("^\\*","$"),e.CLCM,e.CBCM,e.QSM,e.ASM,e.CNM]},{cN:"function",b:/^[a-z][a-z0-9_,\-+' ()$]+\.{2}/,rB:!0,c:[{cN:"title",b:/^[a-z][a-z0-9_]+/},o,r]},e.CNM,r]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("thrift",function(e){var t="bool byte i16 i32 i64 double string binary";return{k:{keyword:"namespace const typedef struct enum service exception void oneway set list map required optional",built_in:t,literal:"true false"},c:[e.QSM,e.NM,e.CLCM,e.CBCM,{cN:"class",bK:"struct enum service exception",e:/\{/,i:/\n/,c:[e.inherit(e.TM,{starts:{eW:!0,eE:!0}})]},{b:"\\b(set|list|map)\\s*<",e:">",k:t,c:["self"]}]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("cmake",function(e){return{aliases:["cmake.in"],cI:!0,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or equal less greater strless strgreater strequal matches"},c:[{cN:"variable",b:"\\${",e:"}"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage("inform7",function(e){var r="\\[",o="\\]";return{aliases:["i7"],cI:!0,k:{keyword:"thing room person man woman animal container supporter backdrop door scenery open closed locked inside gender is are say understand kind of rule"},c:[{cN:"string",b:'"',e:'"',r:0,c:[{cN:"subst",b:r,e:o}]},{cN:"section",b:/^(Volume|Book|Part|Chapter|Section|Table)\b/,e:"$"},{b:/^(Check|Carry out|Report|Instead of|To|Rule|When|Before|After)\b/,e:":",c:[{b:"\\(This",e:"\\)"}]},{cN:"comment",b:r,e:o,c:["self"]}]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while nameof add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},t=e.inherit(r,{i:/\n/}),a={cN:"subst",b:"{",e:"}",k:i},n=e.inherit(a,{i:/\n/}),c={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,n]},s={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},a]},o=e.inherit(s,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},n]});a.c=[s,c,r,e.ASM,e.QSM,e.CNM,e.CBCM],n.c=[o,c,t,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[s,c,r,e.ASM,e.QSM]},b=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+b+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("clojure-repl",function(e){return{c:[{cN:"meta",b:/^([\w.-]+|\s*#_)=>/,starts:{e:/$/,sL:"clojure"}}]}});hljs.registerLanguage("zephir",function(e){var i={cN:"string",c:[e.BE],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:["zep"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var let while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally int uint long ulong char uchar double float bool boolean stringlikely unlikely",c:[e.CLCM,e.HCM,e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[e.BE]},{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e.CBCM,i,n]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},i,n]}});hljs.registerLanguage("nsis",function(e){var t={cN:"variable",b:/\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)/},i={cN:"variable",b:/\$+{[\w\.:-]+}/},n={cN:"variable",b:/\$+\w+/,i:/\(\){}/},r={cN:"variable",b:/\$+\([\w\^\.:-]+\)/},o={cN:"params",b:"(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)"},l={cN:"keyword",b:/\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|makensis|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)/},s={cN:"subst",b:/\$(\\[nrt]|\$)/},a={cN:"class",b:/\w+\:\:\w+/},S={cN:"string",v:[{b:'"',e:'"'},{b:"'",e:"'"},{b:"`",e:"`"}],i:/\n/,c:[s,t,i,n,r]};return{cI:!1,k:{keyword:"Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle",literal:"admin all auto both bottom bzip2 colored components current custom directory false force hide highest ifdiff ifnewer instfiles lastused leave left license listonly lzma nevershow none normal notset off on open print right show silent silentlog smooth textonly top true try un.components un.custom un.directory un.instfiles un.license uninstConfirm user Win10 Win7 Win8 WinVista zlib"},c:[e.HCM,e.CBCM,e.C(";","$",{r:0}),{cN:"function",bK:"Function PageEx Section SectionGroup",e:"$"},S,l,i,n,r,o,a,e.NM]}});hljs.registerLanguage("sqf",function(e){var t=e.getLanguage("cpp").exports,a={cN:"variable",b:/\b_+[a-zA-Z_]\w*/},o={cN:"title",b:/[a-zA-Z][a-zA-Z0-9]+_fnc_\w*/},r={cN:"string",v:[{b:'"',e:'"',c:[{b:'""',r:0}]},{b:"'",e:"'",c:[{b:"''",r:0}]}]};return{aliases:["sqf"],cI:!0,k:{keyword:"case catch default do else exit exitWith for forEach from if switch then throw to try waitUntil while with",built_in:"abs accTime acos action actionIDs actionKeys actionKeysImages actionKeysNames actionKeysNamesArray actionName actionParams activateAddons activatedAddons activateKey add3DENConnection add3DENEventHandler add3DENLayer addAction addBackpack addBackpackCargo addBackpackCargoGlobal addBackpackGlobal addCamShake addCuratorAddons addCuratorCameraArea addCuratorEditableObjects addCuratorEditingArea addCuratorPoints addEditorObject addEventHandler addGoggles addGroupIcon addHandgunItem addHeadgear addItem addItemCargo addItemCargoGlobal addItemPool addItemToBackpack addItemToUniform addItemToVest addLiveStats addMagazine addMagazineAmmoCargo addMagazineCargo addMagazineCargoGlobal addMagazineGlobal addMagazinePool addMagazines addMagazineTurret addMenu addMenuItem addMissionEventHandler addMPEventHandler addMusicEventHandler addOwnedMine addPlayerScores addPrimaryWeaponItem addPublicVariableEventHandler addRating addResources addScore addScoreSide addSecondaryWeaponItem addSwitchableUnit addTeamMember addToRemainsCollector addUniform addVehicle addVest addWaypoint addWeapon addWeaponCargo addWeaponCargoGlobal addWeaponGlobal addWeaponItem addWeaponPool addWeaponTurret agent agents AGLToASL aimedAtTarget aimPos airDensityRTD airportSide AISFinishHeal alive all3DENEntities allControls allCurators allCutLayers allDead allDeadMen allDisplays allGroups allMapMarkers allMines allMissionObjects allow3DMode allowCrewInImmobile allowCuratorLogicIgnoreAreas allowDamage allowDammage allowFileOperations allowFleeing allowGetIn allowSprint allPlayers allSites allTurrets allUnits allUnitsUAV allVariables ammo and animate animateDoor animateSource animationNames animationPhase animationSourcePhase animationState append apply armoryPoints arrayIntersect asin ASLToAGL ASLToATL assert assignAsCargo assignAsCargoIndex assignAsCommander assignAsDriver assignAsGunner assignAsTurret assignCurator assignedCargo assignedCommander assignedDriver assignedGunner assignedItems assignedTarget assignedTeam assignedVehicle assignedVehicleRole assignItem assignTeam assignToAirport atan atan2 atg ATLToASL attachedObject attachedObjects attachedTo attachObject attachTo attackEnabled backpack backpackCargo backpackContainer backpackItems backpackMagazines backpackSpaceFor behaviour benchmark binocular blufor boundingBox boundingBoxReal boundingCenter breakOut breakTo briefingName buildingExit buildingPos buttonAction buttonSetAction cadetMode call callExtension camCommand camCommit camCommitPrepared camCommitted camConstuctionSetParams camCreate camDestroy cameraEffect cameraEffectEnableHUD cameraInterest cameraOn cameraView campaignConfigFile camPreload camPreloaded camPrepareBank camPrepareDir camPrepareDive camPrepareFocus camPrepareFov camPrepareFovRange camPreparePos camPrepareRelPos camPrepareTarget camSetBank camSetDir camSetDive camSetFocus camSetFov camSetFovRange camSetPos camSetRelPos camSetTarget camTarget camUseNVG canAdd canAddItemToBackpack canAddItemToUniform canAddItemToVest cancelSimpleTaskDestination canFire canMove canSlingLoad canStand canSuspend canUnloadInCombat canVehicleCargo captive captiveNum cbChecked cbSetChecked ceil channelEnabled cheatsEnabled checkAIFeature checkVisibility civilian className clearAllItemsFromBackpack clearBackpackCargo clearBackpackCargoGlobal clearGroupIcons clearItemCargo clearItemCargoGlobal clearItemPool clearMagazineCargo clearMagazineCargoGlobal clearMagazinePool clearOverlay clearRadio clearWeaponCargo clearWeaponCargoGlobal clearWeaponPool clientOwner closeDialog closeDisplay closeOverlay collapseObjectTree collect3DENHistory combatMode commandArtilleryFire commandChat commander commandFire commandFollow commandFSM commandGetOut commandingMenu commandMove commandRadio commandStop commandSuppressiveFire commandTarget commandWatch comment commitOverlay compile compileFinal completedFSM composeText configClasses configFile configHierarchy configName configNull configProperties configSourceAddonList configSourceMod configSourceModList connectTerminalToUAV controlNull controlsGroupCtrl copyFromClipboard copyToClipboard copyWaypoints cos count countEnemy countFriendly countSide countType countUnknown create3DENComposition create3DENEntity createAgent createCenter createDialog createDiaryLink createDiaryRecord createDiarySubject createDisplay createGearDialog createGroup createGuardedPoint createLocation createMarker createMarkerLocal createMenu createMine createMissionDisplay createMPCampaignDisplay createSimpleObject createSimpleTask createSite createSoundSource createTask createTeam createTrigger createUnit createVehicle createVehicleCrew createVehicleLocal crew ctrlActivate ctrlAddEventHandler ctrlAngle ctrlAutoScrollDelay ctrlAutoScrollRewind ctrlAutoScrollSpeed ctrlChecked ctrlClassName ctrlCommit ctrlCommitted ctrlCreate ctrlDelete ctrlEnable ctrlEnabled ctrlFade ctrlHTMLLoaded ctrlIDC ctrlIDD ctrlMapAnimAdd ctrlMapAnimClear ctrlMapAnimCommit ctrlMapAnimDone ctrlMapCursor ctrlMapMouseOver ctrlMapScale ctrlMapScreenToWorld ctrlMapWorldToScreen ctrlModel ctrlModelDirAndUp ctrlModelScale ctrlParent ctrlParentControlsGroup ctrlPosition ctrlRemoveAllEventHandlers ctrlRemoveEventHandler ctrlScale ctrlSetActiveColor ctrlSetAngle ctrlSetAutoScrollDelay ctrlSetAutoScrollRewind ctrlSetAutoScrollSpeed ctrlSetBackgroundColor ctrlSetChecked ctrlSetEventHandler ctrlSetFade ctrlSetFocus ctrlSetFont ctrlSetFontH1 ctrlSetFontH1B ctrlSetFontH2 ctrlSetFontH2B ctrlSetFontH3 ctrlSetFontH3B ctrlSetFontH4 ctrlSetFontH4B ctrlSetFontH5 ctrlSetFontH5B ctrlSetFontH6 ctrlSetFontH6B ctrlSetFontHeight ctrlSetFontHeightH1 ctrlSetFontHeightH2 ctrlSetFontHeightH3 ctrlSetFontHeightH4 ctrlSetFontHeightH5 ctrlSetFontHeightH6 ctrlSetFontHeightSecondary ctrlSetFontP ctrlSetFontPB ctrlSetFontSecondary ctrlSetForegroundColor ctrlSetModel ctrlSetModelDirAndUp ctrlSetModelScale ctrlSetPosition ctrlSetScale ctrlSetStructuredText ctrlSetText ctrlSetTextColor ctrlSetTooltip ctrlSetTooltipColorBox ctrlSetTooltipColorShade ctrlSetTooltipColorText ctrlShow ctrlShown ctrlText ctrlTextHeight ctrlType ctrlVisible curatorAddons curatorCamera curatorCameraArea curatorCameraAreaCeiling curatorCoef curatorEditableObjects curatorEditingArea curatorEditingAreaType curatorMouseOver curatorPoints curatorRegisteredObjects curatorSelected curatorWaypointCost current3DENOperation currentChannel currentCommand currentMagazine currentMagazineDetail currentMagazineDetailTurret currentMagazineTurret currentMuzzle currentNamespace currentTask currentTasks currentThrowable currentVisionMode currentWaypoint currentWeapon currentWeaponMode currentWeaponTurret currentZeroing cursorObject cursorTarget customChat customRadio cutFadeOut cutObj cutRsc cutText damage date dateToNumber daytime deActivateKey debriefingText debugFSM debugLog deg delete3DENEntities deleteAt deleteCenter deleteCollection deleteEditorObject deleteGroup deleteIdentity deleteLocation deleteMarker deleteMarkerLocal deleteRange deleteResources deleteSite deleteStatus deleteTeam deleteVehicle deleteVehicleCrew deleteWaypoint detach detectedMines diag_activeMissionFSMs diag_activeScripts diag_activeSQFScripts diag_activeSQSScripts diag_captureFrame diag_captureSlowFrame diag_codePerformance diag_drawMode diag_enable diag_enabled diag_fps diag_fpsMin diag_frameNo diag_list diag_log diag_logSlowFrame diag_mergeConfigFile diag_recordTurretLimits diag_tickTime diag_toggle dialog diarySubjectExists didJIP didJIPOwner difficulty difficultyEnabled difficultyEnabledRTD difficultyOption direction directSay disableAI disableCollisionWith disableConversation disableDebriefingStats disableNVGEquipment disableRemoteSensors disableSerialization disableTIEquipment disableUAVConnectability disableUserInput displayAddEventHandler displayCtrl displayNull displayParent displayRemoveAllEventHandlers displayRemoveEventHandler displaySetEventHandler dissolveTeam distance distance2D distanceSqr distributionRegion do3DENAction doArtilleryFire doFire doFollow doFSM doGetOut doMove doorPhase doStop doSuppressiveFire doTarget doWatch drawArrow drawEllipse drawIcon drawIcon3D drawLine drawLine3D drawLink drawLocation drawPolygon drawRectangle driver drop east echo edit3DENMissionAttributes editObject editorSetEventHandler effectiveCommander emptyPositions enableAI enableAIFeature enableAimPrecision enableAttack enableAudioFeature enableCamShake enableCaustics enableChannel enableCollisionWith enableCopilot enableDebriefingStats enableDiagLegend enableEndDialog enableEngineArtillery enableEnvironment enableFatigue enableGunLights enableIRLasers enableMimics enablePersonTurret enableRadio enableReload enableRopeAttach enableSatNormalOnDetail enableSaving enableSentences enableSimulation enableSimulationGlobal enableStamina enableTeamSwitch enableUAVConnectability enableUAVWaypoints enableVehicleCargo endLoadingScreen endMission engineOn enginesIsOnRTD enginesRpmRTD enginesTorqueRTD entities estimatedEndServerTime estimatedTimeLeft evalObjectArgument everyBackpack everyContainer exec execEditorScript execFSM execVM exp expectedDestination exportJIPMessages eyeDirection eyePos face faction fadeMusic fadeRadio fadeSound fadeSpeech failMission fillWeaponsFromPool find findCover findDisplay findEditorObject findEmptyPosition findEmptyPositionReady findNearestEnemy finishMissionInit finite fire fireAtTarget firstBackpack flag flagOwner flagSide flagTexture fleeing floor flyInHeight flyInHeightASL fog fogForecast fogParams forceAddUniform forcedMap forceEnd forceMap forceRespawn forceSpeed forceWalk forceWeaponFire forceWeatherChange forEachMember forEachMemberAgent forEachMemberTeam format formation formationDirection formationLeader formationMembers formationPosition formationTask formatText formLeader freeLook fromEditor fuel fullCrew gearIDCAmmoCount gearSlotAmmoCount gearSlotData get3DENActionState get3DENAttribute get3DENCamera get3DENConnections get3DENEntity get3DENEntityID get3DENGrid get3DENIconsVisible get3DENLayerEntities get3DENLinesVisible get3DENMissionAttribute get3DENMouseOver get3DENSelected getAimingCoef getAllHitPointsDamage getAllOwnedMines getAmmoCargo getAnimAimPrecision getAnimSpeedCoef getArray getArtilleryAmmo getArtilleryComputerSettings getArtilleryETA getAssignedCuratorLogic getAssignedCuratorUnit getBackpackCargo getBleedingRemaining getBurningValue getCameraViewDirection getCargoIndex getCenterOfMass getClientState getClientStateNumber getConnectedUAV getCustomAimingCoef getDammage getDescription getDir getDirVisual getDLCs getEditorCamera getEditorMode getEditorObjectScope getElevationOffset getFatigue getFriend getFSMVariable getFuelCargo getGroupIcon getGroupIconParams getGroupIcons getHideFrom getHit getHitIndex getHitPointDamage getItemCargo getMagazineCargo getMarkerColor getMarkerPos getMarkerSize getMarkerType getMass getMissionConfig getMissionConfigValue getMissionDLCs getMissionLayerEntities getModelInfo getMousePosition getNumber getObjectArgument getObjectChildren getObjectDLC getObjectMaterials getObjectProxy getObjectTextures getObjectType getObjectViewDistance getOxygenRemaining getPersonUsedDLCs getPilotCameraDirection getPilotCameraPosition getPilotCameraRotation getPilotCameraTarget getPlayerChannel getPlayerScores getPlayerUID getPos getPosASL getPosASLVisual getPosASLW getPosATL getPosATLVisual getPosVisual getPosWorld getRelDir getRelPos getRemoteSensorsDisabled getRepairCargo getResolution getShadowDistance getShotParents getSlingLoad getSpeed getStamina getStatValue getSuppression getTerrainHeightASL getText getUnitLoadout getUnitTrait getVariable getVehicleCargo getWeaponCargo getWeaponSway getWPPos glanceAt globalChat globalRadio goggles goto group groupChat groupFromNetId groupIconSelectable groupIconsVisible groupId groupOwner groupRadio groupSelectedUnits groupSelectUnit grpNull gunner gusts halt handgunItems handgunMagazine handgunWeapon handsHit hasInterface hasPilotCamera hasWeapon hcAllGroups hcGroupParams hcLeader hcRemoveAllGroups hcRemoveGroup hcSelected hcSelectGroup hcSetGroup hcShowBar hcShownBar headgear hideBody hideObject hideObjectGlobal hideSelection hint hintC hintCadet hintSilent hmd hostMission htmlLoad HUDMovementLevels humidity image importAllGroups importance in inArea inAreaArray incapacitatedState independent inflame inflamed inGameUISetEventHandler inheritsFrom initAmbientLife inPolygon inputAction inRangeOfArtillery insertEditorObject intersect is3DEN is3DENMultiplayer isAbleToBreathe isAgent isArray isAutoHoverOn isAutonomous isAutotest isBleeding isBurning isClass isCollisionLightOn isCopilotEnabled isDedicated isDLCAvailable isEngineOn isEqualTo isEqualType isEqualTypeAll isEqualTypeAny isEqualTypeArray isEqualTypeParams isFilePatchingEnabled isFlashlightOn isFlatEmpty isForcedWalk isFormationLeader isHidden isInRemainsCollector isInstructorFigureEnabled isIRLaserOn isKeyActive isKindOf isLightOn isLocalized isManualFire isMarkedForCollection isMultiplayer isMultiplayerSolo isNil isNull isNumber isObjectHidden isObjectRTD isOnRoad isPipEnabled isPlayer isRealTime isRemoteExecuted isRemoteExecutedJIP isServer isShowing3DIcons isSprintAllowed isStaminaEnabled isSteamMission isStreamFriendlyUIEnabled isText isTouchingGround isTurnedOut isTutHintsEnabled isUAVConnectable isUAVConnected isUniformAllowed isVehicleCargo isWalking isWeaponDeployed isWeaponRested itemCargo items itemsWithMagazines join joinAs joinAsSilent joinSilent joinString kbAddDatabase kbAddDatabaseTargets kbAddTopic kbHasTopic kbReact kbRemoveTopic kbTell kbWasSaid keyImage keyName knowsAbout land landAt landResult language laserTarget lbAdd lbClear lbColor lbCurSel lbData lbDelete lbIsSelected lbPicture lbSelection lbSetColor lbSetCurSel lbSetData lbSetPicture lbSetPictureColor lbSetPictureColorDisabled lbSetPictureColorSelected lbSetSelectColor lbSetSelectColorRight lbSetSelected lbSetTooltip lbSetValue lbSize lbSort lbSortByValue lbText lbValue leader leaderboardDeInit leaderboardGetRows leaderboardInit leaveVehicle libraryCredits libraryDisclaimers lifeState lightAttachObject lightDetachObject lightIsOn lightnings limitSpeed linearConversion lineBreak lineIntersects lineIntersectsObjs lineIntersectsSurfaces lineIntersectsWith linkItem list listObjects ln lnbAddArray lnbAddColumn lnbAddRow lnbClear lnbColor lnbCurSelRow lnbData lnbDeleteColumn lnbDeleteRow lnbGetColumnsPosition lnbPicture lnbSetColor lnbSetColumnsPos lnbSetCurSelRow lnbSetData lnbSetPicture lnbSetText lnbSetValue lnbSize lnbText lnbValue load loadAbs loadBackpack loadFile loadGame loadIdentity loadMagazine loadOverlay loadStatus loadUniform loadVest local localize locationNull locationPosition lock lockCameraTo lockCargo lockDriver locked lockedCargo lockedDriver lockedTurret lockIdentity lockTurret lockWP log logEntities logNetwork logNetworkTerminate lookAt lookAtPos magazineCargo magazines magazinesAllTurrets magazinesAmmo magazinesAmmoCargo magazinesAmmoFull magazinesDetail magazinesDetailBackpack magazinesDetailUniform magazinesDetailVest magazinesTurret magazineTurretAmmo mapAnimAdd mapAnimClear mapAnimCommit mapAnimDone mapCenterOnCamera mapGridPosition markAsFinishedOnSteam markerAlpha markerBrush markerColor markerDir markerPos markerShape markerSize markerText markerType max members menuAction menuAdd menuChecked menuClear menuCollapse menuData menuDelete menuEnable menuEnabled menuExpand menuHover menuPicture menuSetAction menuSetCheck menuSetData menuSetPicture menuSetValue menuShortcut menuShortcutText menuSize menuSort menuText menuURL menuValue min mineActive mineDetectedBy missionConfigFile missionDifficulty missionName missionNamespace missionStart missionVersion mod modelToWorld modelToWorldVisual modParams moonIntensity moonPhase morale move move3DENCamera moveInAny moveInCargo moveInCommander moveInDriver moveInGunner moveInTurret moveObjectToEnd moveOut moveTime moveTo moveToCompleted moveToFailed musicVolume name nameSound nearEntities nearestBuilding nearestLocation nearestLocations nearestLocationWithDubbing nearestObject nearestObjects nearestTerrainObjects nearObjects nearObjectsReady nearRoads nearSupplies nearTargets needReload netId netObjNull newOverlay nextMenuItemIndex nextWeatherChange nMenuItems not numberToDate objectCurators objectFromNetId objectParent objNull objStatus onBriefingGroup onBriefingNotes onBriefingPlan onBriefingTeamSwitch onCommandModeChanged onDoubleClick onEachFrame onGroupIconClick onGroupIconOverEnter onGroupIconOverLeave onHCGroupSelectionChanged onMapSingleClick onPlayerConnected onPlayerDisconnected onPreloadFinished onPreloadStarted onShowNewObject onTeamSwitch openCuratorInterface openDLCPage openMap openYoutubeVideo opfor or orderGetIn overcast overcastForecast owner param params parseNumber parseText parsingNamespace particlesQuality pi pickWeaponPool pitch pixelGrid pixelGridBase pixelGridNoUIScale pixelH pixelW playableSlotsNumber playableUnits playAction playActionNow player playerRespawnTime playerSide playersNumber playGesture playMission playMove playMoveNow playMusic playScriptedMission playSound playSound3D position positionCameraToWorld posScreenToWorld posWorldToScreen ppEffectAdjust ppEffectCommit ppEffectCommitted ppEffectCreate ppEffectDestroy ppEffectEnable ppEffectEnabled ppEffectForceInNVG precision preloadCamera preloadObject preloadSound preloadTitleObj preloadTitleRsc preprocessFile preprocessFileLineNumbers primaryWeapon primaryWeaponItems primaryWeaponMagazine priority private processDiaryLink productVersion profileName profileNamespace profileNameSteam progressLoadingScreen progressPosition progressSetPosition publicVariable publicVariableClient publicVariableServer pushBack pushBackUnique putWeaponPool queryItemsPool queryMagazinePool queryWeaponPool rad radioChannelAdd radioChannelCreate radioChannelRemove radioChannelSetCallSign radioChannelSetLabel radioVolume rain rainbow random rank rankId rating rectangular registeredTasks registerTask reload reloadEnabled remoteControl remoteExec remoteExecCall remove3DENConnection remove3DENEventHandler remove3DENLayer removeAction removeAll3DENEventHandlers removeAllActions removeAllAssignedItems removeAllContainers removeAllCuratorAddons removeAllCuratorCameraAreas removeAllCuratorEditingAreas removeAllEventHandlers removeAllHandgunItems removeAllItems removeAllItemsWithMagazines removeAllMissionEventHandlers removeAllMPEventHandlers removeAllMusicEventHandlers removeAllOwnedMines removeAllPrimaryWeaponItems removeAllWeapons removeBackpack removeBackpackGlobal removeCuratorAddons removeCuratorCameraArea removeCuratorEditableObjects removeCuratorEditingArea removeDrawIcon removeDrawLinks removeEventHandler removeFromRemainsCollector removeGoggles removeGroupIcon removeHandgunItem removeHeadgear removeItem removeItemFromBackpack removeItemFromUniform removeItemFromVest removeItems removeMagazine removeMagazineGlobal removeMagazines removeMagazinesTurret removeMagazineTurret removeMenuItem removeMissionEventHandler removeMPEventHandler removeMusicEventHandler removeOwnedMine removePrimaryWeaponItem removeSecondaryWeaponItem removeSimpleTask removeSwitchableUnit removeTeamMember removeUniform removeVest removeWeapon removeWeaponGlobal removeWeaponTurret requiredVersion resetCamShake resetSubgroupDirection resistance resize resources respawnVehicle restartEditorCamera reveal revealMine reverse reversedMouseY roadAt roadsConnectedTo roleDescription ropeAttachedObjects ropeAttachedTo ropeAttachEnabled ropeAttachTo ropeCreate ropeCut ropeDestroy ropeDetach ropeEndPosition ropeLength ropes ropeUnwind ropeUnwound rotorsForcesRTD rotorsRpmRTD round runInitScript safeZoneH safeZoneW safeZoneWAbs safeZoneX safeZoneXAbs safeZoneY save3DENInventory saveGame saveIdentity saveJoysticks saveOverlay saveProfileNamespace saveStatus saveVar savingEnabled say say2D say3D scopeName score scoreSide screenshot screenToWorld scriptDone scriptName scriptNull scudState secondaryWeapon secondaryWeaponItems secondaryWeaponMagazine select selectBestPlaces selectDiarySubject selectedEditorObjects selectEditorObject selectionNames selectionPosition selectLeader selectMax selectMin selectNoPlayer selectPlayer selectRandom selectWeapon selectWeaponTurret sendAUMessage sendSimpleCommand sendTask sendTaskResult sendUDPMessage serverCommand serverCommandAvailable serverCommandExecutable serverName serverTime set set3DENAttribute set3DENAttributes set3DENGrid set3DENIconsVisible set3DENLayer set3DENLinesVisible set3DENMissionAttributes set3DENModelsVisible set3DENObjectType set3DENSelected setAccTime setAirportSide setAmmo setAmmoCargo setAnimSpeedCoef setAperture setApertureNew setArmoryPoints setAttributes setAutonomous setBehaviour setBleedingRemaining setCameraInterest setCamShakeDefParams setCamShakeParams setCamUseTi setCaptive setCenterOfMass setCollisionLight setCombatMode setCompassOscillation setCuratorCameraAreaCeiling setCuratorCoef setCuratorEditingAreaType setCuratorWaypointCost setCurrentChannel setCurrentTask setCurrentWaypoint setCustomAimCoef setDamage setDammage setDate setDebriefingText setDefaultCamera setDestination setDetailMapBlendPars setDir setDirection setDrawIcon setDropInterval setEditorMode setEditorObjectScope setEffectCondition setFace setFaceAnimation setFatigue setFlagOwner setFlagSide setFlagTexture setFog setFormation setFormationTask setFormDir setFriend setFromEditor setFSMVariable setFuel setFuelCargo setGroupIcon setGroupIconParams setGroupIconsSelectable setGroupIconsVisible setGroupId setGroupIdGlobal setGroupOwner setGusts setHideBehind setHit setHitIndex setHitPointDamage setHorizonParallaxCoef setHUDMovementLevels setIdentity setImportance setLeader setLightAmbient setLightAttenuation setLightBrightness setLightColor setLightDayLight setLightFlareMaxDistance setLightFlareSize setLightIntensity setLightnings setLightUseFlare setLocalWindParams setMagazineTurretAmmo setMarkerAlpha setMarkerAlphaLocal setMarkerBrush setMarkerBrushLocal setMarkerColor setMarkerColorLocal setMarkerDir setMarkerDirLocal setMarkerPos setMarkerPosLocal setMarkerShape setMarkerShapeLocal setMarkerSize setMarkerSizeLocal setMarkerText setMarkerTextLocal setMarkerType setMarkerTypeLocal setMass setMimic setMousePosition setMusicEffect setMusicEventHandler setName setNameSound setObjectArguments setObjectMaterial setObjectMaterialGlobal setObjectProxy setObjectTexture setObjectTextureGlobal setObjectViewDistance setOvercast setOwner setOxygenRemaining setParticleCircle setParticleClass setParticleFire setParticleParams setParticleRandom setPilotCameraDirection setPilotCameraRotation setPilotCameraTarget setPilotLight setPiPEffect setPitch setPlayable setPlayerRespawnTime setPos setPosASL setPosASL2 setPosASLW setPosATL setPosition setPosWorld setRadioMsg setRain setRainbow setRandomLip setRank setRectangular setRepairCargo setShadowDistance setShotParents setSide setSimpleTaskAlwaysVisible setSimpleTaskCustomData setSimpleTaskDescription setSimpleTaskDestination setSimpleTaskTarget setSimpleTaskType setSimulWeatherLayers setSize setSkill setSlingLoad setSoundEffect setSpeaker setSpeech setSpeedMode setStamina setStaminaScheme setStatValue setSuppression setSystemOfUnits setTargetAge setTaskResult setTaskState setTerrainGrid setText setTimeMultiplier setTitleEffect setTriggerActivation setTriggerArea setTriggerStatements setTriggerText setTriggerTimeout setTriggerType setType setUnconscious setUnitAbility setUnitLoadout setUnitPos setUnitPosWeak setUnitRank setUnitRecoilCoefficient setUnitTrait setUnloadInCombat setUserActionText setVariable setVectorDir setVectorDirAndUp setVectorUp setVehicleAmmo setVehicleAmmoDef setVehicleArmor setVehicleCargo setVehicleId setVehicleLock setVehiclePosition setVehicleTiPars setVehicleVarName setVelocity setVelocityTransformation setViewDistance setVisibleIfTreeCollapsed setWaves setWaypointBehaviour setWaypointCombatMode setWaypointCompletionRadius setWaypointDescription setWaypointForceBehaviour setWaypointFormation setWaypointHousePosition setWaypointLoiterRadius setWaypointLoiterType setWaypointName setWaypointPosition setWaypointScript setWaypointSpeed setWaypointStatements setWaypointTimeout setWaypointType setWaypointVisible setWeaponReloadingTime setWind setWindDir setWindForce setWindStr setWPPos show3DIcons showChat showCinemaBorder showCommandingMenu showCompass showCuratorCompass showGPS showHUD showLegend showMap shownArtilleryComputer shownChat shownCompass shownCuratorCompass showNewEditorObject shownGPS shownHUD shownMap shownPad shownRadio shownScoretable shownUAVFeed shownWarrant shownWatch showPad showRadio showScoretable showSubtitles showUAVFeed showWarrant showWatch showWaypoint showWaypoints side sideAmbientLife sideChat sideEmpty sideEnemy sideFriendly sideLogic sideRadio sideUnknown simpleTasks simulationEnabled simulCloudDensity simulCloudOcclusion simulInClouds simulWeatherSync sin size sizeOf skill skillFinal skipTime sleep sliderPosition sliderRange sliderSetPosition sliderSetRange sliderSetSpeed sliderSpeed slingLoadAssistantShown soldierMagazines someAmmo sort soundVolume spawn speaker speed speedMode splitString sqrt squadParams stance startLoadingScreen step stop stopEngineRTD stopped str sunOrMoon supportInfo suppressFor surfaceIsWater surfaceNormal surfaceType swimInDepth switchableUnits switchAction switchCamera switchGesture switchLight switchMove synchronizedObjects synchronizedTriggers synchronizedWaypoints synchronizeObjectsAdd synchronizeObjectsRemove synchronizeTrigger synchronizeWaypoint systemChat systemOfUnits tan targetKnowledge targetsAggregate targetsQuery taskAlwaysVisible taskChildren taskCompleted taskCustomData taskDescription taskDestination taskHint taskMarkerOffset taskNull taskParent taskResult taskState taskType teamMember teamMemberNull teamName teams teamSwitch teamSwitchEnabled teamType terminate terrainIntersect terrainIntersectASL text textLog textLogFormat tg time timeMultiplier titleCut titleFadeOut titleObj titleRsc titleText toArray toFixed toLower toString toUpper triggerActivated triggerActivation triggerArea triggerAttachedVehicle triggerAttachObject triggerAttachVehicle triggerStatements triggerText triggerTimeout triggerTimeoutCurrent triggerType turretLocal turretOwner turretUnit tvAdd tvClear tvCollapse tvCount tvCurSel tvData tvDelete tvExpand tvPicture tvSetCurSel tvSetData tvSetPicture tvSetPictureColor tvSetPictureColorDisabled tvSetPictureColorSelected tvSetPictureRight tvSetPictureRightColor tvSetPictureRightColorDisabled tvSetPictureRightColorSelected tvSetText tvSetTooltip tvSetValue tvSort tvSortByValue tvText tvTooltip tvValue type typeName typeOf UAVControl uiNamespace uiSleep unassignCurator unassignItem unassignTeam unassignVehicle underwater uniform uniformContainer uniformItems uniformMagazines unitAddons unitAimPosition unitAimPositionVisual unitBackpack unitIsUAV unitPos unitReady unitRecoilCoefficient units unitsBelowHeight unlinkItem unlockAchievement unregisterTask updateDrawIcon updateMenuItem updateObjectTree useAISteeringComponent useAudioTimeForMoves vectorAdd vectorCos vectorCrossProduct vectorDiff vectorDir vectorDirVisual vectorDistance vectorDistanceSqr vectorDotProduct vectorFromTo vectorMagnitude vectorMagnitudeSqr vectorMultiply vectorNormalized vectorUp vectorUpVisual vehicle vehicleCargoEnabled vehicleChat vehicleRadio vehicles vehicleVarName velocity velocityModelSpace verifySignature vest vestContainer vestItems vestMagazines viewDistance visibleCompass visibleGPS visibleMap visiblePosition visiblePositionASL visibleScoretable visibleWatch waves waypointAttachedObject waypointAttachedVehicle waypointAttachObject waypointAttachVehicle waypointBehaviour waypointCombatMode waypointCompletionRadius waypointDescription waypointForceBehaviour waypointFormation waypointHousePosition waypointLoiterRadius waypointLoiterType waypointName waypointPosition waypoints waypointScript waypointsEnabledUAV waypointShow waypointSpeed waypointStatements waypointTimeout waypointTimeoutCurrent waypointType waypointVisible weaponAccessories weaponAccessoriesCargo weaponCargo weaponDirection weaponInertia weaponLowered weapons weaponsItems weaponsItemsCargo weaponState weaponsTurret weightRTD west WFSideText wind",literal:"true false nil"},c:[e.CLCM,e.CBCM,e.NM,a,o,r,t.preprocessor],i:/#/}});hljs.registerLanguage("dsconfig",function(e){var i={cN:"string",b:/"/,e:/"/},r={cN:"string",b:/'/,e:/'/},s={cN:"string",b:"[\\w-?]+:\\w+",e:"\\W",r:0},t={cN:"string",b:"\\w+-?\\w+",e:"\\W",r:0};return{k:"dsconfig",c:[{cN:"keyword",b:"^dsconfig",e:"\\s",eE:!0,r:10},{cN:"built_in",b:"(list|create|get|set|delete)-(\\w+)",e:"\\s",eE:!0,i:"!@#$%^&*()",r:10},{cN:"built_in",b:"--(\\w+)",e:"\\s",eE:!0},i,r,s,t,e.HCM]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("erb",function(e){return{sL:"xml",c:[e.C("<%#","%>"),{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0}]}});hljs.registerLanguage("gauss",function(e){var t={keyword:"and bool break call callexe checkinterrupt clear clearg closeall cls comlog compile continue create debug declare delete disable dlibrary dllcall do dos ed edit else elseif enable end endfor endif endp endo errorlog errorlogat expr external fn for format goto gosub graph if keyword let lib library line load loadarray loadexe loadf loadk loadm loadp loads loadx local locate loopnextindex lprint lpwidth lshow matrix msym ndpclex new not open or output outwidth plot plotsym pop prcsn print printdos proc push retp return rndcon rndmod rndmult rndseed run save saveall screen scroll setarray show sparse stop string struct system trace trap threadfor threadendfor threadbegin threadjoin threadstat threadend until use while winprint",built_in:"abs acf aconcat aeye amax amean AmericanBinomCall AmericanBinomCall_Greeks AmericanBinomCall_ImpVol AmericanBinomPut AmericanBinomPut_Greeks AmericanBinomPut_ImpVol AmericanBSCall AmericanBSCall_Greeks AmericanBSCall_ImpVol AmericanBSPut AmericanBSPut_Greeks AmericanBSPut_ImpVol amin amult annotationGetDefaults annotationSetBkd annotationSetFont annotationSetLineColor annotationSetLineStyle annotationSetLineThickness annualTradingDays arccos arcsin areshape arrayalloc arrayindex arrayinit arraytomat asciiload asclabel astd astds asum atan atan2 atranspose axmargin balance band bandchol bandcholsol bandltsol bandrv bandsolpd bar base10 begwind besselj bessely beta box boxcox cdfBeta cdfBetaInv cdfBinomial cdfBinomialInv cdfBvn cdfBvn2 cdfBvn2e cdfCauchy cdfCauchyInv cdfChic cdfChii cdfChinc cdfChincInv cdfExp cdfExpInv cdfFc cdfFnc cdfFncInv cdfGam cdfGenPareto cdfHyperGeo cdfLaplace cdfLaplaceInv cdfLogistic cdfLogisticInv cdfmControlCreate cdfMvn cdfMvn2e cdfMvnce cdfMvne cdfMvt2e cdfMvtce cdfMvte cdfN cdfN2 cdfNc cdfNegBinomial cdfNegBinomialInv cdfNi cdfPoisson cdfPoissonInv cdfRayleigh cdfRayleighInv cdfTc cdfTci cdfTnc cdfTvn cdfWeibull cdfWeibullInv cdir ceil ChangeDir chdir chiBarSquare chol choldn cholsol cholup chrs close code cols colsf combinate combinated complex con cond conj cons ConScore contour conv convertsatostr convertstrtosa corrm corrms corrvc corrx corrxs cos cosh counts countwts crossprd crout croutp csrcol csrlin csvReadM csvReadSA cumprodc cumsumc curve cvtos datacreate datacreatecomplex datalist dataload dataloop dataopen datasave date datestr datestring datestrymd dayinyr dayofweek dbAddDatabase dbClose dbCommit dbCreateQuery dbExecQuery dbGetConnectOptions dbGetDatabaseName dbGetDriverName dbGetDrivers dbGetHostName dbGetLastErrorNum dbGetLastErrorText dbGetNumericalPrecPolicy dbGetPassword dbGetPort dbGetTableHeaders dbGetTables dbGetUserName dbHasFeature dbIsDriverAvailable dbIsOpen dbIsOpenError dbOpen dbQueryBindValue dbQueryClear dbQueryCols dbQueryExecPrepared dbQueryFetchAllM dbQueryFetchAllSA dbQueryFetchOneM dbQueryFetchOneSA dbQueryFinish dbQueryGetBoundValue dbQueryGetBoundValues dbQueryGetField dbQueryGetLastErrorNum dbQueryGetLastErrorText dbQueryGetLastInsertID dbQueryGetLastQuery dbQueryGetPosition dbQueryIsActive dbQueryIsForwardOnly dbQueryIsNull dbQueryIsSelect dbQueryIsValid dbQueryPrepare dbQueryRows dbQuerySeek dbQuerySeekFirst dbQuerySeekLast dbQuerySeekNext dbQuerySeekPrevious dbQuerySetForwardOnly dbRemoveDatabase dbRollback dbSetConnectOptions dbSetDatabaseName dbSetHostName dbSetNumericalPrecPolicy dbSetPort dbSetUserName dbTransaction DeleteFile delif delrows denseToSp denseToSpRE denToZero design det detl dfft dffti diag diagrv digamma doswin DOSWinCloseall DOSWinOpen dotfeq dotfeqmt dotfge dotfgemt dotfgt dotfgtmt dotfle dotflemt dotflt dotfltmt dotfne dotfnemt draw drop dsCreate dstat dstatmt dstatmtControlCreate dtdate dtday dttime dttodtv dttostr dttoutc dtvnormal dtvtodt dtvtoutc dummy dummybr dummydn eig eigh eighv eigv elapsedTradingDays endwind envget eof eqSolve eqSolvemt eqSolvemtControlCreate eqSolvemtOutCreate eqSolveset erf erfc erfccplx erfcplx error etdays ethsec etstr EuropeanBinomCall EuropeanBinomCall_Greeks EuropeanBinomCall_ImpVol EuropeanBinomPut EuropeanBinomPut_Greeks EuropeanBinomPut_ImpVol EuropeanBSCall EuropeanBSCall_Greeks EuropeanBSCall_ImpVol EuropeanBSPut EuropeanBSPut_Greeks EuropeanBSPut_ImpVol exctsmpl exec execbg exp extern eye fcheckerr fclearerr feq feqmt fflush fft ffti fftm fftmi fftn fge fgemt fgets fgetsa fgetsat fgetst fgt fgtmt fileinfo filesa fle flemt floor flt fltmt fmod fne fnemt fonts fopen formatcv formatnv fputs fputst fseek fstrerror ftell ftocv ftos ftostrC gamma gammacplx gammaii gausset gdaAppend gdaCreate gdaDStat gdaDStatMat gdaGetIndex gdaGetName gdaGetNames gdaGetOrders gdaGetType gdaGetTypes gdaGetVarInfo gdaIsCplx gdaLoad gdaPack gdaRead gdaReadByIndex gdaReadSome gdaReadSparse gdaReadStruct gdaReportVarInfo gdaSave gdaUpdate gdaUpdateAndPack gdaVars gdaWrite gdaWrite32 gdaWriteSome getarray getdims getf getGAUSShome getmatrix getmatrix4D getname getnamef getNextTradingDay getNextWeekDay getnr getorders getpath getPreviousTradingDay getPreviousWeekDay getRow getscalar3D getscalar4D getTrRow getwind glm gradcplx gradMT gradMTm gradMTT gradMTTm gradp graphprt graphset hasimag header headermt hess hessMT hessMTg hessMTgw hessMTm hessMTmw hessMTT hessMTTg hessMTTgw hessMTTm hessMTw hessp hist histf histp hsec imag indcv indexcat indices indices2 indicesf indicesfn indnv indsav integrate1d integrateControlCreate intgrat2 intgrat3 inthp1 inthp2 inthp3 inthp4 inthpControlCreate intquad1 intquad2 intquad3 intrleav intrleavsa intrsect intsimp inv invpd invswp iscplx iscplxf isden isinfnanmiss ismiss key keyav keyw lag lag1 lagn lapEighb lapEighi lapEighvb lapEighvi lapgEig lapgEigh lapgEighv lapgEigv lapgSchur lapgSvdcst lapgSvds lapgSvdst lapSvdcusv lapSvds lapSvdusv ldlp ldlsol linSolve listwise ln lncdfbvn lncdfbvn2 lncdfmvn lncdfn lncdfn2 lncdfnc lnfact lngammacplx lnpdfmvn lnpdfmvt lnpdfn lnpdft loadd loadstruct loadwind loess loessmt loessmtControlCreate log loglog logx logy lower lowmat lowmat1 ltrisol lu lusol machEpsilon make makevars makewind margin matalloc matinit mattoarray maxbytes maxc maxindc maxv maxvec mbesselei mbesselei0 mbesselei1 mbesseli mbesseli0 mbesseli1 meanc median mergeby mergevar minc minindc minv miss missex missrv moment momentd movingave movingaveExpwgt movingaveWgt nextindex nextn nextnevn nextwind ntos null null1 numCombinations ols olsmt olsmtControlCreate olsqr olsqr2 olsqrmt ones optn optnevn orth outtyp pacf packedToSp packr parse pause pdfCauchy pdfChi pdfExp pdfGenPareto pdfHyperGeo pdfLaplace pdfLogistic pdfn pdfPoisson pdfRayleigh pdfWeibull pi pinv pinvmt plotAddArrow plotAddBar plotAddBox plotAddHist plotAddHistF plotAddHistP plotAddPolar plotAddScatter plotAddShape plotAddTextbox plotAddTS plotAddXY plotArea plotBar plotBox plotClearLayout plotContour plotCustomLayout plotGetDefaults plotHist plotHistF plotHistP plotLayout plotLogLog plotLogX plotLogY plotOpenWindow plotPolar plotSave plotScatter plotSetAxesPen plotSetBar plotSetBarFill plotSetBarStacked plotSetBkdColor plotSetFill plotSetGrid plotSetLegend plotSetLineColor plotSetLineStyle plotSetLineSymbol plotSetLineThickness plotSetNewWindow plotSetTitle plotSetWhichYAxis plotSetXAxisShow plotSetXLabel plotSetXRange plotSetXTicInterval plotSetXTicLabel plotSetYAxisShow plotSetYLabel plotSetYRange plotSetZAxisShow plotSetZLabel plotSurface plotTS plotXY polar polychar polyeval polygamma polyint polymake polymat polymroot polymult polyroot pqgwin previousindex princomp printfm printfmt prodc psi putarray putf putvals pvCreate pvGetIndex pvGetParNames pvGetParVector pvLength pvList pvPack pvPacki pvPackm pvPackmi pvPacks pvPacksi pvPacksm pvPacksmi pvPutParVector pvTest pvUnpack QNewton QNewtonmt QNewtonmtControlCreate QNewtonmtOutCreate QNewtonSet QProg QProgmt QProgmtInCreate qqr qqre qqrep qr qre qrep qrsol qrtsol qtyr qtyre qtyrep quantile quantiled qyr qyre qyrep qz rank rankindx readr real reclassify reclassifyCuts recode recserar recsercp recserrc rerun rescale reshape rets rev rfft rffti rfftip rfftn rfftnp rfftp rndBernoulli rndBeta rndBinomial rndCauchy rndChiSquare rndCon rndCreateState rndExp rndGamma rndGeo rndGumbel rndHyperGeo rndi rndKMbeta rndKMgam rndKMi rndKMn rndKMnb rndKMp rndKMu rndKMvm rndLaplace rndLCbeta rndLCgam rndLCi rndLCn rndLCnb rndLCp rndLCu rndLCvm rndLogNorm rndMTu rndMVn rndMVt rndn rndnb rndNegBinomial rndp rndPoisson rndRayleigh rndStateSkip rndu rndvm rndWeibull rndWishart rotater round rows rowsf rref sampleData satostrC saved saveStruct savewind scale scale3d scalerr scalinfnanmiss scalmiss schtoc schur searchsourcepath seekr select selif seqa seqm setdif setdifsa setvars setvwrmode setwind shell shiftr sin singleindex sinh sleep solpd sortc sortcc sortd sorthc sorthcc sortind sortindc sortmc sortr sortrc spBiconjGradSol spChol spConjGradSol spCreate spDenseSubmat spDiagRvMat spEigv spEye spLDL spline spLU spNumNZE spOnes spreadSheetReadM spreadSheetReadSA spreadSheetWrite spScale spSubmat spToDense spTrTDense spTScalar spZeros sqpSolve sqpSolveMT sqpSolveMTControlCreate sqpSolveMTlagrangeCreate sqpSolveMToutCreate sqpSolveSet sqrt statements stdc stdsc stocv stof strcombine strindx strlen strput strrindx strsect strsplit strsplitPad strtodt strtof strtofcplx strtriml strtrimr strtrunc strtruncl strtruncpad strtruncr submat subscat substute subvec sumc sumr surface svd svd1 svd2 svdcusv svds svdusv sysstate tab tan tanh tempname threadBegin threadEnd threadEndFor threadFor threadJoin threadStat time timedt timestr timeutc title tkf2eps tkf2ps tocart todaydt toeplitz token topolar trapchk trigamma trimr trunc type typecv typef union unionsa uniqindx uniqindxsa unique uniquesa upmat upmat1 upper utctodt utctodtv utrisol vals varCovMS varCovXS varget vargetl varmall varmares varput varputl vartypef vcm vcms vcx vcxs vec vech vecr vector vget view viewxyz vlist vnamecv volume vput vread vtypecv wait waitc walkindex where window writer xlabel xlsGetSheetCount xlsGetSheetSize xlsGetSheetTypes xlsMakeRange xlsReadM xlsReadSA xlsWrite xlsWriteM xlsWriteSA xpnd xtics xy xyz ylabel ytics zeros zeta zlabel ztics cdfEmpirical dot h5create h5open h5read h5readAttribute h5write h5writeAttribute ldl plotAddErrorBar plotAddSurface plotCDFEmpirical plotSetColormap plotSetContourLabels plotSetLegendFont plotSetTextInterpreter plotSetXTicCount plotSetYTicCount plotSetZLevels powerm strjoin strtrim sylvester",literal:"DB_AFTER_LAST_ROW DB_ALL_TABLES DB_BATCH_OPERATIONS DB_BEFORE_FIRST_ROW DB_BLOB DB_EVENT_NOTIFICATIONS DB_FINISH_QUERY DB_HIGH_PRECISION DB_LAST_INSERT_ID DB_LOW_PRECISION_DOUBLE DB_LOW_PRECISION_INT32 DB_LOW_PRECISION_INT64 DB_LOW_PRECISION_NUMBERS DB_MULTIPLE_RESULT_SETS DB_NAMED_PLACEHOLDERS DB_POSITIONAL_PLACEHOLDERS DB_PREPARED_QUERIES DB_QUERY_SIZE DB_SIMPLE_LOCKING DB_SYSTEM_TABLES DB_TABLES DB_TRANSACTIONS DB_UNICODE DB_VIEWS"},a={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"define definecs|10 undef ifdef ifndef iflight ifdllcall ifmac ifos2win ifunix else endif lineson linesoff srcfile srcline"},c:[{b:/\\\n/,r:0},{bK:"include",e:"$",k:{"meta-keyword":"include"},c:[{cN:"meta-string",b:'"',e:'"',i:"\\n"}]},e.CLCM,e.CBCM]},r=e.UIR+"\\s*\\(?",o=[{cN:"params",b:/\(/,e:/\)/,k:t,r:0,c:[e.CNM,e.CLCM,e.CBCM]}];return{aliases:["gss"],cI:!0,k:t,i:"(\\{[%#]|[%#]\\})",c:[e.CNM,e.CLCM,e.CBCM,e.C("@","@"),a,{cN:"string",b:'"',e:'"',c:[e.BE]},{cN:"function",bK:"proc keyword",e:";",eE:!0,k:t,c:[{b:r,rB:!0,c:[e.UTM],r:0},e.CNM,e.CLCM,e.CBCM,a].concat(o)},{cN:"function",bK:"fn",e:";",eE:!0,k:t,c:[{b:r+e.IR+"\\)?\\s*\\=\\s*",rB:!0,c:[e.UTM],r:0},e.CNM,e.CLCM,e.CBCM].concat(o)},{cN:"function",b:"\\bexternal (proc|keyword|fn)\\s+",e:";",eE:!0,k:t,c:[{b:r,rB:!0,c:[e.UTM],r:0},e.CLCM,e.CBCM]},{cN:"function",b:"\\bexternal (matrix|string|array|sparse matrix|struct "+e.IR+")\\s+",e:";",eE:!0,k:t,c:[e.CLCM,e.CBCM]}]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},_={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:_,l:i,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:i,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("handlebars",function(e){var a={"builtin-name":"each in with if else unless bindattr action collection debugger log outlet template unbound view yield"};return{aliases:["hbs","html.hbs","html.handlebars"],cI:!0,sL:"xml",c:[e.C("{{!(--)?","(--)?}}"),{cN:"template-tag",b:/\{\{[#\/]/,e:/\}\}/,c:[{cN:"name",b:/[a-zA-Z\.-]+/,k:a,starts:{eW:!0,r:0,c:[e.QSM]}}]},{cN:"template-variable",b:/\{\{/,e:/\}\}/,k:a}]}});hljs.registerLanguage("mercury",function(e){var i={keyword:"module use_module import_module include_module end_module initialise mutable initialize finalize finalise interface implementation pred mode func type inst solver any_pred any_func is semidet det nondet multi erroneous failure cc_nondet cc_multi typeclass instance where pragma promise external trace atomic or_else require_complete_switch require_det require_semidet require_multi require_nondet require_cc_multi require_cc_nondet require_erroneous require_failure",meta:"inline no_inline type_spec source_file fact_table obsolete memo loop_check minimal_model terminates does_not_terminate check_termination promise_equivalent_clauses foreign_proc foreign_decl foreign_code foreign_type foreign_import_module foreign_export_enum foreign_export foreign_enum may_call_mercury will_not_call_mercury thread_safe not_thread_safe maybe_thread_safe promise_pure promise_semipure tabled_for_io local untrailed trailed attach_to_io_state can_pass_as_mercury_type stable will_not_throw_exception may_modify_trail will_not_modify_trail may_duplicate may_not_duplicate affects_liveness does_not_affect_liveness doesnt_affect_liveness no_sharing unknown_sharing sharing",built_in:"some all not if then else true fail false try catch catch_any semidet_true semidet_false semidet_fail impure_true impure semipure"},r=e.C("%","$"),t={cN:"number",b:"0'.\\|0[box][0-9a-fA-F]*"},_=e.inherit(e.ASM,{r:0}),n=e.inherit(e.QSM,{r:0}),a={cN:"subst",b:"\\\\[abfnrtv]\\|\\\\x[0-9a-fA-F]*\\\\\\|%[-+# *.0-9]*[dioxXucsfeEgGp]",r:0};n.c.push(a);var o={cN:"built_in",v:[{b:"<=>"},{b:"<=",r:0},{b:"=>",r:0},{b:"/\\\\"},{b:"\\\\/"}]},l={cN:"built_in",v:[{b:":-\\|-->"},{b:"=",r:0}]};return{aliases:["m","moo"],k:i,c:[o,l,r,e.CBCM,t,e.NM,_,n,{b:/:-/}]}});hljs.registerLanguage("dns",function(d){return{aliases:["bind","zone"],k:{keyword:"IN A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME DHCID DLV DNAME DNSKEY DS HIP IPSECKEY KEY KX LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM PTR RRSIG RP SIG SOA SRV SSHFP TA TKEY TLSA TSIG TXT"},c:[d.C(";","$",{r:0}),{cN:"meta",b:/^\$(TTL|GENERATE|INCLUDE|ORIGIN)\b/},{cN:"number",b:"((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))\\b"},{cN:"number",b:"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\b"},d.inherit(d.NM,{b:/\b\d+[dhwm]?/})]}});hljs.registerLanguage("pony",function(e){var r={keyword:"actor addressof and as be break class compile_error compile_intrinsicconsume continue delegate digestof do else elseif embed end errorfor fun if ifdef in interface is isnt lambda let match new not objector primitive recover repeat return struct then trait try type until use var where while with xor",meta:"iso val tag trn box ref",literal:"this false true"},t={cN:"string",b:'"""',e:'"""',r:10},c={cN:"string",b:'"',e:'"',c:[e.BE]},i={cN:"string",b:"'",e:"'",c:[e.BE],r:0},n={cN:"type",b:"\\b_?[A-Z][\\w]*",r:0},s={b:e.IR+"'",r:0},a={cN:"class",bK:"class actor",e:"$",c:[e.TM,e.CLCM]},o={cN:"function",bK:"new fun",e:"=>",c:[e.TM,{b:/\(/,e:/\)/,c:[n,s,e.CNM,e.CBCM]},{b:/:/,eW:!0,c:[n]},e.CLCM]};return{k:r,c:[a,o,n,t,c,i,s,e.CNM,e.CLCM,e.CBCM]}});hljs.registerLanguage("leaf",function(e){return{c:[{cN:"function",b:"#+[A-Za-z_0-9]*\\(",e:" {",rB:!0,eE:!0,c:[{cN:"keyword",b:"#+"},{cN:"title",b:"[A-Za-z_][A-Za-z_0-9]*"},{cN:"params",b:"\\(",e:"\\)",endsParent:!0,c:[{cN:"string",b:'"',e:'"'},{cN:"variable",b:"[A-Za-z_][A-Za-z_0-9]*"}]}]}]}});hljs.registerLanguage("dust",function(e){var t="if eq ne lt lte gt gte select default math sep";return{aliases:["dst"],cI:!0,sL:"xml",c:[{cN:"template-tag",b:/\{[#\/]/,e:/\}/,i:/;/,c:[{cN:"name",b:/[a-zA-Z\.-]+/,starts:{eW:!0,r:0,c:[e.QSM]}}]},{cN:"template-variable",b:/\{/,e:/\}/,i:/;/,k:t}]}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",r:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("delphi",function(e){var r="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure absolute reintroduce operator as is abstract alias assembler bitpacked break continue cppdecl cvar enumerator experimental platform deprecated unimplemented dynamic export far16 forward generic helper implements interrupt iochecks local name nodefault noreturn nostackframe oldfpccall otherwise saveregisters softfloat specialize strict unaligned varargs ",t=[e.CLCM,e.C(/\{/,/\}/,{r:0}),e.C(/\(\*/,/\*\)/,{r:10})],a={cN:"meta",v:[{b:/\{\$/,e:/\}/},{b:/\(\*\$/,e:/\*\)/}]},c={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]},i={cN:"string",b:/(#\d+)+/},o={b:e.IR+"\\s*=\\s*class\\s*\\(",rB:!0,c:[e.TM]},n={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:r,c:[c,i,a].concat(t)},a].concat(t)};return{aliases:["dpr","dfm","pas","pascal","freepascal","lazarus","lpr","lfm"],cI:!0,k:r,i:/"|\$[G-Zg-z]|\/\*|<\/|\|/,c:[c,i,e.NM,o,n,a].concat(t)}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("dart",function(e){var t={cN:"subst",b:"\\$\\{",e:"}",k:"true false null this is new super"},r={cN:"string",v:[{b:"r'''",e:"'''"},{b:'r"""',e:'"""'},{b:"r'",e:"'",i:"\\n"},{b:'r"',e:'"',i:"\\n"},{b:"'''",e:"'''",c:[e.BE,t]},{b:'"""',e:'"""',c:[e.BE,t]},{b:"'",e:"'",i:"\\n",c:[e.BE,t]},{b:'"',e:'"',i:"\\n",c:[e.BE,t]}]};t.c=[e.CNM,r];var n={keyword:"assert async await break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch sync this throw true try var void while with yield abstract as dynamic export external factory get implements import library operator part set static typedef",built_in:"print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num document window querySelector querySelectorAll Element ElementList"};return{k:n,c:[r,e.C("/\\*\\*","\\*/",{sL:"markdown"}),e.C("///","$",{sL:"markdown"}),e.CLCM,e.CBCM,{cN:"class",bK:"class interface",e:"{",eE:!0,c:[{bK:"extends implements"},e.UTM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"},{b:"=>"}]}});hljs.registerLanguage("step21",function(e){var i="[A-Z_][A-Z0-9_.]*",r={keyword:"HEADER ENDSEC DATA"},t={cN:"meta",b:"ISO-10303-21;",r:10},n={cN:"meta",b:"END-ISO-10303-21;",r:10};return{aliases:["p21","step","stp"],cI:!0,l:i,k:r,c:[t,n,e.CLCM,e.CBCM,e.C("/\\*\\*!","\\*/"),e.CNM,e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null}),{cN:"string",b:"'",e:"'"},{cN:"symbol",v:[{b:"#",e:"\\d+",i:"\\W"}]}]}});hljs.registerLanguage("cos",function(e){var t={cN:"string",v:[{b:'"',e:'"',c:[{b:'""',r:0}]}]},r={cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)",r:0},s="property parameter class classmethod clientmethod extends as break catch close continue do d|0 else elseif for goto halt hang h|0 if job j|0 kill k|0 lock l|0 merge new open quit q|0 read r|0 return set s|0 tcommit throw trollback try tstart use view while write w|0 xecute x|0 zkill znspace zn ztrap zwrite zw zzdump zzwrite print zbreak zinsert zload zprint zremove zsave zzprint mv mvcall mvcrt mvdim mvprint zquit zsync ascii";return{cI:!0,aliases:["cos","cls"],k:s,c:[r,t,e.CLCM,e.CBCM,{cN:"comment",b:/;/,e:"$",r:0},{cN:"built_in",b:/(?:\$\$?|\.\.)\^?[a-zA-Z]+/},{cN:"built_in",b:/\$\$\$[a-zA-Z]+/},{cN:"built_in",b:/%[a-z]+(?:\.[a-z]+)*/},{cN:"symbol",b:/\^%?[a-zA-Z][\w]*/},{cN:"keyword",b:/##class|##super|#define|#dim/},{b:/&sql\(/,e:/\)/,eB:!0,eE:!0,sL:"sql"},{b:/&(js|jscript|javascript)/,eB:!0,eE:!0,sL:"javascript"},{b:/&html<\s*\s*>/,sL:"xml"}]}});hljs.registerLanguage("maxima",function(e){var t="if then else elseif for thru do while unless step in and or not",a="true false unknown inf minf ind und %e %i %pi %phi %gamma",r=" abasep abs absint absolute_real_time acos acosh acot acoth acsc acsch activate addcol add_edge add_edges addmatrices addrow add_vertex add_vertices adjacency_matrix adjoin adjoint af agd airy airy_ai airy_bi airy_dai airy_dbi algsys alg_type alias allroots alphacharp alphanumericp amortization %and annuity_fv annuity_pv antid antidiff AntiDifference append appendfile apply apply1 apply2 applyb1 apropos args arit_amortization arithmetic arithsum array arrayapply arrayinfo arraymake arraysetapply ascii asec asech asin asinh askinteger asksign assoc assoc_legendre_p assoc_legendre_q assume assume_external_byte_order asympa at atan atan2 atanh atensimp atom atvalue augcoefmatrix augmented_lagrangian_method av average_degree backtrace bars barsplot barsplot_description base64 base64_decode bashindices batch batchload bc2 bdvac belln benefit_cost bern bernpoly bernstein_approx bernstein_expand bernstein_poly bessel bessel_i bessel_j bessel_k bessel_simplify bessel_y beta beta_incomplete beta_incomplete_generalized beta_incomplete_regularized bezout bfallroots bffac bf_find_root bf_fmin_cobyla bfhzeta bfloat bfloatp bfpsi bfpsi0 bfzeta biconnected_components bimetric binomial bipartition block blockmatrixp bode_gain bode_phase bothcoef box boxplot boxplot_description break bug_report build_info|10 buildq build_sample burn cabs canform canten cardinality carg cartan cartesian_product catch cauchy_matrix cbffac cdf_bernoulli cdf_beta cdf_binomial cdf_cauchy cdf_chi2 cdf_continuous_uniform cdf_discrete_uniform cdf_exp cdf_f cdf_gamma cdf_general_finite_discrete cdf_geometric cdf_gumbel cdf_hypergeometric cdf_laplace cdf_logistic cdf_lognormal cdf_negative_binomial cdf_noncentral_chi2 cdf_noncentral_student_t cdf_normal cdf_pareto cdf_poisson cdf_rank_sum cdf_rayleigh cdf_signed_rank cdf_student_t cdf_weibull cdisplay ceiling central_moment cequal cequalignore cf cfdisrep cfexpand cgeodesic cgreaterp cgreaterpignore changename changevar chaosgame charat charfun charfun2 charlist charp charpoly chdir chebyshev_t chebyshev_u checkdiv check_overlaps chinese cholesky christof chromatic_index chromatic_number cint circulant_graph clear_edge_weight clear_rules clear_vertex_label clebsch_gordan clebsch_graph clessp clesspignore close closefile cmetric coeff coefmatrix cograd col collapse collectterms columnop columnspace columnswap columnvector combination combine comp2pui compare compfile compile compile_file complement_graph complete_bipartite_graph complete_graph complex_number_p components compose_functions concan concat conjugate conmetderiv connected_components connect_vertices cons constant constantp constituent constvalue cont2part content continuous_freq contortion contour_plot contract contract_edge contragrad contrib_ode convert coord copy copy_file copy_graph copylist copymatrix cor cos cosh cot coth cov cov1 covdiff covect covers crc24sum create_graph create_list csc csch csetup cspline ctaylor ct_coordsys ctransform ctranspose cube_graph cuboctahedron_graph cunlisp cv cycle_digraph cycle_graph cylindrical days360 dblint deactivate declare declare_constvalue declare_dimensions declare_fundamental_dimensions declare_fundamental_units declare_qty declare_translated declare_unit_conversion declare_units declare_weights decsym defcon define define_alt_display define_variable defint defmatch defrule defstruct deftaylor degree_sequence del delete deleten delta demo demoivre denom depends derivdegree derivlist describe desolve determinant dfloat dgauss_a dgauss_b dgeev dgemm dgeqrf dgesv dgesvd diag diagmatrix diag_matrix diagmatrixp diameter diff digitcharp dimacs_export dimacs_import dimension dimensionless dimensions dimensions_as_list direct directory discrete_freq disjoin disjointp disolate disp dispcon dispform dispfun dispJordan display disprule dispterms distrib divide divisors divsum dkummer_m dkummer_u dlange dodecahedron_graph dotproduct dotsimp dpart draw draw2d draw3d drawdf draw_file draw_graph dscalar echelon edge_coloring edge_connectivity edges eigens_by_jacobi eigenvalues eigenvectors eighth einstein eivals eivects elapsed_real_time elapsed_run_time ele2comp ele2polynome ele2pui elem elementp elevation_grid elim elim_allbut eliminate eliminate_using ellipse elliptic_e elliptic_ec elliptic_eu elliptic_f elliptic_kc elliptic_pi ematrix empty_graph emptyp endcons entermatrix entertensor entier equal equalp equiv_classes erf erfc erf_generalized erfi errcatch error errormsg errors euler ev eval_string evenp every evolution evolution2d evundiff example exp expand expandwrt expandwrt_factored expint expintegral_chi expintegral_ci expintegral_e expintegral_e1 expintegral_ei expintegral_e_simplify expintegral_li expintegral_shi expintegral_si explicit explose exponentialize express expt exsec extdiff extract_linear_equations extremal_subset ezgcd %f f90 facsum factcomb factor factorfacsum factorial factorout factorsum facts fast_central_elements fast_linsolve fasttimes featurep fernfale fft fib fibtophi fifth filename_merge file_search file_type fillarray findde find_root find_root_abs find_root_error find_root_rel first fix flatten flength float floatnump floor flower_snark flush flush1deriv flushd flushnd flush_output fmin_cobyla forget fortran fourcos fourexpand fourier fourier_elim fourint fourintcos fourintsin foursimp foursin fourth fposition frame_bracket freeof freshline fresnel_c fresnel_s from_adjacency_matrix frucht_graph full_listify fullmap fullmapl fullratsimp fullratsubst fullsetify funcsolve fundamental_dimensions fundamental_units fundef funmake funp fv g0 g1 gamma gamma_greek gamma_incomplete gamma_incomplete_generalized gamma_incomplete_regularized gauss gauss_a gauss_b gaussprob gcd gcdex gcdivide gcfac gcfactor gd generalized_lambert_w genfact gen_laguerre genmatrix gensym geo_amortization geo_annuity_fv geo_annuity_pv geomap geometric geometric_mean geosum get getcurrentdirectory get_edge_weight getenv get_lu_factors get_output_stream_string get_pixel get_plot_option get_tex_environment get_tex_environment_default get_vertex_label gfactor gfactorsum ggf girth global_variances gn gnuplot_close gnuplot_replot gnuplot_reset gnuplot_restart gnuplot_start go Gosper GosperSum gr2d gr3d gradef gramschmidt graph6_decode graph6_encode graph6_export graph6_import graph_center graph_charpoly graph_eigenvalues graph_flow graph_order graph_periphery graph_product graph_size graph_union great_rhombicosidodecahedron_graph great_rhombicuboctahedron_graph grid_graph grind grobner_basis grotzch_graph hamilton_cycle hamilton_path hankel hankel_1 hankel_2 harmonic harmonic_mean hav heawood_graph hermite hessian hgfred hilbertmap hilbert_matrix hipow histogram histogram_description hodge horner hypergeometric i0 i1 %ibes ic1 ic2 ic_convert ichr1 ichr2 icosahedron_graph icosidodecahedron_graph icurvature ident identfor identity idiff idim idummy ieqn %if ifactors iframes ifs igcdex igeodesic_coords ilt image imagpart imetric implicit implicit_derivative implicit_plot indexed_tensor indices induced_subgraph inferencep inference_result infix info_display init_atensor init_ctensor in_neighbors innerproduct inpart inprod inrt integerp integer_partitions integrate intersect intersection intervalp intopois intosum invariant1 invariant2 inverse_fft inverse_jacobi_cd inverse_jacobi_cn inverse_jacobi_cs inverse_jacobi_dc inverse_jacobi_dn inverse_jacobi_ds inverse_jacobi_nc inverse_jacobi_nd inverse_jacobi_ns inverse_jacobi_sc inverse_jacobi_sd inverse_jacobi_sn invert invert_by_adjoint invert_by_lu inv_mod irr is is_biconnected is_bipartite is_connected is_digraph is_edge_in_graph is_graph is_graph_or_digraph ishow is_isomorphic isolate isomorphism is_planar isqrt isreal_p is_sconnected is_tree is_vertex_in_graph items_inference %j j0 j1 jacobi jacobian jacobi_cd jacobi_cn jacobi_cs jacobi_dc jacobi_dn jacobi_ds jacobi_nc jacobi_nd jacobi_ns jacobi_p jacobi_sc jacobi_sd jacobi_sn JF jn join jordan julia julia_set julia_sin %k kdels kdelta kill killcontext kostka kron_delta kronecker_product kummer_m kummer_u kurtosis kurtosis_bernoulli kurtosis_beta kurtosis_binomial kurtosis_chi2 kurtosis_continuous_uniform kurtosis_discrete_uniform kurtosis_exp kurtosis_f kurtosis_gamma kurtosis_general_finite_discrete kurtosis_geometric kurtosis_gumbel kurtosis_hypergeometric kurtosis_laplace kurtosis_logistic kurtosis_lognormal kurtosis_negative_binomial kurtosis_noncentral_chi2 kurtosis_noncentral_student_t kurtosis_normal kurtosis_pareto kurtosis_poisson kurtosis_rayleigh kurtosis_student_t kurtosis_weibull label labels lagrange laguerre lambda lambert_w laplace laplacian_matrix last lbfgs lc2kdt lcharp lc_l lcm lc_u ldefint ldisp ldisplay legendre_p legendre_q leinstein length let letrules letsimp levi_civita lfreeof lgtreillis lhs li liediff limit Lindstedt linear linearinterpol linear_program linear_regression line_graph linsolve listarray list_correlations listify list_matrix_entries list_nc_monomials listoftens listofvars listp lmax lmin load loadfile local locate_matrix_entry log logcontract log_gamma lopow lorentz_gauge lowercasep lpart lratsubst lreduce lriemann lsquares_estimates lsquares_estimates_approximate lsquares_estimates_exact lsquares_mse lsquares_residual_mse lsquares_residuals lsum ltreillis lu_backsub lucas lu_factor %m macroexpand macroexpand1 make_array makebox makefact makegamma make_graph make_level_picture makelist makeOrders make_poly_continent make_poly_country make_polygon make_random_state make_rgb_picture makeset make_string_input_stream make_string_output_stream make_transform mandelbrot mandelbrot_set map mapatom maplist matchdeclare matchfix mat_cond mat_fullunblocker mat_function mathml_display mat_norm matrix matrixmap matrixp matrix_size mattrace mat_trace mat_unblocker max max_clique max_degree max_flow maximize_lp max_independent_set max_matching maybe md5sum mean mean_bernoulli mean_beta mean_binomial mean_chi2 mean_continuous_uniform mean_deviation mean_discrete_uniform mean_exp mean_f mean_gamma mean_general_finite_discrete mean_geometric mean_gumbel mean_hypergeometric mean_laplace mean_logistic mean_lognormal mean_negative_binomial mean_noncentral_chi2 mean_noncentral_student_t mean_normal mean_pareto mean_poisson mean_rayleigh mean_student_t mean_weibull median median_deviation member mesh metricexpandall mgf1_sha1 min min_degree min_edge_cut minfactorial minimalPoly minimize_lp minimum_spanning_tree minor minpack_lsquares minpack_solve min_vertex_cover min_vertex_cut mkdir mnewton mod mode_declare mode_identity ModeMatrix moebius mon2schur mono monomial_dimensions multibernstein_poly multi_display_for_texinfo multi_elem multinomial multinomial_coeff multi_orbit multiplot_mode multi_pui multsym multthru mycielski_graph nary natural_unit nc_degree ncexpt ncharpoly negative_picture neighbors new newcontext newdet new_graph newline newton new_variable next_prime nicedummies niceindices ninth nofix nonarray noncentral_moment nonmetricity nonnegintegerp nonscalarp nonzeroandfreeof notequal nounify nptetrad npv nroots nterms ntermst nthroot nullity nullspace num numbered_boundaries numberp number_to_octets num_distinct_partitions numerval numfactor num_partitions nusum nzeta nzetai nzetar octets_to_number octets_to_oid odd_girth oddp ode2 ode_check odelin oid_to_octets op opena opena_binary openr openr_binary openw openw_binary operatorp opsubst optimize %or orbit orbits ordergreat ordergreatp orderless orderlessp orthogonal_complement orthopoly_recur orthopoly_weight outermap out_neighbors outofpois pade parabolic_cylinder_d parametric parametric_surface parg parGosper parse_string parse_timedate part part2cont partfrac partition partition_set partpol path_digraph path_graph pathname_directory pathname_name pathname_type pdf_bernoulli pdf_beta pdf_binomial pdf_cauchy pdf_chi2 pdf_continuous_uniform pdf_discrete_uniform pdf_exp pdf_f pdf_gamma pdf_general_finite_discrete pdf_geometric pdf_gumbel pdf_hypergeometric pdf_laplace pdf_logistic pdf_lognormal pdf_negative_binomial pdf_noncentral_chi2 pdf_noncentral_student_t pdf_normal pdf_pareto pdf_poisson pdf_rank_sum pdf_rayleigh pdf_signed_rank pdf_student_t pdf_weibull pearson_skewness permanent permut permutation permutations petersen_graph petrov pickapart picture_equalp picturep piechart piechart_description planar_embedding playback plog plot2d plot3d plotdf ploteq plsquares pochhammer points poisdiff poisexpt poisint poismap poisplus poissimp poissubst poistimes poistrim polar polarform polartorect polar_to_xy poly_add poly_buchberger poly_buchberger_criterion poly_colon_ideal poly_content polydecomp poly_depends_p poly_elimination_ideal poly_exact_divide poly_expand poly_expt poly_gcd polygon poly_grobner poly_grobner_equal poly_grobner_member poly_grobner_subsetp poly_ideal_intersection poly_ideal_polysaturation poly_ideal_polysaturation1 poly_ideal_saturation poly_ideal_saturation1 poly_lcm poly_minimization polymod poly_multiply polynome2ele polynomialp poly_normal_form poly_normalize poly_normalize_list poly_polysaturation_extension poly_primitive_part poly_pseudo_divide poly_reduced_grobner poly_reduction poly_saturation_extension poly_s_polynomial poly_subtract polytocompanion pop postfix potential power_mod powerseries powerset prefix prev_prime primep primes principal_components print printf printfile print_graph printpois printprops prodrac product properties propvars psi psubst ptriangularize pui pui2comp pui2ele pui2polynome pui_direct puireduc push put pv qput qrange qty quad_control quad_qag quad_qagi quad_qagp quad_qags quad_qawc quad_qawf quad_qawo quad_qaws quadrilateral quantile quantile_bernoulli quantile_beta quantile_binomial quantile_cauchy quantile_chi2 quantile_continuous_uniform quantile_discrete_uniform quantile_exp quantile_f quantile_gamma quantile_general_finite_discrete quantile_geometric quantile_gumbel quantile_hypergeometric quantile_laplace quantile_logistic quantile_lognormal quantile_negative_binomial quantile_noncentral_chi2 quantile_noncentral_student_t quantile_normal quantile_pareto quantile_poisson quantile_rayleigh quantile_student_t quantile_weibull quartile_skewness quit qunit quotient racah_v racah_w radcan radius random random_bernoulli random_beta random_binomial random_bipartite_graph random_cauchy random_chi2 random_continuous_uniform random_digraph random_discrete_uniform random_exp random_f random_gamma random_general_finite_discrete random_geometric random_graph random_graph1 random_gumbel random_hypergeometric random_laplace random_logistic random_lognormal random_negative_binomial random_network random_noncentral_chi2 random_noncentral_student_t random_normal random_pareto random_permutation random_poisson random_rayleigh random_regular_graph random_student_t random_tournament random_tree random_weibull range rank rat ratcoef ratdenom ratdiff ratdisrep ratexpand ratinterpol rational rationalize ratnumer ratnump ratp ratsimp ratsubst ratvars ratweight read read_array read_binary_array read_binary_list read_binary_matrix readbyte readchar read_hashed_array readline read_list read_matrix read_nested_list readonly read_xpm real_imagpart_to_conjugate realpart realroots rearray rectangle rectform rectform_log_if_constant recttopolar rediff reduce_consts reduce_order region region_boundaries region_boundaries_plus rem remainder remarray rembox remcomps remcon remcoord remfun remfunction remlet remove remove_constvalue remove_dimensions remove_edge remove_fundamental_dimensions remove_fundamental_units remove_plot_option remove_vertex rempart remrule remsym remvalue rename rename_file reset reset_displays residue resolvante resolvante_alternee1 resolvante_bipartite resolvante_diedrale resolvante_klein resolvante_klein3 resolvante_produit_sym resolvante_unitaire resolvante_vierer rest resultant return reveal reverse revert revert2 rgb2level rhs ricci riemann rinvariant risch rk rmdir rncombine romberg room rootscontract round row rowop rowswap rreduce run_testsuite %s save saving scalarp scaled_bessel_i scaled_bessel_i0 scaled_bessel_i1 scalefactors scanmap scatterplot scatterplot_description scene schur2comp sconcat scopy scsimp scurvature sdowncase sec sech second sequal sequalignore set_alt_display setdifference set_draw_defaults set_edge_weight setelmx setequalp setify setp set_partitions set_plot_option set_prompt set_random_state set_tex_environment set_tex_environment_default setunits setup_autoload set_up_dot_simplifications set_vertex_label seventh sexplode sf sha1sum sha256sum shortest_path shortest_weighted_path show showcomps showratvars sierpinskiale sierpinskimap sign signum similaritytransform simp_inequality simplify_sum simplode simpmetderiv simtran sin sinh sinsert sinvertcase sixth skewness skewness_bernoulli skewness_beta skewness_binomial skewness_chi2 skewness_continuous_uniform skewness_discrete_uniform skewness_exp skewness_f skewness_gamma skewness_general_finite_discrete skewness_geometric skewness_gumbel skewness_hypergeometric skewness_laplace skewness_logistic skewness_lognormal skewness_negative_binomial skewness_noncentral_chi2 skewness_noncentral_student_t skewness_normal skewness_pareto skewness_poisson skewness_rayleigh skewness_student_t skewness_weibull slength smake small_rhombicosidodecahedron_graph small_rhombicuboctahedron_graph smax smin smismatch snowmap snub_cube_graph snub_dodecahedron_graph solve solve_rec solve_rec_rat some somrac sort sparse6_decode sparse6_encode sparse6_export sparse6_import specint spherical spherical_bessel_j spherical_bessel_y spherical_hankel1 spherical_hankel2 spherical_harmonic spherical_to_xyz splice split sposition sprint sqfr sqrt sqrtdenest sremove sremovefirst sreverse ssearch ssort sstatus ssubst ssubstfirst staircase standardize standardize_inverse_trig starplot starplot_description status std std1 std_bernoulli std_beta std_binomial std_chi2 std_continuous_uniform std_discrete_uniform std_exp std_f std_gamma std_general_finite_discrete std_geometric std_gumbel std_hypergeometric std_laplace std_logistic std_lognormal std_negative_binomial std_noncentral_chi2 std_noncentral_student_t std_normal std_pareto std_poisson std_rayleigh std_student_t std_weibull stemplot stirling stirling1 stirling2 strim striml strimr string stringout stringp strong_components struve_h struve_l sublis sublist sublist_indices submatrix subsample subset subsetp subst substinpart subst_parallel substpart substring subvar subvarp sum sumcontract summand_to_rec supcase supcontext symbolp symmdifference symmetricp system take_channel take_inference tan tanh taylor taylorinfo taylorp taylor_simplifier taytorat tcl_output tcontract tellrat tellsimp tellsimpafter tentex tenth test_mean test_means_difference test_normality test_proportion test_proportions_difference test_rank_sum test_sign test_signed_rank test_variance test_variance_ratio tex tex1 tex_display texput %th third throw time timedate timer timer_info tldefint tlimit todd_coxeter toeplitz tokens to_lisp topological_sort to_poly to_poly_solve totaldisrep totalfourier totient tpartpol trace tracematrix trace_options transform_sample translate translate_file transpose treefale tree_reduce treillis treinat triangle triangularize trigexpand trigrat trigreduce trigsimp trunc truncate truncated_cube_graph truncated_dodecahedron_graph truncated_icosahedron_graph truncated_tetrahedron_graph tr_warnings_get tube tutte_graph ueivects uforget ultraspherical underlying_graph undiff union unique uniteigenvectors unitp units unit_step unitvector unorder unsum untellrat untimer untrace uppercasep uricci uriemann uvect vandermonde_matrix var var1 var_bernoulli var_beta var_binomial var_chi2 var_continuous_uniform var_discrete_uniform var_exp var_f var_gamma var_general_finite_discrete var_geometric var_gumbel var_hypergeometric var_laplace var_logistic var_lognormal var_negative_binomial var_noncentral_chi2 var_noncentral_student_t var_normal var_pareto var_poisson var_rayleigh var_student_t var_weibull vector vectorpotential vectorsimp verbify vers vertex_coloring vertex_connectivity vertex_degree vertex_distance vertex_eccentricity vertex_in_degree vertex_out_degree vertices vertices_to_cycle vertices_to_path %w weyl wheel_graph wiener_index wigner_3j wigner_6j wigner_9j with_stdout write_binary_data writebyte write_data writefile wronskian xreduce xthru %y Zeilberger zeroequiv zerofor zeromatrix zeromatrixp zeta zgeev zheev zlange zn_add_table zn_carmichael_lambda zn_characteristic_factors zn_determinant zn_factor_generators zn_invert_by_lu zn_log zn_mult_table absboxchar activecontexts adapt_depth additive adim aform algebraic algepsilon algexact aliases allbut all_dotsimp_denoms allocation allsym alphabetic animation antisymmetric arrays askexp assume_pos assume_pos_pred assumescalar asymbol atomgrad atrig1 axes axis_3d axis_bottom axis_left axis_right axis_top azimuth background background_color backsubst berlefact bernstein_explicit besselexpand beta_args_sum_to_integer beta_expand bftorat bftrunc bindtest border boundaries_array box boxchar breakup %c capping cauchysum cbrange cbtics center cflength cframe_flag cnonmet_flag color color_bar color_bar_tics colorbox columns commutative complex cone context contexts contour contour_levels cosnpiflag ctaypov ctaypt ctayswitch ctayvar ct_coords ctorsion_flag ctrgsimp cube current_let_rule_package cylinder data_file_name debugmode decreasing default_let_rule_package delay dependencies derivabbrev derivsubst detout diagmetric diff dim dimensions dispflag display2d|10 display_format_internal distribute_over doallmxops domain domxexpt domxmxops domxnctimes dontfactor doscmxops doscmxplus dot0nscsimp dot0simp dot1simp dotassoc dotconstrules dotdistrib dotexptsimp dotident dotscrules draw_graph_program draw_realpart edge_color edge_coloring edge_partition edge_type edge_width %edispflag elevation %emode endphi endtheta engineering_format_floats enhanced3d %enumer epsilon_lp erfflag erf_representation errormsg error_size error_syms error_type %e_to_numlog eval even evenfun evflag evfun ev_point expandwrt_denom expintexpand expintrep expon expop exptdispflag exptisolate exptsubst facexpand facsum_combine factlim factorflag factorial_expand factors_only fb feature features file_name file_output_append file_search_demo file_search_lisp file_search_maxima|10 file_search_tests file_search_usage file_type_lisp file_type_maxima|10 fill_color fill_density filled_func fixed_vertices flipflag float2bf font font_size fortindent fortspaces fpprec fpprintprec functions gamma_expand gammalim gdet genindex gensumnum GGFCFMAX GGFINFINITY globalsolve gnuplot_command gnuplot_curve_styles gnuplot_curve_titles gnuplot_default_term_command gnuplot_dumb_term_command gnuplot_file_args gnuplot_file_name gnuplot_out_file gnuplot_pdf_term_command gnuplot_pm3d gnuplot_png_term_command gnuplot_postamble gnuplot_preamble gnuplot_ps_term_command gnuplot_svg_term_command gnuplot_term gnuplot_view_args Gosper_in_Zeilberger gradefs grid grid2d grind halfangles head_angle head_both head_length head_type height hypergeometric_representation %iargs ibase icc1 icc2 icounter idummyx ieqnprint ifb ifc1 ifc2 ifg ifgi ifr iframe_bracket_form ifri igeowedge_flag ikt1 ikt2 imaginary inchar increasing infeval infinity inflag infolists inm inmc1 inmc2 intanalysis integer integervalued integrate_use_rootsof integration_constant integration_constant_counter interpolate_color intfaclim ip_grid ip_grid_in irrational isolate_wrt_times iterations itr julia_parameter %k1 %k2 keepfloat key key_pos kinvariant kt label label_alignment label_orientation labels lassociative lbfgs_ncorrections lbfgs_nfeval_max leftjust legend letrat let_rule_packages lfg lg lhospitallim limsubst linear linear_solver linechar linel|10 linenum line_type linewidth line_width linsolve_params linsolvewarn lispdisp listarith listconstvars listdummyvars lmxchar load_pathname loadprint logabs logarc logcb logconcoeffp logexpand lognegint logsimp logx logx_secondary logy logy_secondary logz lriem m1pbranch macroexpansion macros mainvar manual_demo maperror mapprint matrix_element_add matrix_element_mult matrix_element_transpose maxapplydepth maxapplyheight maxima_tempdir|10 maxima_userdir|10 maxnegex MAX_ORD maxposex maxpsifracdenom maxpsifracnum maxpsinegint maxpsiposint maxtayorder mesh_lines_color method mod_big_prime mode_check_errorp mode_checkp mode_check_warnp mod_test mod_threshold modular_linear_solver modulus multiplicative multiplicities myoptions nary negdistrib negsumdispflag newline newtonepsilon newtonmaxiter nextlayerfactor niceindicespref nm nmc noeval nolabels nonegative_lp noninteger nonscalar noun noundisp nouns np npi nticks ntrig numer numer_pbranch obase odd oddfun opacity opproperties opsubst optimprefix optionset orientation origin orthopoly_returns_intervals outative outchar packagefile palette partswitch pdf_file pfeformat phiresolution %piargs piece pivot_count_sx pivot_max_sx plot_format plot_options plot_realpart png_file pochhammer_max_index points pointsize point_size points_joined point_type poislim poisson poly_coefficient_ring poly_elimination_order polyfactor poly_grobner_algorithm poly_grobner_debug poly_monomial_order poly_primary_elimination_order poly_return_term_list poly_secondary_elimination_order poly_top_reduction_only posfun position powerdisp pred prederror primep_number_of_tests product_use_gamma program programmode promote_float_to_bigfloat prompt proportional_axes props psexpand ps_file radexpand radius radsubstflag rassociative ratalgdenom ratchristof ratdenomdivide rateinstein ratepsilon ratfac rational ratmx ratprint ratriemann ratsimpexpons ratvarswitch ratweights ratweyl ratwtlvl real realonly redraw refcheck resolution restart resultant ric riem rmxchar %rnum_list rombergabs rombergit rombergmin rombergtol rootsconmode rootsepsilon run_viewer same_xy same_xyz savedef savefactors scalar scalarmatrixp scale scale_lp setcheck setcheckbreak setval show_edge_color show_edges show_edge_type show_edge_width show_id show_label showtime show_vertex_color show_vertex_size show_vertex_type show_vertices show_weight simp simplified_output simplify_products simpproduct simpsum sinnpiflag solvedecomposes solveexplicit solvefactors solvenullwarn solveradcan solvetrigwarn space sparse sphere spring_embedding_depth sqrtdispflag stardisp startphi starttheta stats_numer stringdisp structures style sublis_apply_lambda subnumsimp sumexpand sumsplitfact surface surface_hide svg_file symmetric tab taylordepth taylor_logexpand taylor_order_coefficients taylor_truncate_polynomials tensorkill terminal testsuite_files thetaresolution timer_devalue title tlimswitch tr track transcompile transform transform_xy translate_fast_arrays transparent transrun tr_array_as_ref tr_bound_function_applyp tr_file_tty_messagesp tr_float_can_branch_complex tr_function_call_default trigexpandplus trigexpandtimes triginverses trigsign trivial_solutions tr_numer tr_optimize_max_loop tr_semicompile tr_state_vars tr_warn_bad_function_calls tr_warn_fexpr tr_warn_meval tr_warn_mode tr_warn_undeclared tr_warn_undefined_variable tstep ttyoff tube_extremes ufg ug %unitexpand unit_vectors uric uriem use_fast_arrays user_preamble usersetunits values vect_cross verbose vertex_color vertex_coloring vertex_partition vertex_size vertex_type view warnings weyl width windowname windowtitle wired_surface wireframe xaxis xaxis_color xaxis_secondary xaxis_type xaxis_width xlabel xlabel_secondary xlength xrange xrange_secondary xtics xtics_axis xtics_rotate xtics_rotate_secondary xtics_secondary xtics_secondary_axis xu_grid x_voxel xy_file xyplane xy_scale yaxis yaxis_color yaxis_secondary yaxis_type yaxis_width ylabel ylabel_secondary ylength yrange yrange_secondary ytics ytics_axis ytics_rotate ytics_rotate_secondary ytics_secondary ytics_secondary_axis yv_grid y_voxel yx_ratio zaxis zaxis_color zaxis_type zaxis_width zeroa zerob zerobern zeta%pi zlabel zlabel_rotate zlength zmin zn_primroot_limit zn_primroot_pretest",i="_ __ %|0 %%|0";return{l:"[A-Za-z_%][0-9A-Za-z_%]*",k:{keyword:t,literal:a,built_in:r,symbol:i},c:[{cN:"comment",b:"/\\*",e:"\\*/",c:["self"]},e.QSM,{cN:"number",r:0,v:[{b:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Ee][-+]?\\d+\\b"},{b:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Bb][-+]?\\d+\\b",r:10},{b:"\\b(\\.\\d+|\\d+\\.\\d+)\\b"},{b:"\\b(\\d+|0[0-9A-Za-z]+)\\.?\\b"}]}],i:/@/}});hljs.registerLanguage("crystal",function(e){function r(e,r){var b=[{b:e,e:r}];return b[0].c=b,b}var b="(_[uif](8|16|32|64))?",c="[a-zA-Z_]\\w*[!?=]?",n="!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",i="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\][=?]?",s={keyword:"abstract alias as asm begin break case class def do else elsif end ensure enum extend for fun if ifdef include instance_sizeof is_a? lib macro module next of out pointerof private protected rescue responds_to? return require self sizeof struct super then type typeof union unless until when while with yield __DIR__ __FILE__ __LINE__",literal:"false nil true"},t={cN:"subst",b:"#{",e:"}",k:s},a={cN:"template-variable",v:[{b:"\\{\\{",e:"\\}\\}"},{b:"\\{%",e:"%\\}"}],k:s},l={cN:"string",c:[e.BE,t],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%w?\\(",e:"\\)",c:r("\\(","\\)")},{b:"%w?\\[",e:"\\]",c:r("\\[","\\]")},{b:"%w?{",e:"}",c:r("{","}")},{b:"%w?<",e:">",c:r("<",">")},{b:"%w?/",e:"/"},{b:"%w?%",e:"%"},{b:"%w?-",e:"-"},{b:"%w?\\|",e:"\\|"}],r:0},u={b:"("+n+")\\s*",c:[{cN:"regexp",c:[e.BE,t],v:[{b:"//[a-z]*",r:0},{b:"/",e:"/[a-z]*"},{b:"%r\\(",e:"\\)",c:r("\\(","\\)")},{b:"%r\\[",e:"\\]",c:r("\\[","\\]")},{b:"%r{",e:"}",c:r("{","}")},{b:"%r<",e:">",c:r("<",">")},{b:"%r/",e:"/"},{b:"%r%",e:"%"},{b:"%r-",e:"-"},{b:"%r\\|",e:"\\|"}]}],r:0},o={cN:"regexp",c:[e.BE,t],v:[{b:"%r\\(",e:"\\)",c:r("\\(","\\)")},{b:"%r\\[",e:"\\]",c:r("\\[","\\]")},{b:"%r{",e:"}",c:r("{","}")},{b:"%r<",e:">",c:r("<",">")},{b:"%r/",e:"/"},{b:"%r%",e:"%"},{b:"%r-",e:"-"},{b:"%r\\|",e:"\\|"}],r:0},_={cN:"meta",b:"@\\[",e:"\\]",c:[e.inherit(e.QSM,{cN:"meta-string"})]},f=[a,l,u,o,_,e.HCM,{cN:"class",bK:"class module struct",e:"$|;",i:/=/,c:[e.HCM,e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<"}]},{cN:"class",bK:"lib enum union",e:"$|;",i:/=/,c:[e.HCM,e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"})],r:10},{cN:"function",bK:"def",e:/\B\b/,c:[e.inherit(e.TM,{b:i,endsParent:!0})]},{cN:"function",bK:"fun macro",e:/\B\b/,c:[e.inherit(e.TM,{b:i,endsParent:!0})],r:5},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[l,{b:i}],r:0},{cN:"number",v:[{b:"\\b0b([01_]*[01])"+b},{b:"\\b0o([0-7_]*[0-7])"+b},{b:"\\b0x([A-Fa-f0-9_]*[A-Fa-f0-9])"+b},{b:"\\b(([0-9][0-9_]*[0-9]|[0-9])(\\.[0-9_]*[0-9])?([eE][+-]?[0-9_]*[0-9])?)"+b}],r:0}];return t.c=f,a.c=f.slice(1),{aliases:["cr"],l:c,k:s,c:f}});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("processing",function(e){return{k:{keyword:"BufferedReader PVector PFont PImage PGraphics HashMap boolean byte char color double float int long String Array FloatDict FloatList IntDict IntList JSONArray JSONObject Object StringDict StringList Table TableRow XML false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private",literal:"P2D P3D HALF_PI PI QUARTER_PI TAU TWO_PI",title:"setup draw",built_in:"displayHeight displayWidth mouseY mouseX mousePressed pmouseX pmouseY key keyCode pixels focused frameCount frameRate height width size createGraphics beginDraw createShape loadShape PShape arc ellipse line point quad rect triangle bezier bezierDetail bezierPoint bezierTangent curve curveDetail curvePoint curveTangent curveTightness shape shapeMode beginContour beginShape bezierVertex curveVertex endContour endShape quadraticVertex vertex ellipseMode noSmooth rectMode smooth strokeCap strokeJoin strokeWeight mouseClicked mouseDragged mouseMoved mousePressed mouseReleased mouseWheel keyPressed keyPressedkeyReleased keyTyped print println save saveFrame day hour millis minute month second year background clear colorMode fill noFill noStroke stroke alpha blue brightness color green hue lerpColor red saturation modelX modelY modelZ screenX screenY screenZ ambient emissive shininess specular add createImage beginCamera camera endCamera frustum ortho perspective printCamera printProjection cursor frameRate noCursor exit loop noLoop popStyle pushStyle redraw binary boolean byte char float hex int str unbinary unhex join match matchAll nf nfc nfp nfs split splitTokens trim append arrayCopy concat expand reverse shorten sort splice subset box sphere sphereDetail createInput createReader loadBytes loadJSONArray loadJSONObject loadStrings loadTable loadXML open parseXML saveTable selectFolder selectInput beginRaw beginRecord createOutput createWriter endRaw endRecord PrintWritersaveBytes saveJSONArray saveJSONObject saveStream saveStrings saveXML selectOutput popMatrix printMatrix pushMatrix resetMatrix rotate rotateX rotateY rotateZ scale shearX shearY translate ambientLight directionalLight lightFalloff lights lightSpecular noLights normal pointLight spotLight image imageMode loadImage noTint requestImage tint texture textureMode textureWrap blend copy filter get loadPixels set updatePixels blendMode loadShader PShaderresetShader shader createFont loadFont text textFont textAlign textLeading textMode textSize textWidth textAscent textDescent abs ceil constrain dist exp floor lerp log mag map max min norm pow round sq sqrt acos asin atan atan2 cos degrees radians sin tan noise noiseDetail noiseSeed random randomGaussian randomSeed"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("1c",function(c){var e="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*",n="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт",b="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон",i={b:'""'},r={cN:"string",b:'"',e:'"|$',c:[i]},t={cN:"string",b:"\\|",e:'"|$',c:[i]};return{cI:!0,l:e,k:{keyword:n,built_in:b},c:[c.CLCM,c.NM,r,t,{cN:"function",b:"(процедура|функция)",e:"$",l:e,k:"процедура функция",c:[{b:"экспорт",eW:!0,l:e,k:"экспорт",c:[c.CLCM]},{cN:"params",b:"\\(",e:"\\)",l:e,k:"знач",c:[r,t]},c.CLCM,c.inherit(c.TM,{b:e})]},{cN:"meta",b:"#",e:"$"},{cN:"number",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("julia",function(e){var r={keyword:"in abstract baremodule begin bitstype break catch ccall const continue do else elseif end export finally for function global if immutable import importall let local macro module quote return try type typealias using while",literal:"true false ARGS CPU_CORES C_NULL DL_LOAD_PATH DevNull ENDIAN_BOM ENV I|0 Inf Inf16 Inf32 InsertionSort JULIA_HOME LOAD_PATH MS_ASYNC MS_INVALIDATE MS_SYNC MergeSort NaN NaN16 NaN32 OS_NAME QuickSort RTLD_DEEPBIND RTLD_FIRST RTLD_GLOBAL RTLD_LAZY RTLD_LOCAL RTLD_NODELETE RTLD_NOLOAD RTLD_NOW RoundDown RoundFromZero RoundNearest RoundToZero RoundUp STDERR STDIN STDOUT VERSION WORD_SIZE catalan cglobal e|0 eu|0 eulergamma golden im nothing pi γ π φ Inf64 NaN64 RoundNearestTiesAway RoundNearestTiesUp ",built_in:"ANY ASCIIString AbstractArray AbstractRNG AbstractSparseArray Any ArgumentError Array Associative Base64Pipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError Box CFILE Cchar Cdouble Cfloat Char CharString Cint Clong Clonglong ClusterManager Cmd Coff_t Colon Complex Complex128 Complex32 Complex64 Condition Cptrdiff_t Cshort Csize_t Cssize_t Cuchar Cuint Culong Culonglong Cushort Cwchar_t DArray DataType DenseArray Diagonal Dict DimensionMismatch DirectIndexString Display DivideError DomainError EOFError EachLine Enumerate ErrorException Exception Expr Factorization FileMonitor FileOffset Filter Float16 Float32 Float64 FloatRange FloatingPoint Function GetfieldNode GotoNode Hermitian IO IOBuffer IOStream IPv4 IPv6 InexactError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException IntrinsicFunction KeyError LabelNode LambdaStaticData LineNumberNode LoadError LocalProcess MIME MathConst MemoryError MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode Nothing Number ObjectIdDict OrdinalRange OverflowError ParseError PollingFileWatcher ProcessExitedException ProcessGroup Ptr QuoteNode Range Range1 Ranges Rational RawFD Real Regex RegexMatch RemoteRef RepString RevString RopeString RoundingMode Set SharedArray Signed SparseMatrixCSC StackOverflowError Stat StatStruct StepRange String SubArray SubString SymTridiagonal Symbol SymbolNode Symmetric SystemError Task TextDisplay Timer TmStruct TopNode Triangular Tridiagonal Type TypeConstructor TypeError TypeName TypeVar UTF16String UTF32String UTF8String UdpSocket Uint Uint128 Uint16 Uint32 Uint64 Uint8 UndefRefError UndefVarError UniformScaling UnionType UnitRange Unsigned Vararg VersionNumber WString WeakKeyDict WeakRef Woodbury Zip AbstractChannel AbstractFloat AbstractString AssertionError Base64DecodePipe Base64EncodePipe BufferStream CapturedException CartesianIndex CartesianRange Channel Cintmax_t CompositeException Cstring Cuintmax_t Cwstring Date DateTime Dims Enum GenSym GlobalRef HTML InitError InvalidStateException Irrational LinSpace LowerTriangular NullException Nullable OutOfMemoryError Pair PartialQuickSort Pipe RandomDevice ReadOnlyMemoryError ReentrantLock Ref RemoteException SegmentationFault SerializationState SimpleVector TCPSocket Text Tuple UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UnicodeError Union UpperTriangular Val Void WorkerConfig AbstractMatrix AbstractSparseMatrix AbstractSparseVector AbstractVecOrMat AbstractVector DenseMatrix DenseVecOrMat DenseVector Matrix SharedMatrix SharedVector StridedArray StridedMatrix StridedVecOrMat StridedVector VecOrMat Vector "},t="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",a={l:t,k:r,i:/<\//},n={cN:"type",b:/::/},o={cN:"type",b:/<:/},i={cN:"number",b:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,r:0},l={cN:"string",b:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},c={cN:"subst",b:/\$\(/,e:/\)/,k:r},s={cN:"variable",b:"\\$"+t},d={cN:"string",c:[e.BE,c,s],v:[{b:/\w*"""/,e:/"""\w*/,r:10},{b:/\w*"/,e:/"\w*/}]},S={cN:"string",c:[e.BE,c,s],b:"`",e:"`"},u={cN:"meta",b:"@"+t},g={cN:"comment",v:[{b:"#=",e:"=#",r:10},{b:"#",e:"$"}]};return a.c=[i,l,n,o,d,S,u,g,e.HCM],c.c=a.c,a});hljs.registerLanguage("scss",function(e){var t="[a-zA-Z-][a-zA-Z0-9_-]*",i={cN:"variable",b:"(\\$"+t+")\\b"},r={cN:"number",b:"#[0-9A-Fa-f]+"};({cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:!0,i:"[^\\s]",starts:{eW:!0,eE:!0,c:[r,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"meta",b:"!important"}]}});return{cI:!0,i:"[=/|']",c:[e.CLCM,e.CBCM,{cN:"selector-id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"selector-class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"selector-attr",b:"\\[",e:"\\]",i:"$"},{cN:"selector-tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},i,{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{b:":",e:";",c:[i,r,e.CSSNM,e.QSM,e.ASM,{cN:"meta",b:"!important"}]},{b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[i,e.QSM,e.ASM,r,e.CSSNM,{b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:o}});hljs.registerLanguage("mojolicious",function(e){return{sL:"xml",c:[{cN:"meta",b:"^__(END|DATA)__$"},{b:"^\\s*%{1,2}={0,2}",e:"$",sL:"perl"},{b:"<%{1,2}={0,2}",e:"={0,1}%>",sL:"perl",eB:!0,eE:!0}]}});hljs.registerLanguage("lsl",function(E){var T={cN:"subst",b:/\\[tn"\\]/},e={cN:"string",b:'"',e:'"',c:[T]},A={cN:"number",b:E.CNR},R={cN:"literal",v:[{b:"\\b(?:PI|TWO_PI|PI_BY_TWO|DEG_TO_RAD|RAD_TO_DEG|SQRT2)\\b"},{b:"\\b(?:XP_ERROR_(?:EXPERIENCES_DISABLED|EXPERIENCE_(?:DISABLED|SUSPENDED)|INVALID_(?:EXPERIENCE|PARAMETERS)|KEY_NOT_FOUND|MATURITY_EXCEEDED|NONE|NOT_(?:FOUND|PERMITTED(?:_LAND)?)|NO_EXPERIENCE|QUOTA_EXCEEDED|RETRY_UPDATE|STORAGE_EXCEPTION|STORE_DISABLED|THROTTLED|UNKNOWN_ERROR)|JSON_APPEND|STATUS_(?:PHYSICS|ROTATE_[XYZ]|PHANTOM|SANDBOX|BLOCK_GRAB(?:_OBJECT)?|(?:DIE|RETURN)_AT_EDGE|CAST_SHADOWS|OK|MALFORMED_PARAMS|TYPE_MISMATCH|BOUNDS_ERROR|NOT_(?:FOUND|SUPPORTED)|INTERNAL_ERROR|WHITELIST_FAILED)|AGENT(?:_(?:BY_(?:LEGACY_|USER)NAME|FLYING|ATTACHMENTS|SCRIPTED|MOUSELOOK|SITTING|ON_OBJECT|AWAY|WALKING|IN_AIR|TYPING|CROUCHING|BUSY|ALWAYS_RUN|AUTOPILOT|LIST_(?:PARCEL(?:_OWNER)?|REGION)))?|CAMERA_(?:PITCH|DISTANCE|BEHINDNESS_(?:ANGLE|LAG)|(?:FOCUS|POSITION)(?:_(?:THRESHOLD|LOCKED|LAG))?|FOCUS_OFFSET|ACTIVE)|ANIM_ON|LOOP|REVERSE|PING_PONG|SMOOTH|ROTATE|SCALE|ALL_SIDES|LINK_(?:ROOT|SET|ALL_(?:OTHERS|CHILDREN)|THIS)|ACTIVE|PASS(?:IVE|_(?:ALWAYS|IF_NOT_HANDLED|NEVER))|SCRIPTED|CONTROL_(?:FWD|BACK|(?:ROT_)?(?:LEFT|RIGHT)|UP|DOWN|(?:ML_)?LBUTTON)|PERMISSION_(?:RETURN_OBJECTS|DEBIT|OVERRIDE_ANIMATIONS|SILENT_ESTATE_MANAGEMENT|TAKE_CONTROLS|TRIGGER_ANIMATION|ATTACH|CHANGE_LINKS|(?:CONTROL|TRACK)_CAMERA|TELEPORT)|INVENTORY_(?:TEXTURE|SOUND|OBJECT|SCRIPT|LANDMARK|CLOTHING|NOTECARD|BODYPART|ANIMATION|GESTURE|ALL|NONE)|CHANGED_(?:INVENTORY|COLOR|SHAPE|SCALE|TEXTURE|LINK|ALLOWED_DROP|OWNER|REGION(?:_START)?|TELEPORT|MEDIA)|OBJECT_(?:CLICK_ACTION|HOVER_HEIGHT|LAST_OWNER_ID|(?:PHYSICS|SERVER|STREAMING)_COST|UNKNOWN_DETAIL|CHARACTER_TIME|PHANTOM|PHYSICS|TEMP_ON_REZ|NAME|DESC|POS|PRIM_(?:COUNT|EQUIVALENCE)|RETURN_(?:PARCEL(?:_OWNER)?|REGION)|REZZER_KEY|ROO?T|VELOCITY|OMEGA|OWNER|GROUP|CREATOR|ATTACHED_POINT|RENDER_WEIGHT|(?:BODY_SHAPE|PATHFINDING)_TYPE|(?:RUNNING|TOTAL)_SCRIPT_COUNT|TOTAL_INVENTORY_COUNT|SCRIPT_(?:MEMORY|TIME))|TYPE_(?:INTEGER|FLOAT|STRING|KEY|VECTOR|ROTATION|INVALID)|(?:DEBUG|PUBLIC)_CHANNEL|ATTACH_(?:AVATAR_CENTER|CHEST|HEAD|BACK|PELVIS|MOUTH|CHIN|NECK|NOSE|BELLY|[LR](?:SHOULDER|HAND|FOOT|EAR|EYE|[UL](?:ARM|LEG)|HIP)|(?:LEFT|RIGHT)_PEC|HUD_(?:CENTER_[12]|TOP_(?:RIGHT|CENTER|LEFT)|BOTTOM(?:_(?:RIGHT|LEFT))?)|[LR]HAND_RING1|TAIL_(?:BASE|TIP)|[LR]WING|FACE_(?:JAW|[LR]EAR|[LR]EYE|TOUNGE)|GROIN|HIND_[LR]FOOT)|LAND_(?:LEVEL|RAISE|LOWER|SMOOTH|NOISE|REVERT)|DATA_(?:ONLINE|NAME|BORN|SIM_(?:POS|STATUS|RATING)|PAYINFO)|PAYMENT_INFO_(?:ON_FILE|USED)|REMOTE_DATA_(?:CHANNEL|REQUEST|REPLY)|PSYS_(?:PART_(?:BF_(?:ZERO|ONE(?:_MINUS_(?:DEST_COLOR|SOURCE_(ALPHA|COLOR)))?|DEST_COLOR|SOURCE_(ALPHA|COLOR))|BLEND_FUNC_(DEST|SOURCE)|FLAGS|(?:START|END)_(?:COLOR|ALPHA|SCALE|GLOW)|MAX_AGE|(?:RIBBON|WIND|INTERP_(?:COLOR|SCALE)|BOUNCE|FOLLOW_(?:SRC|VELOCITY)|TARGET_(?:POS|LINEAR)|EMISSIVE)_MASK)|SRC_(?:MAX_AGE|PATTERN|ANGLE_(?:BEGIN|END)|BURST_(?:RATE|PART_COUNT|RADIUS|SPEED_(?:MIN|MAX))|ACCEL|TEXTURE|TARGET_KEY|OMEGA|PATTERN_(?:DROP|EXPLODE|ANGLE(?:_CONE(?:_EMPTY)?)?)))|VEHICLE_(?:REFERENCE_FRAME|TYPE_(?:NONE|SLED|CAR|BOAT|AIRPLANE|BALLOON)|(?:LINEAR|ANGULAR)_(?:FRICTION_TIMESCALE|MOTOR_DIRECTION)|LINEAR_MOTOR_OFFSET|HOVER_(?:HEIGHT|EFFICIENCY|TIMESCALE)|BUOYANCY|(?:LINEAR|ANGULAR)_(?:DEFLECTION_(?:EFFICIENCY|TIMESCALE)|MOTOR_(?:DECAY_)?TIMESCALE)|VERTICAL_ATTRACTION_(?:EFFICIENCY|TIMESCALE)|BANKING_(?:EFFICIENCY|MIX|TIMESCALE)|FLAG_(?:NO_DEFLECTION_UP|LIMIT_(?:ROLL_ONLY|MOTOR_UP)|HOVER_(?:(?:WATER|TERRAIN|UP)_ONLY|GLOBAL_HEIGHT)|MOUSELOOK_(?:STEER|BANK)|CAMERA_DECOUPLED))|PRIM_(?:ALPHA_MODE(?:_(?:BLEND|EMISSIVE|MASK|NONE))?|NORMAL|SPECULAR|TYPE(?:_(?:BOX|CYLINDER|PRISM|SPHERE|TORUS|TUBE|RING|SCULPT))?|HOLE_(?:DEFAULT|CIRCLE|SQUARE|TRIANGLE)|MATERIAL(?:_(?:STONE|METAL|GLASS|WOOD|FLESH|PLASTIC|RUBBER))?|SHINY_(?:NONE|LOW|MEDIUM|HIGH)|BUMP_(?:NONE|BRIGHT|DARK|WOOD|BARK|BRICKS|CHECKER|CONCRETE|TILE|STONE|DISKS|GRAVEL|BLOBS|SIDING|LARGETILE|STUCCO|SUCTION|WEAVE)|TEXGEN_(?:DEFAULT|PLANAR)|SCULPT_(?:TYPE_(?:SPHERE|TORUS|PLANE|CYLINDER|MASK)|FLAG_(?:MIRROR|INVERT))|PHYSICS(?:_(?:SHAPE_(?:CONVEX|NONE|PRIM|TYPE)))?|(?:POS|ROT)_LOCAL|SLICE|TEXT|FLEXIBLE|POINT_LIGHT|TEMP_ON_REZ|PHANTOM|POSITION|SIZE|ROTATION|TEXTURE|NAME|OMEGA|DESC|LINK_TARGET|COLOR|BUMP_SHINY|FULLBRIGHT|TEXGEN|GLOW|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE)?|PERMS_(?:INTERACT|CONTROL)|PARAM_MAX|CONTROLS_(?:STANDARD|MINI)|PERM_(?:NONE|OWNER|GROUP|ANYONE)|MAX_(?:URL_LENGTH|WHITELIST_(?:SIZE|COUNT)|(?:WIDTH|HEIGHT)_PIXELS)))|MASK_(?:BASE|OWNER|GROUP|EVERYONE|NEXT)|PERM_(?:TRANSFER|MODIFY|COPY|MOVE|ALL)|PARCEL_(?:MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP|TEXTURE|URL|TIME|AGENT|UNLOAD|AUTO_ALIGN|TYPE|SIZE|DESC|LOOP_SET)|FLAG_(?:ALLOW_(?:FLY|(?:GROUP_)?SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|CREATE_(?:GROUP_)?OBJECTS)|USE_(?:ACCESS_(?:GROUP|LIST)|BAN_LIST|LAND_PASS_LIST)|LOCAL_SOUND_ONLY|RESTRICT_PUSHOBJECT|ALLOW_(?:GROUP|ALL)_OBJECT_ENTRY)|COUNT_(?:TOTAL|OWNER|GROUP|OTHER|SELECTED|TEMP)|DETAILS_(?:NAME|DESC|OWNER|GROUP|AREA|ID|SEE_AVATARS))|LIST_STAT_(?:MAX|MIN|MEAN|MEDIAN|STD_DEV|SUM(?:_SQUARES)?|NUM_COUNT|GEOMETRIC_MEAN|RANGE)|PAY_(?:HIDE|DEFAULT)|REGION_FLAG_(?:ALLOW_DAMAGE|FIXED_SUN|BLOCK_TERRAFORM|SANDBOX|DISABLE_(?:COLLISIONS|PHYSICS)|BLOCK_FLY|ALLOW_DIRECT_TELEPORT|RESTRICT_PUSHOBJECT)|HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|CUSTOM_HEADER|PRAGMA_NO_CACHE|VERBOSE_THROTTLE|VERIFY_CERT)|STRING_(?:TRIM(?:_(?:HEAD|TAIL))?)|CLICK_ACTION_(?:NONE|TOUCH|SIT|BUY|PAY|OPEN(?:_MEDIA)?|PLAY|ZOOM)|TOUCH_INVALID_FACE|PROFILE_(?:NONE|SCRIPT_MEMORY)|RC_(?:DATA_FLAGS|DETECT_PHANTOM|GET_(?:LINK_NUM|NORMAL|ROOT_KEY)|MAX_HITS|REJECT_(?:TYPES|AGENTS|(?:NON)?PHYSICAL|LAND))|RCERR_(?:CAST_TIME_EXCEEDED|SIM_PERF_LOW|UNKNOWN)|ESTATE_ACCESS_(?:ALLOWED_(?:AGENT|GROUP)_(?:ADD|REMOVE)|BANNED_AGENT_(?:ADD|REMOVE))|DENSITY|FRICTION|RESTITUTION|GRAVITY_MULTIPLIER|KFM_(?:COMMAND|CMD_(?:PLAY|STOP|PAUSE)|MODE|FORWARD|LOOP|PING_PONG|REVERSE|DATA|ROTATION|TRANSLATION)|ERR_(?:GENERIC|PARCEL_PERMISSIONS|MALFORMED_PARAMS|RUNTIME_PERMISSIONS|THROTTLED)|CHARACTER_(?:CMD_(?:(?:SMOOTH_)?STOP|JUMP)|DESIRED_(?:TURN_)?SPEED|RADIUS|STAY_WITHIN_PARCEL|LENGTH|ORIENTATION|ACCOUNT_FOR_SKIPPED_FRAMES|AVOIDANCE_MODE|TYPE(?:_(?:[ABCD]|NONE))?|MAX_(?:DECEL|TURN_RADIUS|(?:ACCEL|SPEED)))|PURSUIT_(?:OFFSET|FUZZ_FACTOR|GOAL_TOLERANCE|INTERCEPT)|REQUIRE_LINE_OF_SIGHT|FORCE_DIRECT_PATH|VERTICAL|HORIZONTAL|AVOID_(?:CHARACTERS|DYNAMIC_OBSTACLES|NONE)|PU_(?:EVADE_(?:HIDDEN|SPOTTED)|FAILURE_(?:DYNAMIC_PATHFINDING_DISABLED|INVALID_(?:GOAL|START)|NO_(?:NAVMESH|VALID_DESTINATION)|OTHER|TARGET_GONE|(?:PARCEL_)?UNREACHABLE)|(?:GOAL|SLOWDOWN_DISTANCE)_REACHED)|TRAVERSAL_TYPE(?:_(?:FAST|NONE|SLOW))?|CONTENT_TYPE_(?:ATOM|FORM|HTML|JSON|LLSD|RSS|TEXT|XHTML|XML)|GCNP_(?:RADIUS|STATIC)|(?:PATROL|WANDER)_PAUSE_AT_WAYPOINTS|OPT_(?:AVATAR|CHARACTER|EXCLUSION_VOLUME|LEGACY_LINKSET|MATERIAL_VOLUME|OTHER|STATIC_OBSTACLE|WALKABLE)|SIM_STAT_PCT_CHARS_STEPPED)\\b"},{b:"\\b(?:FALSE|TRUE)\\b"},{b:"\\b(?:ZERO_ROTATION)\\b"},{b:"\\b(?:EOF|JSON_(?:ARRAY|DELETE|FALSE|INVALID|NULL|NUMBER|OBJECT|STRING|TRUE)|NULL_KEY|TEXTURE_(?:BLANK|DEFAULT|MEDIA|PLYWOOD|TRANSPARENT)|URL_REQUEST_(?:GRANTED|DENIED))\\b"},{b:"\\b(?:ZERO_VECTOR|TOUCH_INVALID_(?:TEXCOORD|VECTOR))\\b"}]},O={cN:"built_in",b:"\\b(?:ll(?:AgentInExperience|(?:Create|DataSize|Delete|KeyCount|Keys|Read|Update)KeyValue|GetExperience(?:Details|ErrorMessage)|ReturnObjectsBy(?:ID|Owner)|Json(?:2List|[GS]etValue|ValueType)|Sin|Cos|Tan|Atan2|Sqrt|Pow|Abs|Fabs|Frand|Floor|Ceil|Round|Vec(?:Mag|Norm|Dist)|Rot(?:Between|2(?:Euler|Fwd|Left|Up))|(?:Euler|Axes)2Rot|Whisper|(?:Region|Owner)?Say|Shout|Listen(?:Control|Remove)?|Sensor(?:Repeat|Remove)?|Detected(?:Name|Key|Owner|Type|Pos|Vel|Grab|Rot|Group|LinkNumber)|Die|Ground|Wind|(?:[GS]et)(?:AnimationOverride|MemoryLimit|PrimMediaParams|ParcelMusicURL|Object(?:Desc|Name)|PhysicsMaterial|Status|Scale|Color|Alpha|Texture|Pos|Rot|Force|Torque)|ResetAnimationOverride|(?:Scale|Offset|Rotate)Texture|(?:Rot)?Target(?:Remove)?|(?:Stop)?MoveToTarget|Apply(?:Rotational)?Impulse|Set(?:KeyframedMotion|ContentType|RegionPos|(?:Angular)?Velocity|Buoyancy|HoverHeight|ForceAndTorque|TimerEvent|ScriptState|Damage|TextureAnim|Sound(?:Queueing|Radius)|Vehicle(?:Type|(?:Float|Vector|Rotation)Param)|(?:Touch|Sit)?Text|Camera(?:Eye|At)Offset|PrimitiveParams|ClickAction|Link(?:Alpha|Color|PrimitiveParams(?:Fast)?|Texture(?:Anim)?|Camera|Media)|RemoteScriptAccessPin|PayPrice|LocalRot)|ScaleByFactor|Get(?:(?:Max|Min)ScaleFactor|ClosestNavPoint|StaticPath|SimStats|Env|PrimitiveParams|Link(?:PrimitiveParams|Number(?:OfSides)?|Key|Name|Media)|HTTPHeader|FreeURLs|Object(?:Details|PermMask|PrimCount)|Parcel(?:MaxPrims|Details|Prim(?:Count|Owners))|Attached(?:List)?|(?:SPMax|Free|Used)Memory|Region(?:Name|TimeDilation|FPS|Corner|AgentCount)|Root(?:Position|Rotation)|UnixTime|(?:Parcel|Region)Flags|(?:Wall|GMT)clock|SimulatorHostname|BoundingBox|GeometricCenter|Creator|NumberOf(?:Prims|NotecardLines|Sides)|Animation(?:List)?|(?:Camera|Local)(?:Pos|Rot)|Vel|Accel|Omega|Time(?:stamp|OfDay)|(?:Object|CenterOf)?Mass|MassMKS|Energy|Owner|(?:Owner)?Key|SunDirection|Texture(?:Offset|Scale|Rot)|Inventory(?:Number|Name|Key|Type|Creator|PermMask)|Permissions(?:Key)?|StartParameter|List(?:Length|EntryType)|Date|Agent(?:Size|Info|Language|List)|LandOwnerAt|NotecardLine|Script(?:Name|State))|(?:Get|Reset|GetAndReset)Time|PlaySound(?:Slave)?|LoopSound(?:Master|Slave)?|(?:Trigger|Stop|Preload)Sound|(?:(?:Get|Delete)Sub|Insert)String|To(?:Upper|Lower)|Give(?:InventoryList|Money)|RezObject|(?:Stop)?LookAt|Sleep|CollisionFilter|(?:Take|Release)Controls|DetachFromAvatar|AttachToAvatar(?:Temp)?|InstantMessage|(?:GetNext)?Email|StopHover|MinEventDelay|RotLookAt|String(?:Length|Trim)|(?:Start|Stop)Animation|TargetOmega|Request(?:Experience)?Permissions|(?:Create|Break)Link|BreakAllLinks|(?:Give|Remove)Inventory|Water|PassTouches|Request(?:Agent|Inventory)Data|TeleportAgent(?:Home|GlobalCoords)?|ModifyLand|CollisionSound|ResetScript|MessageLinked|PushObject|PassCollisions|AxisAngle2Rot|Rot2(?:Axis|Angle)|A(?:cos|sin)|AngleBetween|AllowInventoryDrop|SubStringIndex|List2(?:CSV|Integer|Json|Float|String|Key|Vector|Rot|List(?:Strided)?)|DeleteSubList|List(?:Statistics|Sort|Randomize|(?:Insert|Find|Replace)List)|EdgeOfWorld|AdjustSoundVolume|Key2Name|TriggerSoundLimited|EjectFromLand|(?:CSV|ParseString)2List|OverMyLand|SameGroup|UnSit|Ground(?:Slope|Normal|Contour)|GroundRepel|(?:Set|Remove)VehicleFlags|(?:AvatarOn)?(?:Link)?SitTarget|Script(?:Danger|Profiler)|Dialog|VolumeDetect|ResetOtherScript|RemoteLoadScriptPin|(?:Open|Close)RemoteDataChannel|SendRemoteData|RemoteDataReply|(?:Integer|String)ToBase64|XorBase64|Log(?:10)?|Base64To(?:String|Integer)|ParseStringKeepNulls|RezAtRoot|RequestSimulatorData|ForceMouselook|(?:Load|Release|(?:E|Une)scape)URL|ParcelMedia(?:CommandList|Query)|ModPow|MapDestination|(?:RemoveFrom|AddTo|Reset)Land(?:Pass|Ban)List|(?:Set|Clear)CameraParams|HTTP(?:Request|Response)|TextBox|DetectedTouch(?:UV|Face|Pos|(?:N|Bin)ormal|ST)|(?:MD5|SHA1|DumpList2)String|Request(?:Secure)?URL|Clear(?:Prim|Link)Media|(?:Link)?ParticleSystem|(?:Get|Request)(?:Username|DisplayName)|RegionSayTo|CastRay|GenerateKey|TransferLindenDollars|ManageEstateAccess|(?:Create|Delete)Character|ExecCharacterCmd|Evade|FleeFrom|NavigateTo|PatrolPoints|Pursue|UpdateCharacter|WanderWithin))\\b"};return{i:":",c:[e,{cN:"comment",v:[E.C("//","$"),E.C("/\\*","\\*/")]},A,{cN:"section",v:[{b:"\\b(?:state|default)\\b"},{b:"\\b(?:state_(?:entry|exit)|touch(?:_(?:start|end))?|(?:land_)?collision(?:_(?:start|end))?|timer|listen|(?:no_)?sensor|control|(?:not_)?at_(?:rot_)?target|money|email|experience_permissions(?:_denied)?|run_time_permissions|changed|attach|dataserver|moving_(?:start|end)|link_message|(?:on|object)_rez|remote_data|http_re(?:sponse|quest)|path_update|transaction_result)\\b"}]},O,R,{cN:"type",b:"\\b(?:integer|float|string|key|vector|quaternion|rotation|list)\\b"}]}});hljs.registerLanguage("dos",function(e){var r=e.C(/^\s*@?rem\b/,/$/,{r:10}),t={cN:"symbol",b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)",r:0};return{aliases:["bat","cmd"],cI:!0,i:/\/\*/,k:{keyword:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",built_in:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux shift cd dir echo setlocal endlocal set pause copy append assoc at attrib break cacls cd chcp chdir chkdsk chkntfs cls cmd color comp compact convert date dir diskcomp diskcopy doskey erase fs find findstr format ftype graftabl help keyb label md mkdir mode more move path pause print popd pushd promt rd recover rem rename replace restore rmdir shiftsort start subst time title tree type ver verify vol ping net ipconfig taskkill xcopy ren del"},c:[{cN:"variable",b:/%%[^ ]|%[^ ]+?%|![^ ]+?!/},{cN:"function",b:t.b,e:"goto:eof",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),r]},{cN:"number",b:"\\b\\d+",r:0},r]}});hljs.registerLanguage("puppet",function(e){var s={keyword:"and case default else elsif false if in import enherits node or true undef unless main settings $string ",literal:"alias audit before loglevel noop require subscribe tag owner ensure group mode name|0 changes context force incl lens load_path onlyif provider returns root show_diff type_check en_address ip_address realname command environment hour monute month monthday special target weekday creates cwd ogoutput refresh refreshonly tries try_sleep umask backup checksum content ctime force ignore links mtime purge recurse recurselimit replace selinux_ignore_defaults selrange selrole seltype seluser source souirce_permissions sourceselect validate_cmd validate_replacement allowdupe attribute_membership auth_membership forcelocal gid ia_load_module members system host_aliases ip allowed_trunk_vlans description device_url duplex encapsulation etherchannel native_vlan speed principals allow_root auth_class auth_type authenticate_user k_of_n mechanisms rule session_owner shared options device fstype enable hasrestart directory present absent link atboot blockdevice device dump pass remounts poller_tag use message withpath adminfile allow_virtual allowcdrom category configfiles flavor install_options instance package_settings platform responsefile status uninstall_options vendor unless_system_user unless_uid binary control flags hasstatus manifest pattern restart running start stop allowdupe auths expiry gid groups home iterations key_membership keys managehome membership password password_max_age password_min_age profile_membership profiles project purge_ssh_keys role_membership roles salt shell uid baseurl cost descr enabled enablegroups exclude failovermethod gpgcheck gpgkey http_caching include includepkgs keepalive metadata_expire metalink mirrorlist priority protect proxy proxy_password proxy_username repo_gpgcheck s3_enabled skip_if_unavailable sslcacert sslclientcert sslclientkey sslverify mounted",built_in:"architecture augeasversion blockdevices boardmanufacturer boardproductname boardserialnumber cfkey dhcp_servers domain ec2_ ec2_userdata facterversion filesystems ldom fqdn gid hardwareisa hardwaremodel hostname id|0 interfaces ipaddress ipaddress_ ipaddress6 ipaddress6_ iphostnumber is_virtual kernel kernelmajversion kernelrelease kernelversion kernelrelease kernelversion lsbdistcodename lsbdistdescription lsbdistid lsbdistrelease lsbmajdistrelease lsbminordistrelease lsbrelease macaddress macaddress_ macosx_buildversion macosx_productname macosx_productversion macosx_productverson_major macosx_productversion_minor manufacturer memoryfree memorysize netmask metmask_ network_ operatingsystem operatingsystemmajrelease operatingsystemrelease osfamily partitions path physicalprocessorcount processor processorcount productname ps puppetversion rubysitedir rubyversion selinux selinux_config_mode selinux_config_policy selinux_current_mode selinux_current_mode selinux_enforced selinux_policyversion serialnumber sp_ sshdsakey sshecdsakey sshrsakey swapencrypted swapfree swapsize timezone type uniqueid uptime uptime_days uptime_hours uptime_seconds uuid virtual vlans xendomains zfs_version zonenae zones zpool_version"},r=e.C("#","$"),a="([A-Za-z_]|::)(\\w|::)*",i=e.inherit(e.TM,{b:a}),o={cN:"variable",b:"\\$"+a},t={cN:"string",c:[e.BE,o],v:[{b:/'/,e:/'/},{b:/"/,e:/"/}]};return{aliases:["pp"],c:[r,o,t,{bK:"class",e:"\\{|;",i:/=/,c:[i,r]},{bK:"define",e:/\{/,c:[{cN:"section",b:e.IR,endsParent:!0}]},{b:e.IR+"\\s+\\{",rB:!0,e:/\S/,c:[{cN:"keyword",b:e.IR},{b:/\{/,e:/\}/,k:s,r:0,c:[t,r,{b:"[a-zA-Z_]+\\s*=>",rB:!0,e:"=>",c:[{cN:"attr",b:e.IR}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},o]}],r:0}]}});hljs.registerLanguage("swift",function(e){var t={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},i={cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:t,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:t,c:[o,e.CLCM,n,i,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:t,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("gcode",function(N){var e="[A-Z_][A-Z0-9_.]*",c="\\%",E="IF DO WHILE ENDWHILE CALL ENDIF SUB ENDSUB GOTO REPEAT ENDREPEAT EQ LT GT NE GE LE OR XOR",i={cN:"meta",b:"([O])([0-9]+)"},n=[N.CLCM,N.CBCM,N.C(/\(/,/\)/),N.inherit(N.CNM,{b:"([-+]?([0-9]*\\.?[0-9]+\\.?))|"+N.CNR}),N.inherit(N.ASM,{i:null}),N.inherit(N.QSM,{i:null}),{cN:"name",b:"([G])([0-9]+\\.?[0-9]?)"},{cN:"name",b:"([M])([0-9]+\\.?[0-9]?)"},{cN:"attr",b:"(VC|VS|#)",e:"(\\d+)"},{cN:"attr",b:"(VZOFX|VZOFY|VZOFZ)"},{cN:"built_in",b:"(ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN)(\\[)",e:"([-+]?([0-9]*\\.?[0-9]+\\.?))(\\])"},{cN:"symbol",v:[{b:"N",e:"\\d+",i:"\\W"}]}];return{aliases:["nc"],cI:!0,l:e,k:E,c:[{cN:"meta",b:c},i].concat(n)}});hljs.registerLanguage("ceylon",function(e){var a="assembly module package import alias class interface object given value assign void function new of extends satisfies abstracts in out return break continue throw assert dynamic if else switch case for while try catch finally then let this outer super is exists nonempty",t="shared abstract formal default actual variable late native deprecatedfinal sealed annotation suppressWarnings small",s="doc by license see throws tagged",n={cN:"subst",eB:!0,eE:!0,b:/``/,e:/``/,k:a,r:10},r=[{cN:"string",b:'"""',e:'"""',r:10},{cN:"string",b:'"',e:'"',c:[n]},{cN:"string",b:"'",e:"'"},{cN:"number",b:"#[0-9a-fA-F_]+|\\$[01_]+|[0-9_]+(?:\\.[0-9_](?:[eE][+-]?\\d+)?)?[kMGTPmunpf]?",r:0}];return n.c=r,{k:{keyword:a+" "+t,meta:s},i:"\\$[^01]|#[^0-9a-fA-F]",c:[e.CLCM,e.C("/\\*","\\*/",{c:["self"]}),{cN:"meta",b:'@[a-z]\\w*(?:\\:"[^"]*")?'}].concat(r)}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\._]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]\n/,sL:"bash"}}],i:"",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("protobuf",function(e){return{k:{keyword:"package import option optional required repeated group",built_in:"double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes",literal:"true false"},c:[e.QSM,e.NM,e.CLCM,{cN:"class",bK:"message enum service",e:/\{/,i:/\n/,c:[e.inherit(e.TM,{starts:{eW:!0,eE:!0}})]},{cN:"function",bK:"rpc",e:/;/,eE:!0,k:"rpc returns"},{b:/^\s*[A-Z_]+/,e:/\s*=/,eE:!0}]}});hljs.registerLanguage("matlab",function(e){var a=[e.CNM,{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]}],s={r:0,c:[{b:/'['\.]*/}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{b:/[a-zA-Z_][a-zA-Z_0-9]*'['\.]*/,rB:!0,r:0,c:[{b:/[a-zA-Z_][a-zA-Z_0-9]*/,r:0},s.c[0]]},{b:"\\[",e:"\\]",c:a,r:0,starts:s},{b:"\\{",e:/}/,c:a,r:0,starts:s},{b:/\)/,r:0,starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")].concat(a)}});hljs.registerLanguage("irpf90",function(e){var t={cN:"params",b:"\\(",e:"\\)"},n={literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data begin_provider &begin_provider end_provider begin_shell end_shell begin_template end_template subst assert touch soft_touch provide no_dep free irp_if irp_else irp_endif irp_write irp_read",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image IRP_ALIGN irp_here"};return{cI:!0,k:n,i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{cN:"string",r:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,t]},e.C("!","$",{r:0}),e.C("begin_doc","end_doc",{r:10}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",r:0}]}});hljs.registerLanguage("kotlin",function(e){var t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit initinterface annotation data sealed internal infix operator out by constructor super trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},r={cN:"keyword",b:/\b(break|continue|return|this)\b/,starts:{c:[{cN:"symbol",b:/@\w+/}]}},i={cN:"symbol",b:e.UIR+"@"},n={cN:"subst",v:[{b:"\\$"+e.UIR},{b:"\\${",e:"}",c:[e.ASM,e.CNM]}]},a={cN:"string",v:[{b:'"""',e:'"""',c:[n]},{b:"'",e:"'",i:/\n/,c:[e.BE]},{b:'"',e:'"',i:/\n/,c:[e.BE,n]}]},c={cN:"meta",b:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UIR+")?"},s={cN:"meta",b:"@"+e.UIR,c:[{b:/\(/,e:/\)/,c:[e.inherit(a,{cN:"meta-string"})]}]};return{k:t,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,r,i,c,s,{cN:"function",bK:"fun",e:"[(]|$",rB:!0,eE:!0,k:t,i:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,c,s,a,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},c,s]},a,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},e.CNM]}});hljs.registerLanguage("crmsh",function(t){var e="primitive rsc_template",r="group clone ms master location colocation order fencing_topology rsc_ticket acl_target acl_group user role tag xml",s="property rsc_defaults op_defaults",a="params meta operations op rule attributes utilization",i="read write deny defined not_defined in_range date spec in ref reference attribute type xpath version and or lt gt tag lte gte eq ne \\",o="number string",n="Master Started Slave Stopped start promote demote stop monitor true false";return{aliases:["crm","pcmk"],cI:!0,k:{keyword:a+" "+i+" "+o,literal:n},c:[t.HCM,{bK:"node",starts:{e:"\\s*([\\w_-]+:)?",starts:{cN:"title",e:"\\s*[\\$\\w_][\\w_-]*"}}},{bK:e,starts:{cN:"title",e:"\\s*[\\$\\w_][\\w_-]*",starts:{e:"\\s*@?[\\w_][\\w_\\.:-]*"}}},{b:"\\b("+r.split(" ").join("|")+")\\s+",k:r,starts:{cN:"title",e:"[\\$\\w_][\\w_-]*"}},{bK:s,starts:{cN:"title",e:"\\s*([\\w_-]+:)?"}},t.QSM,{cN:"meta",b:"(ocf|systemd|service|lsb):[\\w_:-]+",r:0},{cN:"number",b:"\\b\\d+(\\.\\d+)?(ms|s|h|m)?",r:0},{cN:"literal",b:"[-]?(infinity|inf)",r:0},{cN:"attr",b:/([A-Za-z\$_\#][\w_-]+)=/,r:0},{cN:"tag",b:"",r:0}]}});hljs.registerLanguage("haskell",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},a={cN:"meta",b:"{-#",e:"#-}"},l={cN:"meta",b:"^#",e:"$"},c={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n={b:"\\(",e:"\\)",i:'"',c:[a,l,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TM,{b:"[_a-z][\\w']*"}),i]},s={b:"{",e:"}",c:n.c};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{bK:"module",e:"where",k:"module where",c:[n,i],i:"\\W\\.|;"},{b:"\\bimport\\b",e:"$",k:"import qualified as hiding",c:[n,i],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[c,n,i]},{cN:"class",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[a,c,n,s,i]},{bK:"default",e:"$",c:[c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[c,e.QSM,i]},{cN:"meta",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("flix",function(e){var t={cN:"string",b:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i={cN:"string",v:[{b:'"',e:'"'}]},n={cN:"title",b:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/},c={cN:"function",bK:"def",e:/[:={\[(\n;]/,eE:!0,c:[n]};return{k:{literal:"true false",keyword:"case class def else enum if impl import in lat rel index let match namespace switch type yield with"},c:[e.CLCM,e.CBCM,t,i,c,e.CNM]}});hljs.registerLanguage("scala",function(e){var t={cN:"meta",b:"@[A-Za-z]+"},a={cN:"subst",v:[{b:"\\$[A-Za-z0-9_]+"},{b:"\\${",e:"}"}]},r={cN:"string",v:[{b:'"',e:'"',i:"\\n",c:[e.BE]},{b:'"""',e:'"""',r:10},{b:'[a-z]+"',e:'"',i:"\\n",c:[e.BE,a]},{cN:"string",b:'[a-z]+"""',e:'"""',c:[a],r:10}]},c={cN:"symbol",b:"'\\w[\\w\\d_]*(?!')"},i={cN:"type",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},s={cN:"title",b:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,r:0},n={cN:"class",bK:"class object trait type",e:/[:={\[\n;]/,eE:!0,c:[{bK:"extends with",r:10},{b:/\[/,e:/\]/,eB:!0,eE:!0,r:0,c:[i]},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,r:0,c:[i]},s]},l={cN:"function",bK:"def",e:/[:={\[(\n;]/,eE:!0,c:[s]};return{k:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},c:[e.CLCM,e.CBCM,r,c,i,l,n,e.CNM,t]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},r={cN:"literal",b:/\$(null|true|false)\b/},n={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},a={cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},i={cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]},s=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[i]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,n,a,r,o,s]}});hljs.registerLanguage("cal",function(e){var r="div mod in and or not xor asserterror begin case do downto else end exit for if of repeat then to until while with var",t="false true",c=[e.CLCM,e.C(/\{/,/\}/,{r:0}),e.C(/\(\*/,/\*\)/,{r:10})],n={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]},o={cN:"string",b:/(#\d+)+/},a={cN:"number",b:"\\b\\d+(\\.\\d+)?(DT|D|T)",r:0},i={cN:"string",b:'"',e:'"'},d={cN:"function",bK:"procedure",e:/[:;]/,k:"procedure|10",c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:r,c:[n,o]}].concat(c)},s={cN:"class",b:"OBJECT (Table|Form|Report|Dataport|Codeunit|XMLport|MenuSuite|Page|Query) (\\d+) ([^\\r\\n]+)",rB:!0,c:[e.TM,d]};return{cI:!0,k:{keyword:r,literal:t},i:/\/\*/,c:[n,o,a,i,e.NM,s,d]}});hljs.registerLanguage("openscad",function(e){var r={cN:"keyword",b:"\\$(f[asn]|t|vp[rtd]|children)"},n={cN:"literal",b:"false|true|PI|undef"},o={cN:"number",b:"\\b\\d+(\\.\\d+)?(e-?\\d+)?",r:0},i=e.inherit(e.QSM,{i:null}),t={cN:"meta",k:{"meta-keyword":"include use"},b:"include|use <",e:">"},s={cN:"params",b:"\\(",e:"\\)",c:["self",o,i,r,n]},c={b:"[*!#%]",r:0},a={cN:"function",bK:"module function",e:"\\=|\\{",c:[s,e.UTM]};return{aliases:["scad"],k:{keyword:"function module include use for intersection_for if else \\%",literal:"false true PI undef",built_in:"circle square polygon text sphere cube cylinder polyhedron translate rotate scale resize mirror multmatrix color offset hull minkowski union difference intersection abs sign sin cos tan acos asin atan atan2 floor round ceil ln log pow sqrt exp rands min max concat lookup str chr search version version_num norm cross parent_module echo import import_dxf dxf_linear_extrude linear_extrude rotate_extrude surface projection render children dxf_cross dxf_dim let assign"},c:[e.CLCM,e.CBCM,o,t,i,r,c,a]}});hljs.registerLanguage("dts",function(e){var a={cN:"string",v:[e.inherit(e.QSM,{b:'((u8?|U)|L)?"'}),{b:'(u8?|U)?R"',e:'"',c:[e.BE]},{b:"'\\\\?.",e:"'",i:"."}]},c={cN:"number",v:[{b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},{b:e.CNR}],r:0},b={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef ifdef ifndef"},c:[{b:/\\\n/,r:0},{bK:"include",e:"$",k:{"meta-keyword":"include"},c:[e.inherit(a,{cN:"meta-string"}),{cN:"meta-string",b:"<",e:">",i:"\\n"}]},a,e.CLCM,e.CBCM]},i={cN:"variable",b:"\\&[a-z\\d_]*\\b"},r={cN:"meta-keyword",b:"/[a-z][a-z\\d-]*/"},d={cN:"symbol",b:"^\\s*[a-zA-Z_][a-zA-Z\\d_]*:"},n={cN:"params",b:"<",e:">",c:[c,i]},s={cN:"class",b:/[a-zA-Z_][a-zA-Z\d_@]*\s{/,e:/[{;=]/,rB:!0,eE:!0},t={cN:"class",b:"/\\s*{",e:"};",r:10,c:[i,r,d,s,n,e.CLCM,e.CBCM,c,a]};return{k:"",c:[t,i,r,d,s,n,e.CLCM,e.CBCM,c,a,b,{b:e.IR+"::",k:""}]}});hljs.registerLanguage("sml",function(e){return{aliases:["ml"],k:{keyword:"abstype and andalso as case datatype do else end eqtype exception fn fun functor handle if in include infix infixr let local nonfix of op open orelse raise rec sharing sig signature struct structure then type val with withtype where while",built_in:"array bool char exn int list option order real ref string substring vector unit word",literal:"true false NONE SOME LESS EQUAL GREATER nil"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:/\[(\|\|)?\]|\(\)/,r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*"},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("verilog",function(e){var n={keyword:"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind bins binsof bit break buf|0 bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin function generate|5 genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import incdir include initial inout input inside instance int integer interconnect interface intersect join join_any join_none large let liblist library local localparam logic longint macromodule matches medium modport module nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 or output package packed parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor",literal:"null",built_in:"$finish $stop $exit $fatal $error $warning $info $realtime $time $printtimescale $bitstoreal $bitstoshortreal $itor $signed $cast $bits $stime $timeformat $realtobits $shortrealtobits $rtoi $unsigned $asserton $assertkill $assertpasson $assertfailon $assertnonvacuouson $assertoff $assertcontrol $assertpassoff $assertfailoff $assertvacuousoff $isunbounded $sampled $fell $changed $past_gclk $fell_gclk $changed_gclk $rising_gclk $steady_gclk $coverage_control $coverage_get $coverage_save $set_coverage_db_name $rose $stable $past $rose_gclk $stable_gclk $future_gclk $falling_gclk $changing_gclk $display $coverage_get_max $coverage_merge $get_coverage $load_coverage_db $typename $unpacked_dimensions $left $low $increment $clog2 $ln $log10 $exp $sqrt $pow $floor $ceil $sin $cos $tan $countbits $onehot $isunknown $fatal $warning $dimensions $right $high $size $asin $acos $atan $atan2 $hypot $sinh $cosh $tanh $asinh $acosh $atanh $countones $onehot0 $error $info $random $dist_chi_square $dist_erlang $dist_exponential $dist_normal $dist_poisson $dist_t $dist_uniform $q_initialize $q_remove $q_exam $async$and$array $async$nand$array $async$or$array $async$nor$array $sync$and$array $sync$nand$array $sync$or$array $sync$nor$array $q_add $q_full $psprintf $async$and$plane $async$nand$plane $async$or$plane $async$nor$plane $sync$and$plane $sync$nand$plane $sync$or$plane $sync$nor$plane $system $display $displayb $displayh $displayo $strobe $strobeb $strobeh $strobeo $write $readmemb $readmemh $writememh $value$plusargs $dumpvars $dumpon $dumplimit $dumpports $dumpportson $dumpportslimit $writeb $writeh $writeo $monitor $monitorb $monitorh $monitoro $writememb $dumpfile $dumpoff $dumpall $dumpflush $dumpportsoff $dumpportsall $dumpportsflush $fclose $fdisplay $fdisplayb $fdisplayh $fdisplayo $fstrobe $fstrobeb $fstrobeh $fstrobeo $swrite $swriteb $swriteh $swriteo $fscanf $fread $fseek $fflush $feof $fopen $fwrite $fwriteb $fwriteh $fwriteo $fmonitor $fmonitorb $fmonitorh $fmonitoro $sformat $sformatf $fgetc $ungetc $fgets $sscanf $rewind $ftell $ferror"};return{aliases:["v","sv","svh"],cI:!1,k:n,l:/[\w\$]+/,c:[e.CBCM,e.CLCM,e.QSM,{cN:"number",c:[e.BE],v:[{b:"\\b((\\d+'(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{b:"\\B(('(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{b:"\\b([0-9_])+",r:0}]},{cN:"variable",v:[{b:"#\\((?!parameter).+\\)"},{b:"\\.\\w+",r:0}]},{cN:"meta",b:"`",e:"$",k:{"meta-keyword":"define __FILE__ __LINE__ begin_keywords celldefine default_nettype define else elsif end_keywords endcelldefine endif ifdef ifndef include line nounconnected_drive pragma resetall timescale unconnected_drive undef undefineall"},r:0}]}});hljs.registerLanguage("hsp",function(e){return{cI:!0,l:/[\w\._]+/,k:"goto gosub return break repeat loop continue wait await dim sdim foreach dimtype dup dupptr end stop newmod delmod mref run exgoto on mcall assert logmes newlab resume yield onexit onerror onkey onclick oncmd exist delete mkdir chdir dirlist bload bsave bcopy memfile if else poke wpoke lpoke getstr chdpm memexpand memcpy memset notesel noteadd notedel noteload notesave randomize noteunsel noteget split strrep setease button chgdisp exec dialog mmload mmplay mmstop mci pset pget syscolor mes print title pos circle cls font sysfont objsize picload color palcolor palette redraw width gsel gcopy gzoom gmode bmpsave hsvcolor getkey listbox chkbox combox input mesbox buffer screen bgscr mouse objsel groll line clrobj boxf objprm objmode stick grect grotate gsquare gradf objimage objskip objenable celload celdiv celput newcom querycom delcom cnvstow comres axobj winobj sendmsg comevent comevarg sarrayconv callfunc cnvwtos comevdisp libptr system hspstat hspver stat cnt err strsize looplev sublev iparam wparam lparam refstr refdval int rnd strlen length length2 length3 length4 vartype gettime peek wpeek lpeek varptr varuse noteinfo instr abs limit getease str strmid strf getpath strtrim sin cos tan atan sqrt double absf expf logf limitf powf geteasef mousex mousey mousew hwnd hinstance hdc ginfo objinfo dirinfo sysinfo thismod __hspver__ __hsp30__ __date__ __time__ __line__ __file__ _debug __hspdef__ and or xor not screen_normal screen_palette screen_hide screen_fixedsize screen_tool screen_frame gmode_gdi gmode_mem gmode_rgb0 gmode_alpha gmode_rgb0alpha gmode_add gmode_sub gmode_pixela ginfo_mx ginfo_my ginfo_act ginfo_sel ginfo_wx1 ginfo_wy1 ginfo_wx2 ginfo_wy2 ginfo_vx ginfo_vy ginfo_sizex ginfo_sizey ginfo_winx ginfo_winy ginfo_mesx ginfo_mesy ginfo_r ginfo_g ginfo_b ginfo_paluse ginfo_dispx ginfo_dispy ginfo_cx ginfo_cy ginfo_intid ginfo_newid ginfo_sx ginfo_sy objinfo_mode objinfo_bmscr objinfo_hwnd notemax notesize dir_cur dir_exe dir_win dir_sys dir_cmdline dir_desktop dir_mydoc dir_tv font_normal font_bold font_italic font_underline font_strikeout font_antialias objmode_normal objmode_guifont objmode_usefont gsquare_grad msgothic msmincho do until while wend for next _break _continue switch case default swbreak swend ddim ldim alloc m_pi rad2deg deg2rad ease_linear ease_quad_in ease_quad_out ease_quad_inout ease_cubic_in ease_cubic_out ease_cubic_inout ease_quartic_in ease_quartic_out ease_quartic_inout ease_bounce_in ease_bounce_out ease_bounce_inout ease_shake_in ease_shake_out ease_shake_inout ease_loop",c:[e.CLCM,e.CBCM,e.QSM,e.ASM,{cN:"string",b:'{"',e:'"}',c:[e.BE]},e.C(";","$",{r:0}),{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"addion cfunc cmd cmpopt comfunc const defcfunc deffunc define else endif enum epack func global if ifdef ifndef include modcfunc modfunc modinit modterm module pack packopt regcmd runtime undef usecom uselib"},c:[e.inherit(e.QSM,{cN:"meta-string"}),e.NM,e.CNM,e.CLCM,e.CBCM]},{cN:"symbol",b:"^\\*(\\w+|@)"},e.NM,e.CNM]}});hljs.registerLanguage("rib",function(e){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:""}]}});hljs.registerLanguage("elixir",function(e){var r="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?",n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b="and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote",c={cN:"subst",b:"#\\{",e:"}",l:r,k:b},a={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/}]},i={cN:"function",bK:"def defp defmacro",e:/\B\b/,c:[e.inherit(e.TM,{b:r,endsParent:!0})]},l=e.inherit(i,{cN:"class",bK:"defimpl defmodule defprotocol defrecord",e:/\bdo\b|$|;/}),s=[a,e.HCM,l,i,{cN:"symbol",b:":(?!\\s)",c:[a,{b:n}],r:0},{cN:"symbol",b:r+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"->"},{b:"("+e.RSR+")\\s*",c:[e.HCM,{cN:"regexp",i:"\\n",c:[e.BE,c],v:[{b:"/",e:"/[a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];return c.c=s,{l:r,k:b,c:s}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("capnproto",function(t){return{aliases:["capnp"],k:{keyword:"struct enum interface union group import using const annotation extends in of on as with from fixed",built_in:"Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 Text Data AnyPointer AnyStruct Capability List",literal:"true false"},c:[t.QSM,t.NM,t.HCM,{cN:"meta",b:/@0x[\w\d]{16};/,i:/\n/},{cN:"symbol",b:/@\d+\b/},{cN:"class",bK:"struct enum",e:/\{/,i:/\n/,c:[t.inherit(t.TM,{starts:{eW:!0,eE:!0}})]},{cN:"class",bK:"interface",e:/\{/,i:/\n/,c:[t.inherit(t.TM,{starts:{eW:!0,eE:!0}})]}]}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("oxygene",function(e){var r="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained",t=e.C("{","}",{r:0}),a=e.C("\\(\\*","\\*\\)",{r:10}),n={cN:"string",b:"'",e:"'",c:[{b:"''"}]},o={cN:"string",b:"(#\\d+)+"},i={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[e.TM,{cN:"params",b:"\\(",e:"\\)",k:r,c:[n,o]},t,a]};return{cI:!0,l:/\.?\w+/,k:r,i:'("|\\$[G-Zg-z]|\\/\\*||->)',c:[t,a,e.CLCM,n,o,e.NM,i,{cN:"class",b:"=\\bclass\\b",e:"end;",k:r,c:[n,o,t,a,e.CLCM,i]}]}});hljs.registerLanguage("autoit",function(e){var t="ByRef Case Const ContinueCase ContinueLoop Default Dim Do Else ElseIf EndFunc EndIf EndSelect EndSwitch EndWith Enum Exit ExitLoop For Func Global If In Local Next ReDim Return Select Static Step Switch Then To Until Volatile WEnd While With",r="True False And Null Not Or",i="Abs ACos AdlibRegister AdlibUnRegister Asc AscW ASin Assign ATan AutoItSetOption AutoItWinGetTitle AutoItWinSetTitle Beep Binary BinaryLen BinaryMid BinaryToString BitAND BitNOT BitOR BitRotate BitShift BitXOR BlockInput Break Call CDTray Ceiling Chr ChrW ClipGet ClipPut ConsoleRead ConsoleWrite ConsoleWriteError ControlClick ControlCommand ControlDisable ControlEnable ControlFocus ControlGetFocus ControlGetHandle ControlGetPos ControlGetText ControlHide ControlListView ControlMove ControlSend ControlSetText ControlShow ControlTreeView Cos Dec DirCopy DirCreate DirGetSize DirMove DirRemove DllCall DllCallAddress DllCallbackFree DllCallbackGetPtr DllCallbackRegister DllClose DllOpen DllStructCreate DllStructGetData DllStructGetPtr DllStructGetSize DllStructSetData DriveGetDrive DriveGetFileSystem DriveGetLabel DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus EnvGet EnvSet EnvUpdate Eval Execute Exp FileChangeDir FileClose FileCopy FileCreateNTFSLink FileCreateShortcut FileDelete FileExists FileFindFirstFile FileFindNextFile FileFlush FileGetAttrib FileGetEncoding FileGetLongName FileGetPos FileGetShortcut FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall FileMove FileOpen FileOpenDialog FileRead FileReadLine FileReadToArray FileRecycle FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib FileSetEnd FileSetPos FileSetTime FileWrite FileWriteLine Floor FtpSetProxy FuncName GUICreate GUICtrlCreateAvi GUICtrlCreateButton GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit GUICtrlCreateGraphic GUICtrlCreateGroup GUICtrlCreateIcon GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu GUICtrlCreateMenuItem GUICtrlCreateMonthCal GUICtrlCreateObj GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem GUICtrlCreateTreeView GUICtrlCreateTreeViewItem GUICtrlCreateUpdown GUICtrlDelete GUICtrlGetHandle GUICtrlGetState GUICtrlRead GUICtrlRecvMsg GUICtrlRegisterListViewSort GUICtrlSendMsg GUICtrlSendToDummy GUICtrlSetBkColor GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetDefBkColor GUICtrlSetDefColor GUICtrlSetFont GUICtrlSetGraphic GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle GUICtrlSetTip GUIDelete GUIGetCursorInfo GUIGetMsg GUIGetStyle GUIRegisterMsg GUISetAccelerators GUISetBkColor GUISetCoord GUISetCursor GUISetFont GUISetHelp GUISetIcon GUISetOnEvent GUISetState GUISetStyle GUIStartGroup GUISwitch Hex HotKeySet HttpSetProxy HttpSetUserAgent HWnd InetClose InetGet InetGetInfo InetGetSize InetRead IniDelete IniRead IniReadSection IniReadSectionNames IniRenameSection IniWrite IniWriteSection InputBox Int IsAdmin IsArray IsBinary IsBool IsDeclared IsDllStruct IsFloat IsFunc IsHWnd IsInt IsKeyword IsNumber IsObj IsPtr IsString Log MemGetStats Mod MouseClick MouseClickDrag MouseDown MouseGetCursor MouseGetPos MouseMove MouseUp MouseWheel MsgBox Number ObjCreate ObjCreateInterface ObjEvent ObjGet ObjName OnAutoItExitRegister OnAutoItExitUnRegister Ping PixelChecksum PixelGetColor PixelSearch ProcessClose ProcessExists ProcessGetStats ProcessList ProcessSetPriority ProcessWait ProcessWaitClose ProgressOff ProgressOn ProgressSet Ptr Random RegDelete RegEnumKey RegEnumVal RegRead RegWrite Round Run RunAs RunAsWait RunWait Send SendKeepActive SetError SetExtended ShellExecute ShellExecuteWait Shutdown Sin Sleep SoundPlay SoundSetWaveVolume SplashImageOn SplashOff SplashTextOn Sqrt SRandom StatusbarGetText StderrRead StdinWrite StdioClose StdoutRead String StringAddCR StringCompare StringFormat StringFromASCIIArray StringInStr StringIsAlNum StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft StringLen StringLower StringMid StringRegExp StringRegExpReplace StringReplace StringReverse StringRight StringSplit StringStripCR StringStripWS StringToASCIIArray StringToBinary StringTrimLeft StringTrimRight StringUpper Tan TCPAccept TCPCloseSocket TCPConnect TCPListen TCPNameToIP TCPRecv TCPSend TCPShutdown, UDPShutdown TCPStartup, UDPStartup TimerDiff TimerInit ToolTip TrayCreateItem TrayCreateMenu TrayGetMsg TrayItemDelete TrayItemGetHandle TrayItemGetState TrayItemGetText TrayItemSetOnEvent TrayItemSetState TrayItemSetText TraySetClick TraySetIcon TraySetOnEvent TraySetPauseIcon TraySetState TraySetToolTip TrayTip UBound UDPBind UDPCloseSocket UDPOpen UDPRecv UDPSend VarGetType WinActivate WinActive WinClose WinExists WinFlash WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait",l={v:[e.C(";","$",{r:0}),e.C("#cs","#ce"),e.C("#comments-start","#comments-end")]},n={b:"\\$[A-z0-9_]+"},o={cN:"string",v:[{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]},a={v:[e.BNM,e.CNM]},S={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"comments include include-once NoTrayIcon OnAutoItStartRegister pragma compile RequireAdmin"},c:[{b:/\\\n/,r:0},{bK:"include",k:{"meta-keyword":"include"},e:"$",c:[o,{cN:"meta-string",v:[{b:"<",e:">"},{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]}]},o,l]},C={cN:"symbol",b:"@[A-z0-9_]+"},s={cN:"function",bK:"Func",e:"$",i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:[n,o,a]}]};return{cI:!0,i:/\/\*/,k:{keyword:t,built_in:i,literal:r},c:[l,n,o,a,S,C,s]}});hljs.registerLanguage("axapta",function(e){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM,{cN:"meta",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",eE:!0,i:":",c:[{bK:"extends implements"},e.UTM]}]}});hljs.registerLanguage("qml",function(r){var e={keyword:"in of on if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await import",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Behavior bool color coordinate date double enumeration font geocircle georectangle geoshape int list matrix4x4 parent point quaternion real rect size string url var variant vector2d vector3d vector4dPromise"},t="[a-zA-Z_][a-zA-Z0-9\\._]*",a={cN:"keyword",b:"\\bproperty\\b",starts:{cN:"string",e:"(:|=|;|,|//|/\\*|$)",rE:!0}},n={cN:"keyword",b:"\\bsignal\\b",starts:{cN:"string",e:"(\\(|:|=|;|,|//|/\\*|$)",rE:!0}},o={cN:"attribute",b:"\\bid\\s*:",starts:{cN:"string",e:t,rE:!1}},i={b:t+"\\s*:",rB:!0,c:[{cN:"attribute",b:t,e:"\\s*:",eE:!0,r:0}],r:0},c={b:t+"\\s*{",e:"{",rB:!0,r:0,c:[r.inherit(r.TM,{b:t})]};return{aliases:["qt"],cI:!1,k:e,c:[{cN:"meta",b:/^\s*['"]use (strict|asm)['"]/},r.ASM,r.QSM,{cN:"string",b:"`",e:"`",c:[r.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},r.CLCM,r.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:r.CNR}],r:0},{b:"("+r.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[r.CLCM,r.CBCM,r.RM,{b:/\s*[);\]]/,r:0,sL:"xml"}],r:0},n,a,{cN:"function",bK:"function",e:/\{/,eE:!0,c:[r.inherit(r.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[r.CLCM,r.CBCM]}],i:/\[|%/},{b:"\\."+r.IR,r:0},o,i,c],i:/#/}});hljs.registerLanguage("subunit",function(s){var r={cN:"string",b:"\\[\n(multipart)?",e:"\\]\n"},t={cN:"string",b:"\\d{4}-\\d{2}-\\d{2}(\\s+)\\d{2}:\\d{2}:\\d{2}.\\d+Z"},e={cN:"string",b:"(\\+|-)\\d+"},c={cN:"keyword",r:10,v:[{b:"^(test|testing|success|successful|failure|error|skip|xfail|uxsuccess)(:?)\\s+(test)?"},{b:"^progress(:?)(\\s+)?(pop|push)?"},{b:"^tags:"},{b:"^time:"}]};return{cI:!0,c:[r,t,e,c]}});hljs.registerLanguage("vala",function(t){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object Gtk Posix",literal:"false true null"},c:[{cN:"class",bK:"class interface namespace",e:"{",eE:!0,i:"[^,:\\n\\s\\.]",c:[t.UTM]},t.CLCM,t.CBCM,{cN:"string",b:'"""',e:'"""',r:5},t.ASM,t.QSM,t.CNM,{cN:"meta",b:"^#",e:"$",r:2}]}});hljs.registerLanguage("hy",function(e){var t={"builtin-name":"!= % %= & &= * ** **= *= *map + += , --build-class-- --import-- -= . / // //= /= < << <<= <= = > >= >> >>= @ @= ^ ^= abs accumulate all and any ap-compose ap-dotimes ap-each ap-each-while ap-filter ap-first ap-if ap-last ap-map ap-map-when ap-pipe ap-reduce ap-reject apply as-> ascii assert assoc bin break butlast callable calling-module-name car case cdr chain chr coll? combinations compile compress cond cons cons? continue count curry cut cycle dec def default-method defclass defmacro defmacro-alias defmacro/g! defmain defmethod defmulti defn defn-alias defnc defnr defreader defseq del delattr delete-route dict-comp dir disassemble dispatch-reader-macro distinct divmod do doto drop drop-last drop-while empty? end-sequence eval eval-and-compile eval-when-compile even? every? except exec filter first flatten float? fn fnc fnr for for* format fraction genexpr gensym get getattr global globals group-by hasattr hash hex id identity if if* if-not if-python2 import in inc input instance? integer integer-char? integer? interleave interpose is is-coll is-cons is-empty is-even is-every is-float is-instance is-integer is-integer-char is-iterable is-iterator is-keyword is-neg is-none is-not is-numeric is-odd is-pos is-string is-symbol is-zero isinstance islice issubclass iter iterable? iterate iterator? keyword keyword? lambda last len let lif lif-not list* list-comp locals loop macro-error macroexpand macroexpand-1 macroexpand-all map max merge-with method-decorator min multi-decorator multicombinations name neg? next none? nonlocal not not-in not? nth numeric? oct odd? open or ord partition permutations pos? post-route postwalk pow prewalk print product profile/calls profile/cpu put-route quasiquote quote raise range read read-str recursive-replace reduce remove repeat repeatedly repr require rest round route route-with-methods rwm second seq set-comp setattr setv some sorted string string? sum switch symbol? take take-nth take-while tee try unless unquote unquote-splicing vars walk when while with with* with-decorator with-gensyms xi xor yield yield-from zero? zip zip-longest | |= ~"},i="a-zA-Z_\\-!.?+*=<>&#'",a="["+i+"]["+i+"0-9/;:]*",r="[-+]?\\d+(\\.\\d+)?",o={cN:"meta",b:"^#!",e:"$"},s={b:a,r:0},n={cN:"number",b:r,r:0},l=e.inherit(e.QSM,{i:null}),c=e.C(";","$",{r:0}),d={cN:"literal",b:/\b([Tt]rue|[Ff]alse|nil|None)\b/},p={b:"[\\[\\{]",e:"[\\]\\}]"},m={cN:"comment",b:"\\^"+a},u=e.C("\\^\\{","\\}"),f={cN:"symbol",b:"[:]{1,2}"+a},h={b:"\\(",e:"\\)"},b={eW:!0,r:0},g={k:t,l:a,cN:"name",b:a,starts:b},y=[h,l,m,u,c,f,p,n,d,s];return h.c=[e.C("comment",""),g,b],b.c=y,p.c=y,{aliases:["hylang"],i:/\S/,c:[o,h,l,m,u,c,f,p,n,d]}});hljs.registerLanguage("glsl",function(e){return{k:{keyword:"break continue discard do else for if return while switch case default attribute binding buffer ccw centroid centroid varying coherent column_major const cw depth_any depth_greater depth_less depth_unchanged early_fragment_tests equal_spacing flat fractional_even_spacing fractional_odd_spacing highp in index inout invariant invocations isolines layout line_strip lines lines_adjacency local_size_x local_size_y local_size_z location lowp max_vertices mediump noperspective offset origin_upper_left out packed patch pixel_center_integer point_mode points precise precision quads r11f_g11f_b10f r16 r16_snorm r16f r16i r16ui r32f r32i r32ui r8 r8_snorm r8i r8ui readonly restrict rg16 rg16_snorm rg16f rg16i rg16ui rg32f rg32i rg32ui rg8 rg8_snorm rg8i rg8ui rgb10_a2 rgb10_a2ui rgba16 rgba16_snorm rgba16f rgba16i rgba16ui rgba32f rgba32i rgba32ui rgba8 rgba8_snorm rgba8i rgba8ui row_major sample shared smooth std140 std430 stream triangle_strip triangles triangles_adjacency uniform varying vertices volatile writeonly",type:"atomic_uint bool bvec2 bvec3 bvec4 dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 double dvec2 dvec3 dvec4 float iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBufferiimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray int isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow image1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D samplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 vec2 vec3 vec4 void",built_in:"gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxComputeAtomicCounterBuffers gl_MaxComputeAtomicCounters gl_MaxComputeImageUniforms gl_MaxComputeTextureImageUnits gl_MaxComputeUniformComponents gl_MaxComputeWorkGroupCount gl_MaxComputeWorkGroupSize gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentInputVectors gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexOutputVectors gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_GlobalInvocationID gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_LocalInvocationID gl_LocalInvocationIndex gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_NumSamples gl_NumWorkGroups gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrix gl_TextureMatrixInverse gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_WorkGroupID gl_WorkGroupSize gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicAdd atomicAnd atomicCompSwap atomicCounter atomicCounterDecrement atomicCounterIncrement atomicExchange atomicMax atomicMin atomicOr atomicXor barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual groupMemoryBarrier imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageSize imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier memoryBarrierAtomicCounter memoryBarrierBuffer memoryBarrierImage memoryBarrierShared min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLevels textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow",literal:"true false"},i:'"',c:[e.CLCM,e.CBCM,e.CNM,{cN:"meta",b:"#",e:"$"}]}});hljs.registerLanguage("pf",function(t){var o={cN:"variable",b:/\$[\w\d#@][\w\d_]*/},e={cN:"variable",b:/<(?!\/)/,e:/>/};return{aliases:["pf.conf"],l:/[a-z0-9_<>-]+/,k:{built_in:"block match pass load anchor|5 antispoof|10 set table",keyword:"in out log quick on rdomain inet inet6 proto from port os to routeallow-opts divert-packet divert-reply divert-to flags group icmp-typeicmp6-type label once probability recieved-on rtable prio queuetos tag tagged user keep fragment for os dropaf-to|10 binat-to|10 nat-to|10 rdr-to|10 bitmask least-stats random round-robinsource-hash static-portdup-to reply-to route-toparent bandwidth default min max qlimitblock-policy debug fingerprints hostid limit loginterface optimizationreassemble ruleset-optimization basic none profile skip state-defaultsstate-policy timeoutconst counters persistno modulate synproxy state|5 floating if-bound no-sync pflow|10 sloppysource-track global rule max-src-nodes max-src-states max-src-connmax-src-conn-rate overload flushscrub|5 max-mss min-ttl no-df|10 random-id",literal:"all any no-route self urpf-failed egress|5 unknown"},c:[t.HCM,t.NM,t.QSM,o,e]}});hljs.registerLanguage("vbnet",function(e){return{aliases:["vb"],cI:!0,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C("'","$",{rB:!0,c:[{cN:"doctag",b:"'''|",c:[e.PWM]},{cN:"doctag",b:"",c:[e.PWM]}]}),e.CNM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elseif end region externalsource"}}]}});hljs.registerLanguage("coq",function(e){return{k:{keyword:"_ as at cofix else end exists exists2 fix for forall fun if IF in let match mod Prop return Set then Type using where with Abort About Add Admit Admitted All Arguments Assumptions Axiom Back BackTo Backtrack Bind Blacklist Canonical Cd Check Class Classes Close Coercion Coercions CoFixpoint CoInductive Collection Combined Compute Conjecture Conjectures Constant constr Constraint Constructors Context Corollary CreateHintDb Cut Declare Defined Definition Delimit Dependencies DependentDerive Drop eauto End Equality Eval Example Existential Existentials Existing Export exporting Extern Extract Extraction Fact Field Fields File Fixpoint Focus for From Function Functional Generalizable Global Goal Grab Grammar Graph Guarded Heap Hint HintDb Hints Hypotheses Hypothesis ident Identity If Immediate Implicit Import Include Inductive Infix Info Initial Inline Inspect Instance Instances Intro Intros Inversion Inversion_clear Language Left Lemma Let Libraries Library Load LoadPath Local Locate Ltac ML Mode Module Modules Monomorphic Morphism Next NoInline Notation Obligation Obligations Opaque Open Optimize Options Parameter Parameters Parametric Path Paths pattern Polymorphic Preterm Print Printing Program Projections Proof Proposition Pwd Qed Quit Rec Record Recursive Redirect Relation Remark Remove Require Reserved Reset Resolve Restart Rewrite Right Ring Rings Save Scheme Scope Scopes Script Search SearchAbout SearchHead SearchPattern SearchRewrite Section Separate Set Setoid Show Solve Sorted Step Strategies Strategy Structure SubClass Table Tables Tactic Term Test Theorem Time Timeout Transparent Type Typeclasses Types Undelimit Undo Unfocus Unfocused Unfold Universe Universes Unset Unshelve using Variable Variables Variant Verbose Visibility where with",built_in:"abstract absurd admit after apply as assert assumption at auto autorewrite autounfold before bottom btauto by case case_eq cbn cbv change classical_left classical_right clear clearbody cofix compare compute congruence constr_eq constructor contradict contradiction cut cutrewrite cycle decide decompose dependent destruct destruction dintuition discriminate discrR do double dtauto eapply eassumption eauto ecase econstructor edestruct ediscriminate eelim eexact eexists einduction einjection eleft elim elimtype enough equality erewrite eright esimplify_eq esplit evar exact exactly_once exfalso exists f_equal fail field field_simplify field_simplify_eq first firstorder fix fold fourier functional generalize generalizing gfail give_up has_evar hnf idtac in induction injection instantiate intro intro_pattern intros intuition inversion inversion_clear is_evar is_var lapply lazy left lia lra move native_compute nia nsatz omega once pattern pose progress proof psatz quote record red refine reflexivity remember rename repeat replace revert revgoals rewrite rewrite_strat right ring ring_simplify rtauto set setoid_reflexivity setoid_replace setoid_rewrite setoid_symmetry setoid_transitivity shelve shelve_unifiable simpl simple simplify_eq solve specialize split split_Rabs split_Rmult stepl stepr subst sum swap symmetry tactic tauto time timeout top transitivity trivial try tryif unfold unify until using vm_compute with"},c:[e.QSM,e.C("\\(\\*","\\*\\)"),e.CNM,{cN:"type",eB:!0,b:"\\|\\s*",e:"\\w+"},{b:/[-=]>/}]}}); + +/* highlightjs-line-numbers.js 2.6.0 | (C) 2018 Yauheni Pakala | MIT License | github.com/wcoder/highlightjs-line-numbers.js */ +!function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=g(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[v,L,b]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"interactive"===e.readyState||"complete"===e.readyState?i(t):n.addEventListener("DOMContentLoaded",function(){i(t)})}function i(t){try{var r=e.querySelectorAll("code.hljs,code.nohighlight");for(var i in r)r.hasOwnProperty(i)&&l(r[i],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function l(n,e){"object"==typeof n&&f(function(){n.innerHTML=s(n,e)})}function o(n,e){if("string"==typeof n){var t=document.createElement("code");return t.innerHTML=n,s(t,e)}}function s(n,e){e=e||{singleLine:!1};var t=e.singleLine?0:1;return c(n),a(n.innerHTML,t)}function a(n,e){var t=u(n);if(""===t[t.length-1].trim()&&t.pop(),t.length>e){for(var r="",i=0,l=t.length;i
    {6}
    ',[j,m,L,b,p,i+1,t[i].length>0?t[i]:" "]);return g('{1}
    ',[v,r])}return n}function c(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];h(r.textContent)>0&&(r.childNodes.length>0?c(r):d(r.parentNode))}}function d(n){var e=n.className;if(/hljs-/.test(e)){for(var t=u(n.innerHTML),r=0,i="";r0?t[r]:" ";i+=g('{1}\n',[e,l])}n.innerHTML=i.trim()}}function u(n){return 0===n.length?[]:n.split(y)}function h(n){return(n.trim().match(y)||[]).length}function f(e){n.setTimeout(e,0)}function g(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var v="hljs-ln",m="hljs-ln-line",p="hljs-ln-code",j="hljs-ln-numbers",L="hljs-ln-n",b="data-line-number",y=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=l,n.hljs.lineNumbersValue=o,t()):n.console.error("highlight.js not detected!")}(window,document); + +/** + * This reveal.js plugin is wrapper around the highlight.js + * syntax highlighting library. + */ +(function( root, factory ) { + if (typeof define === 'function' && define.amd) { + root.RevealHighlight = factory(); + } else if( typeof exports === 'object' ) { + module.exports = factory(); + } else { + // Browser globals (root is window) + root.RevealHighlight = factory(); + } +}( this, function() { + + // Function to perform a better "data-trim" on code snippets + // Will slice an indentation amount on each line of the snippet (amount based on the line having the lowest indentation length) + function betterTrim(snippetEl) { + // Helper functions + function trimLeft(val) { + // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill + return val.replace(/^[\s\uFEFF\xA0]+/g, ''); + } + function trimLineBreaks(input) { + var lines = input.split('\n'); + + // Trim line-breaks from the beginning + for (var i = 0; i < lines.length; i++) { + if (lines[i].trim() === '') { + lines.splice(i--, 1); + } else break; + } + + // Trim line-breaks from the end + for (var i = lines.length-1; i >= 0; i--) { + if (lines[i].trim() === '') { + lines.splice(i, 1); + } else break; + } + + return lines.join('\n'); + } + + // Main function for betterTrim() + return (function(snippetEl) { + var content = trimLineBreaks(snippetEl.innerHTML); + var lines = content.split('\n'); + // Calculate the minimum amount to remove on each line start of the snippet (can be 0) + var pad = lines.reduce(function(acc, line) { + if (line.length > 0 && trimLeft(line).length > 0 && acc > line.length - trimLeft(line).length) { + return line.length - trimLeft(line).length; + } + return acc; + }, Number.POSITIVE_INFINITY); + // Slice each line with this amount + return lines.map(function(line, index) { + return line.slice(pad); + }) + .join('\n'); + })(snippetEl); + } + + var RevealHighlight = { + init: function() { + + // Read the plugin config options and provide fallbacks + var config = Reveal.getConfig().highlight || {}; + config.highlightOnLoad = typeof config.highlightOnLoad === 'boolean' ? config.highlightOnLoad : true; + config.escapeHTML = typeof config.escapeHTML === 'boolean' ? config.escapeHTML : true; + + [].slice.call( document.querySelectorAll( '.reveal pre code' ) ).forEach( function( block ) { + + // Trim whitespace if the "data-trim" attribute is present + if( block.hasAttribute( 'data-trim' ) && typeof block.innerHTML.trim === 'function' ) { + block.innerHTML = betterTrim( block ); + } + + // Escape HTML tags unless the "data-noescape" attrbute is present + if( config.escapeHTML && !block.hasAttribute( 'data-noescape' )) { + block.innerHTML = block.innerHTML.replace( //g, '>' ); + } + + // Re-highlight when focus is lost (for contenteditable code) + block.addEventListener( 'focusout', function( event ) { + hljs.highlightBlock( event.currentTarget ); + }, false ); + + if( config.highlightOnLoad ) { + RevealHighlight.highlightBlock( block ); + } + } ); + + }, + + /** + * Highlights a code block. If the node has the + * 'data-line-numbers' attribute we also generate slide + * numbers. + */ + highlightBlock: function( block ) { + + hljs.highlightBlock( block ); + + if( block.hasAttribute( 'data-line-numbers' ) ) { + hljs.lineNumbersBlock( block, { singleLine: true } ); + + // hljs.lineNumbersBlock runs async code on the next cycle, + // so we need to do the same to execute after it's done + setTimeout( RevealHighlight.highlightLines.bind( this, block ), 0 ); + } + + }, + + /** + * Visually emphasize specific lines within a code block. + * This only works on blocks with line numbering turned on. + * + * @param {HTMLElement} block a block + * @param {String} [linesToHighlight] The lines that should be + * highlighted in this format: + * "1" = highlights line 1 + * "2,5" = highlights lines 2 & 5 + * "2,5-7" = highlights lines 2, 5, 6 & 7 + */ + highlightLines: function( block, linesToHighlight ) { + + linesToHighlight = linesToHighlight || block.getAttribute( 'data-line-numbers' ); + + if( typeof linesToHighlight === 'string' && linesToHighlight !== '' ) { + + linesToHighlight.split( ',' ).forEach( function( lineNumbers ) { + + // Avoid failures becase of whitespace + lineNumbers = lineNumbers.replace( /\s/g, '' ); + + // Ensure that we looking at a valid slide number (1 or 1-2) + if( /^[\d-]+$/.test( lineNumbers ) ) { + + lineNumbers = lineNumbers.split( '-' ); + + var lineStart = lineNumbers[0]; + var lineEnd = lineNumbers[1] || lineStart; + + [].slice.call( block.querySelectorAll( 'table tr:nth-child(n+'+lineStart+'):nth-child(-n+'+lineEnd+')' ) ).forEach( function( lineElement ) { + lineElement.classList.add( 'highlight-line' ); + } ); + + } + + } ); + + } + + } + } + + Reveal.registerPlugin( 'highlight', RevealHighlight ); + + return RevealHighlight; + +})); \ No newline at end of file diff --git a/yknjs/reveal.js/plugin/markdown/example.html b/yknjs/reveal.js/plugin/markdown/example.html new file mode 100644 index 0000000..0904fbb --- /dev/null +++ b/yknjs/reveal.js/plugin/markdown/example.html @@ -0,0 +1,134 @@ + + + + + + + reveal.js - Markdown Demo + + + + + + + + + +
    + +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    +
    + + + + + + + diff --git a/yknjs/reveal.js/plugin/markdown/example.md b/yknjs/reveal.js/plugin/markdown/example.md new file mode 100644 index 0000000..89c7534 --- /dev/null +++ b/yknjs/reveal.js/plugin/markdown/example.md @@ -0,0 +1,36 @@ +# Markdown Demo + + + +## External 1.1 + +Content 1.1 + +Note: This will only appear in the speaker notes window. + + +## External 1.2 + +Content 1.2 + + + +## External 2 + +Content 2.1 + + + +## External 3.1 + +Content 3.1 + + +## External 3.2 + +Content 3.2 + + +## External 3.3 + +![External Image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png) diff --git a/yknjs/reveal.js/plugin/markdown/markdown.js b/yknjs/reveal.js/plugin/markdown/markdown.js new file mode 100755 index 0000000..c641d81 --- /dev/null +++ b/yknjs/reveal.js/plugin/markdown/markdown.js @@ -0,0 +1,446 @@ +/** + * The reveal.js markdown plugin. Handles parsing of + * markdown inside of presentations as well as loading + * of external markdown documents. + */ +(function( root, factory ) { + if (typeof define === 'function' && define.amd) { + root.marked = require( './marked' ); + root.RevealMarkdown = factory( root.marked ); + } else if( typeof exports === 'object' ) { + module.exports = factory( require( './marked' ) ); + } else { + // Browser globals (root is window) + root.RevealMarkdown = factory( root.marked ); + } +}( this, function( marked ) { + + var DEFAULT_SLIDE_SEPARATOR = '^\r?\n---\r?\n$', + DEFAULT_NOTES_SEPARATOR = 'notes?:', + DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$', + DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$'; + + var SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__'; + + + /** + * Retrieves the markdown contents of a slide section + * element. Normalizes leading tabs/whitespace. + */ + function getMarkdownFromSlide( section ) { + + // look for a ' ); + + var leadingWs = text.match( /^\n?(\s*)/ )[1].length, + leadingTabs = text.match( /^\n?(\t*)/ )[1].length; + + if( leadingTabs > 0 ) { + text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); + } + else if( leadingWs > 1 ) { + text = text.replace( new RegExp('\\n? {' + leadingWs + '}', 'g'), '\n' ); + } + + return text; + + } + + /** + * Given a markdown slide section element, this will + * return all arguments that aren't related to markdown + * parsing. Used to forward any other user-defined arguments + * to the output markdown slide. + */ + function getForwardedAttributes( section ) { + + var attributes = section.attributes; + var result = []; + + for( var i = 0, len = attributes.length; i < len; i++ ) { + var name = attributes[i].name, + value = attributes[i].value; + + // disregard attributes that are used for markdown loading/parsing + if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue; + + if( value ) { + result.push( name + '="' + value + '"' ); + } + else { + result.push( name ); + } + } + + return result.join( ' ' ); + + } + + /** + * Inspects the given options and fills out default + * values for what's not defined. + */ + function getSlidifyOptions( options ) { + + options = options || {}; + options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR; + options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR; + options.attributes = options.attributes || ''; + + return options; + + } + + /** + * Helper function for constructing a markdown slide. + */ + function createMarkdownSlide( content, options ) { + + options = getSlidifyOptions( options ); + + var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) ); + + if( notesMatch.length === 2 ) { + content = notesMatch[0] + ''; + } + + // prevent script end tags in the content from interfering + // with parsing + content = content.replace( /<\/script>/g, SCRIPT_END_PLACEHOLDER ); + + return ''; + + } + + /** + * Parses a data string into multiple slides based + * on the passed in separator arguments. + */ + function slidify( markdown, options ) { + + options = getSlidifyOptions( options ); + + var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ), + horizontalSeparatorRegex = new RegExp( options.separator ); + + var matches, + lastIndex = 0, + isHorizontal, + wasHorizontal = true, + content, + sectionStack = []; + + // iterate until all blocks between separators are stacked up + while( matches = separatorRegex.exec( markdown ) ) { + notes = null; + + // determine direction (horizontal by default) + isHorizontal = horizontalSeparatorRegex.test( matches[0] ); + + if( !isHorizontal && wasHorizontal ) { + // create vertical stack + sectionStack.push( [] ); + } + + // pluck slide content from markdown input + content = markdown.substring( lastIndex, matches.index ); + + if( isHorizontal && wasHorizontal ) { + // add to horizontal stack + sectionStack.push( content ); + } + else { + // add to vertical stack + sectionStack[sectionStack.length-1].push( content ); + } + + lastIndex = separatorRegex.lastIndex; + wasHorizontal = isHorizontal; + } + + // add the remaining slide + ( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) ); + + var markdownSections = ''; + + // flatten the hierarchical stack, and insert
    tags + for( var i = 0, len = sectionStack.length; i < len; i++ ) { + // vertical + if( sectionStack[i] instanceof Array ) { + markdownSections += '
    '; + + sectionStack[i].forEach( function( child ) { + markdownSections += '
    ' + createMarkdownSlide( child, options ) + '
    '; + } ); + + markdownSections += '
    '; + } + else { + markdownSections += '
    ' + createMarkdownSlide( sectionStack[i], options ) + '
    '; + } + } + + return markdownSections; + + } + + /** + * Parses any current data-markdown slides, splits + * multi-slide markdown into separate sections and + * handles loading of external markdown. + */ + function processSlides() { + + return new Promise( function( resolve ) { + + var externalPromises = []; + + [].slice.call( document.querySelectorAll( '[data-markdown]') ).forEach( function( section, i ) { + + if( section.getAttribute( 'data-markdown' ).length ) { + + externalPromises.push( loadExternalMarkdown( section ).then( + + // Finished loading external file + function( xhr, url ) { + section.outerHTML = slidify( xhr.responseText, { + separator: section.getAttribute( 'data-separator' ), + verticalSeparator: section.getAttribute( 'data-separator-vertical' ), + notesSeparator: section.getAttribute( 'data-separator-notes' ), + attributes: getForwardedAttributes( section ) + }); + }, + + // Failed to load markdown + function( xhr, url ) { + section.outerHTML = '
    ' + + 'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' + + 'Check your browser\'s JavaScript console for more details.' + + '

    Remember that you need to serve the presentation HTML from a HTTP server.

    ' + + '
    '; + } + + ) ); + + } + else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-separator-vertical' ) || section.getAttribute( 'data-separator-notes' ) ) { + + section.outerHTML = slidify( getMarkdownFromSlide( section ), { + separator: section.getAttribute( 'data-separator' ), + verticalSeparator: section.getAttribute( 'data-separator-vertical' ), + notesSeparator: section.getAttribute( 'data-separator-notes' ), + attributes: getForwardedAttributes( section ) + }); + + } + else { + section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) ); + } + + }); + + Promise.all( externalPromises ).then( resolve ); + + } ); + + } + + function loadExternalMarkdown( section ) { + + return new Promise( function( resolve, reject ) { + + var xhr = new XMLHttpRequest(), + url = section.getAttribute( 'data-markdown' ); + + datacharset = section.getAttribute( 'data-charset' ); + + // see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes + if( datacharset != null && datacharset != '' ) { + xhr.overrideMimeType( 'text/html; charset=' + datacharset ); + } + + xhr.onreadystatechange = function( section, xhr ) { + if( xhr.readyState === 4 ) { + // file protocol yields status code 0 (useful for local debug, mobile applications etc.) + if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) { + + resolve( xhr, url ); + + } + else { + + reject( xhr, url ); + + } + } + }.bind( this, section, xhr ); + + xhr.open( 'GET', url, true ); + + try { + xhr.send(); + } + catch ( e ) { + alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e ); + resolve( xhr, url ); + } + + } ); + + } + + /** + * Check if a node value has the attributes pattern. + * If yes, extract it and add that value as one or several attributes + * to the target element. + * + * You need Cache Killer on Chrome to see the effect on any FOM transformation + * directly on refresh (F5) + * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277 + */ + function addAttributeInElement( node, elementTarget, separator ) { + + var mardownClassesInElementsRegex = new RegExp( separator, 'mg' ); + var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' ); + var nodeValue = node.nodeValue; + if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) { + + var classes = matches[1]; + nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex ); + node.nodeValue = nodeValue; + while( matchesClass = mardownClassRegex.exec( classes ) ) { + elementTarget.setAttribute( matchesClass[1], matchesClass[2] ); + } + return true; + } + return false; + } + + /** + * Add attributes to the parent element of a text node, + * or the element of an attribute node. + */ + function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) { + + if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) { + previousParentElement = element; + for( var i = 0; i < element.childNodes.length; i++ ) { + childElement = element.childNodes[i]; + if ( i > 0 ) { + j = i - 1; + while ( j >= 0 ) { + aPreviousChildElement = element.childNodes[j]; + if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) { + previousParentElement = aPreviousChildElement; + break; + } + j = j - 1; + } + } + parentSection = section; + if( childElement.nodeName == "section" ) { + parentSection = childElement ; + previousParentElement = childElement ; + } + if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) { + addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes ); + } + } + } + + if ( element.nodeType == Node.COMMENT_NODE ) { + if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) { + addAttributeInElement( element, section, separatorSectionAttributes ); + } + } + } + + /** + * Converts any current data-markdown slides in the + * DOM to HTML. + */ + function convertSlides() { + + var sections = document.querySelectorAll( '[data-markdown]:not([data-markdown-parsed])'); + + [].slice.call( sections ).forEach( function( section ) { + + section.setAttribute( 'data-markdown-parsed', true ) + + var notes = section.querySelector( 'aside.notes' ); + var markdown = getMarkdownFromSlide( section ); + + section.innerHTML = marked( markdown ); + addAttributes( section, section, null, section.getAttribute( 'data-element-attributes' ) || + section.parentNode.getAttribute( 'data-element-attributes' ) || + DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR, + section.getAttribute( 'data-attributes' ) || + section.parentNode.getAttribute( 'data-attributes' ) || + DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR); + + // If there were notes, we need to re-add them after + // having overwritten the section's HTML + if( notes ) { + section.appendChild( notes ); + } + + } ); + + return Promise.resolve(); + + } + + // API + var RevealMarkdown = { + + /** + * Starts processing and converting Markdown within the + * current reveal.js deck. + * + * @param {function} callback function to invoke once + * we've finished loading and parsing Markdown + */ + init: function( callback ) { + + if( typeof marked === 'undefined' ) { + throw 'The reveal.js Markdown plugin requires marked to be loaded'; + } + + if( typeof hljs !== 'undefined' ) { + marked.setOptions({ + highlight: function( code, lang ) { + return hljs.highlightAuto( code, [lang] ).value; + } + }); + } + + // marked can be configured via reveal.js config options + var options = Reveal.getConfig().markdown; + if( options ) { + marked.setOptions( options ); + } + + return processSlides().then( convertSlides ); + + }, + + // TODO: Do these belong in the API? + processSlides: processSlides, + convertSlides: convertSlides, + slidify: slidify + + }; + + // Register our plugin so that reveal.js will call our + // plugin 'init' method as part of the initialization + Reveal.registerPlugin( 'markdown', RevealMarkdown ); + + return RevealMarkdown; + +})); diff --git a/yknjs/reveal.js/plugin/markdown/marked.js b/yknjs/reveal.js/plugin/markdown/marked.js new file mode 100644 index 0000000..481b9d8 --- /dev/null +++ b/yknjs/reveal.js/plugin/markdown/marked.js @@ -0,0 +1,6 @@ +/** + * marked - a markdown parser + * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +!function(e){"use strict";var k={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:f,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:f,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:f,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};function a(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||m.defaults,this.rules=k.normal,this.options.pedantic?this.rules=k.pedantic:this.options.gfm&&(this.options.tables?this.rules=k.tables:this.rules=k.gfm)}k._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,k._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,k.def=i(k.def).replace("label",k._label).replace("title",k._title).getRegex(),k.bullet=/(?:[*+-]|\d{1,9}\.)/,k.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,k.item=i(k.item,"gm").replace(/bull/g,k.bullet).getRegex(),k.list=i(k.list).replace(/bull/g,k.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+k.def.source+")").getRegex(),k._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",k._comment=//,k.html=i(k.html,"i").replace("comment",k._comment).replace("tag",k._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),k.paragraph=i(k.paragraph).replace("hr",k.hr).replace("heading",k.heading).replace("lheading",k.lheading).replace("tag",k._tag).getRegex(),k.blockquote=i(k.blockquote).replace("paragraph",k.paragraph).getRegex(),k.normal=d({},k),k.gfm=d({},k.normal,{fences:/^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),k.gfm.paragraph=i(k.paragraph).replace("(?!","(?!"+k.gfm.fences.source.replace("\\1","\\2")+"|"+k.list.source.replace("\\1","\\3")+"|").getRegex(),k.tables=d({},k.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),k.pedantic=d({},k.normal,{html:i("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",k._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),a.rules=k,a.lex=function(e,t){return new a(t).lex(e)},a.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},a.prototype.token=function(e,t){var n,r,s,i,l,o,a,h,p,u,c,g,f,d,m,b;for(e=e.replace(/^ +$/gm,"");e;)if((s=this.rules.newline.exec(e))&&(e=e.substring(s[0].length),1 ?/gm,""),this.token(s,t),this.tokens.push({type:"blockquote_end"});else if(s=this.rules.list.exec(e)){for(e=e.substring(s[0].length),a={type:"list_start",ordered:d=1<(i=s[2]).length,start:d?+i:"",loose:!1},this.tokens.push(a),n=!(h=[]),f=(s=s[0].match(this.rules.item)).length,c=0;c?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:f,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:f,text:/^(`+|[^`])[\s\S]*?(?=[\\?@\\[^_{|}~",n.em=i(n.em).replace(/punctuation/g,n._punctuation).getRegex(),n._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,n._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,n._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,n.autolink=i(n.autolink).replace("scheme",n._scheme).replace("email",n._email).getRegex(),n._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,n.tag=i(n.tag).replace("comment",k._comment).replace("attribute",n._attribute).getRegex(),n._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,n._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/,n._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,n.link=i(n.link).replace("label",n._label).replace("href",n._href).replace("title",n._title).getRegex(),n.reflink=i(n.reflink).replace("label",n._label).getRegex(),n.normal=d({},n),n.pedantic=d({},n.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:i(/^!?\[(label)\]\((.*?)\)/).replace("label",n._label).getRegex(),reflink:i(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",n._label).getRegex()}),n.gfm=d({},n.normal,{escape:i(n.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:i(n.text).replace("]|","~]|").replace("|$","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|$").getRegex()}),n.gfm.url=i(n.gfm.url,"i").replace("email",n.gfm._extended_email).getRegex(),n.breaks=d({},n.gfm,{br:i(n.br).replace("{2,}","*").getRegex(),text:i(n.gfm.text).replace("{2,}","*").getRegex()}),h.rules=n,h.output=function(e,t,n){return new h(t,n).output(e)},h.prototype.output=function(e){for(var t,n,r,s,i,l,o="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),o+=u(i[1]);else if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(i[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(i[0])&&(this.inRawBlock=!1),e=e.substring(i[0].length),o+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):u(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,r=i[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r))?(r=t[1],s=t[3]):s="":s=i[3]?i[3].slice(1,-1):"",r=r.trim().replace(/^<([\s\S]*)>$/,"$1"),o+=this.outputLink(i,{href:h.escapes(r),title:h.escapes(s)}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){o+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,o+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),o+=this.renderer.strong(this.output(i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),o+=this.renderer.em(this.output(i[6]||i[5]||i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),o+=this.renderer.codespan(u(i[2].trim(),!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),o+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),o+=this.renderer.del(this.output(i[1]));else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),r="@"===i[2]?"mailto:"+(n=u(this.mangle(i[1]))):n=u(i[1]),o+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.inRawBlock?o+=this.renderer.text(i[0]):o+=this.renderer.text(u(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===i[2])r="mailto:"+(n=u(i[0]));else{for(;l=i[0],i[0]=this.rules._backpedal.exec(i[0])[0],l!==i[0];);n=u(i[0]),r="www."===i[1]?"http://"+n:n}e=e.substring(i[0].length),o+=this.renderer.link(r,null,n)}return o},h.escapes=function(e){return e?e.replace(h.rules._escapes,"$1"):e},h.prototype.outputLink=function(e,t){var n=t.href,r=t.title?u(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,u(e[1]))},h.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},h.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s'+(n?e:u(e,!0))+"
    \n":"
    "+(n?e:u(e,!0))+"
    "},r.prototype.blockquote=function(e){return"
    \n"+e+"
    \n"},r.prototype.html=function(e){return e},r.prototype.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},r.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"},r.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},r.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},r.prototype.checkbox=function(e){return" "},r.prototype.paragraph=function(e){return"

    "+e+"

    \n"},r.prototype.table=function(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
    \n"},r.prototype.tablerow=function(e){return"\n"+e+"\n"},r.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},r.prototype.strong=function(e){return""+e+""},r.prototype.em=function(e){return""+e+""},r.prototype.codespan=function(e){return""+e+""},r.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},r.prototype.del=function(e){return""+e+""},r.prototype.link=function(e,t,n){if(null===(e=l(this.options.sanitize,this.options.baseUrl,e)))return n;var r='
    "},r.prototype.image=function(e,t,n){if(null===(e=l(this.options.sanitize,this.options.baseUrl,e)))return n;var r=''+n+'":">"},r.prototype.text=function(e){return e},s.prototype.strong=s.prototype.em=s.prototype.codespan=s.prototype.del=s.prototype.text=function(e){return e},s.prototype.link=s.prototype.image=function(e,t,n){return""+n},s.prototype.br=function(){return""},p.parse=function(e,t){return new p(t).parse(e)},p.prototype.parse=function(e){this.inline=new h(e.links,this.options),this.inlineText=new h(e.links,d({},this.options,{renderer:new s})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},p.prototype.next=function(){return this.token=this.tokens.pop()},p.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},p.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},p.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,c(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s="",i="";for(n="",e=0;e?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t))for(var n=t;this.seen[n]++,t=n+"-"+this.seen[n],this.seen.hasOwnProperty(t););return this.seen[t]=0,t},u.escapeTest=/[&<>"']/,u.escapeReplace=/[&<>"']/g,u.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},u.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,u.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var o={},g=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function f(){}function d(e){for(var t,n,r=1;rt)n.splice(t);else for(;n.lengthAn error occurred:

    "+u(e.message+"",!0)+"
    ";throw e}}f.exec=f,m.options=m.setOptions=function(e){return d(m.defaults,e),m},m.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new r,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},m.defaults=m.getDefaults(),m.Parser=p,m.parser=p.parse,m.Renderer=r,m.TextRenderer=s,m.Lexer=a,m.lexer=a.lex,m.InlineLexer=h,m.inlineLexer=h.output,m.Slugger=t,m.parse=m,"undefined"!=typeof module&&"object"==typeof exports?module.exports=m:"function"==typeof define&&define.amd?define(function(){return m}):e.marked=m}(this||("undefined"!=typeof window?window:global)); \ No newline at end of file diff --git a/yknjs/reveal.js/plugin/math/math.js b/yknjs/reveal.js/plugin/math/math.js new file mode 100755 index 0000000..d76c9dd --- /dev/null +++ b/yknjs/reveal.js/plugin/math/math.js @@ -0,0 +1,92 @@ +/** + * A plugin which enables rendering of math equations inside + * of reveal.js slides. Essentially a thin wrapper for MathJax. + * + * @author Hakim El Hattab + */ +var RevealMath = window.RevealMath || (function(){ + + var options = Reveal.getConfig().math || {}; + var mathjax = options.mathjax || 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js'; + var config = options.config || 'TeX-AMS_HTML-full'; + var url = mathjax + '?config=' + config; + + var defaultOptions = { + messageStyle: 'none', + tex2jax: { + inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ], + skipTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] + }, + skipStartupTypeset: true + }; + + function defaults( options, defaultOptions ) { + + for ( var i in defaultOptions ) { + if ( !options.hasOwnProperty( i ) ) { + options[i] = defaultOptions[i]; + } + } + + } + + function loadScript( url, callback ) { + + var head = document.querySelector( 'head' ); + var script = document.createElement( 'script' ); + script.type = 'text/javascript'; + script.src = url; + + // Wrapper for callback to make sure it only fires once + var finish = function() { + if( typeof callback === 'function' ) { + callback.call(); + callback = null; + } + } + + script.onload = finish; + + // IE + script.onreadystatechange = function() { + if ( this.readyState === 'loaded' ) { + finish(); + } + } + + // Normal browsers + head.appendChild( script ); + + } + + return { + init: function() { + + defaults( options, defaultOptions ); + defaults( options.tex2jax, defaultOptions.tex2jax ); + options.mathjax = options.config = null; + + loadScript( url, function() { + + MathJax.Hub.Config( options ); + + // Typeset followed by an immediate reveal.js layout since + // the typesetting process could affect slide height + MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] ); + MathJax.Hub.Queue( Reveal.layout ); + + // Reprocess equations in slides when they turn visible + Reveal.addEventListener( 'slidechanged', function( event ) { + + MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] ); + + } ); + + } ); + + } + } + +})(); + +Reveal.registerPlugin( 'math', RevealMath ); diff --git a/yknjs/reveal.js/plugin/multiplex/client.js b/yknjs/reveal.js/plugin/multiplex/client.js new file mode 100644 index 0000000..3ffd1e0 --- /dev/null +++ b/yknjs/reveal.js/plugin/multiplex/client.js @@ -0,0 +1,13 @@ +(function() { + var multiplex = Reveal.getConfig().multiplex; + var socketId = multiplex.id; + var socket = io.connect(multiplex.url); + + socket.on(multiplex.id, function(data) { + // ignore data from sockets that aren't ours + if (data.socketId !== socketId) { return; } + if( window.location.host === 'localhost:1947' ) return; + + Reveal.setState(data.state); + }); +}()); diff --git a/yknjs/reveal.js/plugin/multiplex/index.js b/yknjs/reveal.js/plugin/multiplex/index.js new file mode 100644 index 0000000..8195f04 --- /dev/null +++ b/yknjs/reveal.js/plugin/multiplex/index.js @@ -0,0 +1,64 @@ +var http = require('http'); +var express = require('express'); +var fs = require('fs'); +var io = require('socket.io'); +var crypto = require('crypto'); + +var app = express(); +var staticDir = express.static; +var server = http.createServer(app); + +io = io(server); + +var opts = { + port: process.env.PORT || 1948, + baseDir : __dirname + '/../../' +}; + +io.on( 'connection', function( socket ) { + socket.on('multiplex-statechanged', function(data) { + if (typeof data.secret == 'undefined' || data.secret == null || data.secret === '') return; + if (createHash(data.secret) === data.socketId) { + data.secret = null; + socket.broadcast.emit(data.socketId, data); + }; + }); +}); + +[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) { + app.use('/' + dir, staticDir(opts.baseDir + dir)); +}); + +app.get("/", function(req, res) { + res.writeHead(200, {'Content-Type': 'text/html'}); + + var stream = fs.createReadStream(opts.baseDir + '/index.html'); + stream.on('error', function( error ) { + res.write('

    reveal.js multiplex server.

    Generate token'); + res.end(); + }); + stream.on('readable', function() { + stream.pipe(res); + }); +}); + +app.get("/token", function(req,res) { + var ts = new Date().getTime(); + var rand = Math.floor(Math.random()*9999999); + var secret = ts.toString() + rand.toString(); + res.send({secret: secret, socketId: createHash(secret)}); +}); + +var createHash = function(secret) { + var cipher = crypto.createCipher('blowfish', secret); + return(cipher.final('hex')); +}; + +// Actually listen +server.listen( opts.port || null ); + +var brown = '\033[33m', + green = '\033[32m', + reset = '\033[0m'; + +console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset ); \ No newline at end of file diff --git a/yknjs/reveal.js/plugin/multiplex/master.js b/yknjs/reveal.js/plugin/multiplex/master.js new file mode 100644 index 0000000..7f4bf45 --- /dev/null +++ b/yknjs/reveal.js/plugin/multiplex/master.js @@ -0,0 +1,34 @@ +(function() { + + // Don't emit events from inside of notes windows + if ( window.location.search.match( /receiver/gi ) ) { return; } + + var multiplex = Reveal.getConfig().multiplex; + + var socket = io.connect( multiplex.url ); + + function post() { + + var messageData = { + state: Reveal.getState(), + secret: multiplex.secret, + socketId: multiplex.id + }; + + socket.emit( 'multiplex-statechanged', messageData ); + + }; + + // post once the page is loaded, so the client follows also on "open URL". + window.addEventListener( 'load', post ); + + // Monitor events that trigger a change in state + Reveal.addEventListener( 'slidechanged', post ); + Reveal.addEventListener( 'fragmentshown', post ); + Reveal.addEventListener( 'fragmenthidden', post ); + Reveal.addEventListener( 'overviewhidden', post ); + Reveal.addEventListener( 'overviewshown', post ); + Reveal.addEventListener( 'paused', post ); + Reveal.addEventListener( 'resumed', post ); + +}()); diff --git a/yknjs/reveal.js/plugin/multiplex/package.json b/yknjs/reveal.js/plugin/multiplex/package.json new file mode 100644 index 0000000..bbed77a --- /dev/null +++ b/yknjs/reveal.js/plugin/multiplex/package.json @@ -0,0 +1,19 @@ +{ + "name": "reveal-js-multiplex", + "version": "1.0.0", + "description": "reveal.js multiplex server", + "homepage": "http://revealjs.com", + "scripts": { + "start": "node index.js" + }, + "engines": { + "node": "~4.1.1" + }, + "dependencies": { + "express": "~4.13.3", + "grunt-cli": "~0.1.13", + "mustache": "~2.2.1", + "socket.io": "~1.3.7" + }, + "license": "MIT" +} diff --git a/yknjs/reveal.js/plugin/notes-server/client.js b/yknjs/reveal.js/plugin/notes-server/client.js new file mode 100644 index 0000000..00b277b --- /dev/null +++ b/yknjs/reveal.js/plugin/notes-server/client.js @@ -0,0 +1,65 @@ +(function() { + + // don't emit events from inside the previews themselves + if( window.location.search.match( /receiver/gi ) ) { return; } + + var socket = io.connect( window.location.origin ), + socketId = Math.random().toString().slice( 2 ); + + console.log( 'View slide notes at ' + window.location.origin + '/notes/' + socketId ); + + window.open( window.location.origin + '/notes/' + socketId, 'notes-' + socketId ); + + /** + * Posts the current slide data to the notes window + */ + function post() { + + var slideElement = Reveal.getCurrentSlide(), + notesElement = slideElement.querySelector( 'aside.notes' ); + + var messageData = { + notes: '', + markdown: false, + socketId: socketId, + state: Reveal.getState() + }; + + // Look for notes defined in a slide attribute + if( slideElement.hasAttribute( 'data-notes' ) ) { + messageData.notes = slideElement.getAttribute( 'data-notes' ); + } + + // Look for notes defined in an aside element + if( notesElement ) { + messageData.notes = notesElement.innerHTML; + messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; + } + + socket.emit( 'statechanged', messageData ); + + } + + // When a new notes window connects, post our current state + socket.on( 'new-subscriber', function( data ) { + post(); + } ); + + // When the state changes from inside of the speaker view + socket.on( 'statechanged-speaker', function( data ) { + Reveal.setState( data.state ); + } ); + + // Monitor events that trigger a change in state + Reveal.addEventListener( 'slidechanged', post ); + Reveal.addEventListener( 'fragmentshown', post ); + Reveal.addEventListener( 'fragmenthidden', post ); + Reveal.addEventListener( 'overviewhidden', post ); + Reveal.addEventListener( 'overviewshown', post ); + Reveal.addEventListener( 'paused', post ); + Reveal.addEventListener( 'resumed', post ); + + // Post the initial state + post(); + +}()); diff --git a/yknjs/reveal.js/plugin/notes-server/index.js b/yknjs/reveal.js/plugin/notes-server/index.js new file mode 100644 index 0000000..b95f071 --- /dev/null +++ b/yknjs/reveal.js/plugin/notes-server/index.js @@ -0,0 +1,69 @@ +var http = require('http'); +var express = require('express'); +var fs = require('fs'); +var io = require('socket.io'); +var Mustache = require('mustache'); + +var app = express(); +var staticDir = express.static; +var server = http.createServer(app); + +io = io(server); + +var opts = { + port : 1947, + baseDir : __dirname + '/../../' +}; + +io.on( 'connection', function( socket ) { + + socket.on( 'new-subscriber', function( data ) { + socket.broadcast.emit( 'new-subscriber', data ); + }); + + socket.on( 'statechanged', function( data ) { + delete data.state.overview; + socket.broadcast.emit( 'statechanged', data ); + }); + + socket.on( 'statechanged-speaker', function( data ) { + delete data.state.overview; + socket.broadcast.emit( 'statechanged-speaker', data ); + }); + +}); + +[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach( function( dir ) { + app.use( '/' + dir, staticDir( opts.baseDir + dir ) ); +}); + +app.get('/', function( req, res ) { + + res.writeHead( 200, { 'Content-Type': 'text/html' } ); + fs.createReadStream( opts.baseDir + '/index.html' ).pipe( res ); + +}); + +app.get( '/notes/:socketId', function( req, res ) { + + fs.readFile( opts.baseDir + 'plugin/notes-server/notes.html', function( err, data ) { + res.send( Mustache.to_html( data.toString(), { + socketId : req.params.socketId + })); + }); + +}); + +// Actually listen +server.listen( opts.port || null ); + +var brown = '\033[33m', + green = '\033[32m', + reset = '\033[0m'; + +var slidesLocation = 'http://localhost' + ( opts.port ? ( ':' + opts.port ) : '' ); + +console.log( brown + 'reveal.js - Speaker Notes' + reset ); +console.log( '1. Open the slides at ' + green + slidesLocation + reset ); +console.log( '2. Click on the link in your JS console to go to the notes page' ); +console.log( '3. Advance through your slides and your notes will advance automatically' ); diff --git a/yknjs/reveal.js/plugin/notes-server/notes.html b/yknjs/reveal.js/plugin/notes-server/notes.html new file mode 100644 index 0000000..ab8c5b1 --- /dev/null +++ b/yknjs/reveal.js/plugin/notes-server/notes.html @@ -0,0 +1,585 @@ + + + + + + reveal.js - Slide Notes + + + + + + +
    +
    Upcoming
    +
    +
    +

    Time Click to Reset

    +
    + 0:00 AM +
    +
    + 00:00:00 +
    +
    +
    + + +
    +
    + + +
    + + + + + + + + diff --git a/yknjs/reveal.js/plugin/notes/notes.html b/yknjs/reveal.js/plugin/notes/notes.html new file mode 100644 index 0000000..9e0b230 --- /dev/null +++ b/yknjs/reveal.js/plugin/notes/notes.html @@ -0,0 +1,834 @@ + + + + + + reveal.js - Slide Notes + + + + + + +
    Loading speaker view...
    + +
    +
    Upcoming
    +
    +
    +

    Time Click to Reset

    +
    + 0:00 AM +
    +
    + 00:00:00 +
    +
    + + + +
    + + +
    +
    + + +
    + + + + + diff --git a/yknjs/reveal.js/plugin/notes/notes.js b/yknjs/reveal.js/plugin/notes/notes.js new file mode 100644 index 0000000..3d5eac4 --- /dev/null +++ b/yknjs/reveal.js/plugin/notes/notes.js @@ -0,0 +1,178 @@ +/** + * Handles opening of and synchronization with the reveal.js + * notes window. + * + * Handshake process: + * 1. This window posts 'connect' to notes window + * - Includes URL of presentation to show + * 2. Notes window responds with 'connected' when it is available + * 3. This window proceeds to send the current presentation state + * to the notes window + */ +var RevealNotes = (function() { + + var notesPopup = null; + + function openNotes( notesFilePath ) { + + if (notesPopup && !notesPopup.closed) { + notesPopup.focus(); + return; + } + + if( !notesFilePath ) { + var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path + jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path + notesFilePath = jsFileLocation + 'notes.html'; + } + + notesPopup = window.open( notesFilePath, 'reveal.js - Notes', 'width=1100,height=700' ); + + if( !notesPopup ) { + alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' ); + return; + } + + /** + * Connect to the notes window through a postmessage handshake. + * Using postmessage enables us to work in situations where the + * origins differ, such as a presentation being opened from the + * file system. + */ + function connect() { + // Keep trying to connect until we get a 'connected' message back + var connectInterval = setInterval( function() { + notesPopup.postMessage( JSON.stringify( { + namespace: 'reveal-notes', + type: 'connect', + url: window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search, + state: Reveal.getState() + } ), '*' ); + }, 500 ); + + window.addEventListener( 'message', function( event ) { + var data = JSON.parse( event.data ); + if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) { + clearInterval( connectInterval ); + onConnected(); + } + if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) { + callRevealApi( data.methodName, data.arguments, data.callId ); + } + } ); + } + + /** + * Calls the specified Reveal.js method with the provided argument + * and then pushes the result to the notes frame. + */ + function callRevealApi( methodName, methodArguments, callId ) { + + var result = Reveal[methodName].apply( Reveal, methodArguments ); + notesPopup.postMessage( JSON.stringify( { + namespace: 'reveal-notes', + type: 'return', + result: result, + callId: callId + } ), '*' ); + + } + + /** + * Posts the current slide data to the notes window + */ + function post( event ) { + + var slideElement = Reveal.getCurrentSlide(), + notesElement = slideElement.querySelector( 'aside.notes' ), + fragmentElement = slideElement.querySelector( '.current-fragment' ); + + var messageData = { + namespace: 'reveal-notes', + type: 'state', + notes: '', + markdown: false, + whitespace: 'normal', + state: Reveal.getState() + }; + + // Look for notes defined in a slide attribute + if( slideElement.hasAttribute( 'data-notes' ) ) { + messageData.notes = slideElement.getAttribute( 'data-notes' ); + messageData.whitespace = 'pre-wrap'; + } + + // Look for notes defined in a fragment + if( fragmentElement ) { + var fragmentNotes = fragmentElement.querySelector( 'aside.notes' ); + if( fragmentNotes ) { + notesElement = fragmentNotes; + } + else if( fragmentElement.hasAttribute( 'data-notes' ) ) { + messageData.notes = fragmentElement.getAttribute( 'data-notes' ); + messageData.whitespace = 'pre-wrap'; + + // In case there are slide notes + notesElement = null; + } + } + + // Look for notes defined in an aside element + if( notesElement ) { + messageData.notes = notesElement.innerHTML; + messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; + } + + notesPopup.postMessage( JSON.stringify( messageData ), '*' ); + + } + + /** + * Called once we have established a connection to the notes + * window. + */ + function onConnected() { + + // Monitor events that trigger a change in state + Reveal.addEventListener( 'slidechanged', post ); + Reveal.addEventListener( 'fragmentshown', post ); + Reveal.addEventListener( 'fragmenthidden', post ); + Reveal.addEventListener( 'overviewhidden', post ); + Reveal.addEventListener( 'overviewshown', post ); + Reveal.addEventListener( 'paused', post ); + Reveal.addEventListener( 'resumed', post ); + + // Post the initial state + post(); + + } + + connect(); + + } + + return { + init: function() { + + if( !/receiver/i.test( window.location.search ) ) { + + // If the there's a 'notes' query set, open directly + if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { + openNotes(); + } + + // Open the notes when the 's' key is hit + Reveal.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() { + openNotes(); + } ); + + } + + }, + + open: openNotes + }; + +})(); + +Reveal.registerPlugin( 'notes', RevealNotes ); diff --git a/yknjs/reveal.js/plugin/print-pdf/print-pdf.js b/yknjs/reveal.js/plugin/print-pdf/print-pdf.js new file mode 100644 index 0000000..f62aedc --- /dev/null +++ b/yknjs/reveal.js/plugin/print-pdf/print-pdf.js @@ -0,0 +1,67 @@ +/** + * phantomjs script for printing presentations to PDF. + * + * Example: + * phantomjs print-pdf.js "http://revealjs.com?print-pdf" reveal-demo.pdf + * + * @author Manuel Bieh (https://github.com/manuelbieh) + * @author Hakim El Hattab (https://github.com/hakimel) + * @author Manuel Riezebosch (https://github.com/riezebosch) + */ + +// html2pdf.js +var system = require( 'system' ); + +var probePage = new WebPage(); +var printPage = new WebPage(); + +var inputFile = system.args[1] || 'index.html?print-pdf'; +var outputFile = system.args[2] || 'slides.pdf'; + +if( outputFile.match( /\.pdf$/gi ) === null ) { + outputFile += '.pdf'; +} + +console.log( 'Export PDF: Reading reveal.js config [1/4]' ); + +probePage.open( inputFile, function( status ) { + + console.log( 'Export PDF: Preparing print layout [2/4]' ); + + var config = probePage.evaluate( function() { + return Reveal.getConfig(); + } ); + + if( config ) { + + printPage.paperSize = { + width: Math.floor( config.width * ( 1 + config.margin ) ), + height: Math.floor( config.height * ( 1 + config.margin ) ), + border: 0 + }; + + printPage.open( inputFile, function( status ) { + console.log( 'Export PDF: Preparing pdf [3/4]') + printPage.evaluate( function() { + Reveal.isReady() ? window.callPhantom() : Reveal.addEventListener( 'pdf-ready', window.callPhantom ); + } ); + } ); + + printPage.onCallback = function( data ) { + // For some reason we need to "jump the queue" for syntax highlighting to work. + // See: http://stackoverflow.com/a/3580132/129269 + setTimeout( function() { + console.log( 'Export PDF: Writing file [4/4]' ); + printPage.render( outputFile ); + console.log( 'Export PDF: Finished successfully!' ); + phantom.exit(); + }, 0 ); + }; + } + else { + + console.log( 'Export PDF: Unable to read reveal.js config. Make sure the input address points to a reveal.js page.' ); + phantom.exit( 1 ); + + } +} ); diff --git a/yknjs/reveal.js/plugin/search/search.js b/yknjs/reveal.js/plugin/search/search.js new file mode 100644 index 0000000..21c0367 --- /dev/null +++ b/yknjs/reveal.js/plugin/search/search.js @@ -0,0 +1,206 @@ +/* + * Handles finding a text string anywhere in the slides and showing the next occurrence to the user + * by navigatating to that slide and highlighting it. + * + * By Jon Snyder , February 2013 + */ + +var RevealSearch = (function() { + + var matchedSlides; + var currentMatchedIndex; + var searchboxDirty; + var myHilitor; + +// Original JavaScript code by Chirp Internet: www.chirp.com.au +// Please acknowledge use of this code by including this header. +// 2/2013 jon: modified regex to display any match, not restricted to word boundaries. + +function Hilitor(id, tag) +{ + + var targetNode = document.getElementById(id) || document.body; + var hiliteTag = tag || "EM"; + var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM)$"); + var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"]; + var wordColor = []; + var colorIdx = 0; + var matchRegex = ""; + var matchingSlides = []; + + this.setRegex = function(input) + { + input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|"); + matchRegex = new RegExp("(" + input + ")","i"); + } + + this.getRegex = function() + { + return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " "); + } + + // recursively apply word highlighting + this.hiliteWords = function(node) + { + if(node == undefined || !node) return; + if(!matchRegex) return; + if(skipTags.test(node.nodeName)) return; + + if(node.hasChildNodes()) { + for(var i=0; i < node.childNodes.length; i++) + this.hiliteWords(node.childNodes[i]); + } + if(node.nodeType == 3) { // NODE_TEXT + if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) { + //find the slide's section element and save it in our list of matching slides + var secnode = node; + while (secnode != null && secnode.nodeName != 'SECTION') { + secnode = secnode.parentNode; + } + + var slideIndex = Reveal.getIndices(secnode); + var slidelen = matchingSlides.length; + var alreadyAdded = false; + for (var i=0; i < slidelen; i++) { + if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) { + alreadyAdded = true; + } + } + if (! alreadyAdded) { + matchingSlides.push(slideIndex); + } + + if(!wordColor[regs[0].toLowerCase()]) { + wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length]; + } + + var match = document.createElement(hiliteTag); + match.appendChild(document.createTextNode(regs[0])); + match.style.backgroundColor = wordColor[regs[0].toLowerCase()]; + match.style.fontStyle = "inherit"; + match.style.color = "#000"; + + var after = node.splitText(regs.index); + after.nodeValue = after.nodeValue.substring(regs[0].length); + node.parentNode.insertBefore(match, after); + } + } + }; + + // remove highlighting + this.remove = function() + { + var arr = document.getElementsByTagName(hiliteTag); + while(arr.length && (el = arr[0])) { + el.parentNode.replaceChild(el.firstChild, el); + } + }; + + // start highlighting at target node + this.apply = function(input) + { + if(input == undefined || !input) return; + this.remove(); + this.setRegex(input); + this.hiliteWords(targetNode); + return matchingSlides; + }; + +} + + function openSearch() { + //ensure the search term input dialog is visible and has focus: + var inputboxdiv = document.getElementById("searchinputdiv"); + var inputbox = document.getElementById("searchinput"); + inputboxdiv.style.display = "inline"; + inputbox.focus(); + inputbox.select(); + } + + function closeSearch() { + var inputboxdiv = document.getElementById("searchinputdiv"); + inputboxdiv.style.display = "none"; + if(myHilitor) myHilitor.remove(); + } + + function toggleSearch() { + var inputboxdiv = document.getElementById("searchinputdiv"); + if (inputboxdiv.style.display !== "inline") { + openSearch(); + } + else { + closeSearch(); + } + } + + function doSearch() { + //if there's been a change in the search term, perform a new search: + if (searchboxDirty) { + var searchstring = document.getElementById("searchinput").value; + + if (searchstring === '') { + if(myHilitor) myHilitor.remove(); + matchedSlides = null; + } + else { + //find the keyword amongst the slides + myHilitor = new Hilitor("slidecontent"); + matchedSlides = myHilitor.apply(searchstring); + currentMatchedIndex = 0; + } + } + + if (matchedSlides) { + //navigate to the next slide that has the keyword, wrapping to the first if necessary + if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) { + currentMatchedIndex = 0; + } + if (matchedSlides.length > currentMatchedIndex) { + Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v); + currentMatchedIndex++; + } + } + } + + var dom = {}; + dom.wrapper = document.querySelector( '.reveal' ); + + if( !dom.wrapper.querySelector( '.searchbox' ) ) { + var searchElement = document.createElement( 'div' ); + searchElement.id = "searchinputdiv"; + searchElement.classList.add( 'searchdiv' ); + searchElement.style.position = 'absolute'; + searchElement.style.top = '10px'; + searchElement.style.right = '10px'; + searchElement.style.zIndex = 10; + //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/: + searchElement.innerHTML = ''; + dom.wrapper.appendChild( searchElement ); + } + + document.getElementById( 'searchbutton' ).addEventListener( 'click', function(event) { + doSearch(); + }, false ); + + document.getElementById( 'searchinput' ).addEventListener( 'keyup', function( event ) { + switch (event.keyCode) { + case 13: + event.preventDefault(); + doSearch(); + searchboxDirty = false; + break; + default: + searchboxDirty = true; + } + }, false ); + + document.addEventListener( 'keydown', function( event ) { + if( event.key == "F" && (event.ctrlKey || event.metaKey) ) { //Control+Shift+f + event.preventDefault(); + toggleSearch(); + } + }, false ); + if( window.Reveal ) Reveal.registerKeyboardShortcut( 'CTRL + Shift + F', 'Search' ); + closeSearch(); + return { open: openSearch }; +})(); diff --git a/yknjs/reveal.js/plugin/zoom-js/zoom.js b/yknjs/reveal.js/plugin/zoom-js/zoom.js new file mode 100644 index 0000000..92c3ba5 --- /dev/null +++ b/yknjs/reveal.js/plugin/zoom-js/zoom.js @@ -0,0 +1,277 @@ +// Custom reveal.js integration +var RevealZoom = (function(){ + + return { + init: function() { + + Reveal.getRevealElement().addEventListener( 'mousedown', function( event ) { + var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt'; + + var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : defaultModifier ) + 'Key'; + var zoomLevel = ( Reveal.getConfig().zoomLevel ? Reveal.getConfig().zoomLevel : 2 ); + + if( event[ modifier ] && !Reveal.isOverview() ) { + event.preventDefault(); + + zoom.to({ + x: event.clientX, + y: event.clientY, + scale: zoomLevel, + pan: false + }); + } + } ); + + } + } + +})(); + +Reveal.registerPlugin( 'zoom', RevealZoom ); + +/*! + * zoom.js 0.3 (modified for use with reveal.js) + * http://lab.hakim.se/zoom-js + * MIT licensed + * + * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se + */ +var zoom = (function(){ + + // The current zoom level (scale) + var level = 1; + + // The current mouse position, used for panning + var mouseX = 0, + mouseY = 0; + + // Timeout before pan is activated + var panEngageTimeout = -1, + panUpdateInterval = -1; + + // Check for transform support so that we can fallback otherwise + var supportsTransforms = 'WebkitTransform' in document.body.style || + 'MozTransform' in document.body.style || + 'msTransform' in document.body.style || + 'OTransform' in document.body.style || + 'transform' in document.body.style; + + if( supportsTransforms ) { + // The easing that will be applied when we zoom in/out + document.body.style.transition = 'transform 0.8s ease'; + document.body.style.OTransition = '-o-transform 0.8s ease'; + document.body.style.msTransition = '-ms-transform 0.8s ease'; + document.body.style.MozTransition = '-moz-transform 0.8s ease'; + document.body.style.WebkitTransition = '-webkit-transform 0.8s ease'; + } + + // Zoom out if the user hits escape + document.addEventListener( 'keyup', function( event ) { + if( level !== 1 && event.keyCode === 27 ) { + zoom.out(); + } + } ); + + // Monitor mouse movement for panning + document.addEventListener( 'mousemove', function( event ) { + if( level !== 1 ) { + mouseX = event.clientX; + mouseY = event.clientY; + } + } ); + + /** + * Applies the CSS required to zoom in, prefers the use of CSS3 + * transforms but falls back on zoom for IE. + * + * @param {Object} rect + * @param {Number} scale + */ + function magnify( rect, scale ) { + + var scrollOffset = getScrollOffset(); + + // Ensure a width/height is set + rect.width = rect.width || 1; + rect.height = rect.height || 1; + + // Center the rect within the zoomed viewport + rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2; + rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2; + + if( supportsTransforms ) { + // Reset + if( scale === 1 ) { + document.body.style.transform = ''; + document.body.style.OTransform = ''; + document.body.style.msTransform = ''; + document.body.style.MozTransform = ''; + document.body.style.WebkitTransform = ''; + } + // Scale + else { + var origin = scrollOffset.x +'px '+ scrollOffset.y +'px', + transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')'; + + document.body.style.transformOrigin = origin; + document.body.style.OTransformOrigin = origin; + document.body.style.msTransformOrigin = origin; + document.body.style.MozTransformOrigin = origin; + document.body.style.WebkitTransformOrigin = origin; + + document.body.style.transform = transform; + document.body.style.OTransform = transform; + document.body.style.msTransform = transform; + document.body.style.MozTransform = transform; + document.body.style.WebkitTransform = transform; + } + } + else { + // Reset + if( scale === 1 ) { + document.body.style.position = ''; + document.body.style.left = ''; + document.body.style.top = ''; + document.body.style.width = ''; + document.body.style.height = ''; + document.body.style.zoom = ''; + } + // Scale + else { + document.body.style.position = 'relative'; + document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px'; + document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px'; + document.body.style.width = ( scale * 100 ) + '%'; + document.body.style.height = ( scale * 100 ) + '%'; + document.body.style.zoom = scale; + } + } + + level = scale; + + if( document.documentElement.classList ) { + if( level !== 1 ) { + document.documentElement.classList.add( 'zoomed' ); + } + else { + document.documentElement.classList.remove( 'zoomed' ); + } + } + } + + /** + * Pan the document when the mosue cursor approaches the edges + * of the window. + */ + function pan() { + var range = 0.12, + rangeX = window.innerWidth * range, + rangeY = window.innerHeight * range, + scrollOffset = getScrollOffset(); + + // Up + if( mouseY < rangeY ) { + window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) ); + } + // Down + else if( mouseY > window.innerHeight - rangeY ) { + window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) ); + } + + // Left + if( mouseX < rangeX ) { + window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y ); + } + // Right + else if( mouseX > window.innerWidth - rangeX ) { + window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y ); + } + } + + function getScrollOffset() { + return { + x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset, + y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset + } + } + + return { + /** + * Zooms in on either a rectangle or HTML element. + * + * @param {Object} options + * - element: HTML element to zoom in on + * OR + * - x/y: coordinates in non-transformed space to zoom in on + * - width/height: the portion of the screen to zoom in on + * - scale: can be used instead of width/height to explicitly set scale + */ + to: function( options ) { + + // Due to an implementation limitation we can't zoom in + // to another element without zooming out first + if( level !== 1 ) { + zoom.out(); + } + else { + options.x = options.x || 0; + options.y = options.y || 0; + + // If an element is set, that takes precedence + if( !!options.element ) { + // Space around the zoomed in element to leave on screen + var padding = 20; + var bounds = options.element.getBoundingClientRect(); + + options.x = bounds.left - padding; + options.y = bounds.top - padding; + options.width = bounds.width + ( padding * 2 ); + options.height = bounds.height + ( padding * 2 ); + } + + // If width/height values are set, calculate scale from those values + if( options.width !== undefined && options.height !== undefined ) { + options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 ); + } + + if( options.scale > 1 ) { + options.x *= options.scale; + options.y *= options.scale; + + magnify( options, options.scale ); + + if( options.pan !== false ) { + + // Wait with engaging panning as it may conflict with the + // zoom transition + panEngageTimeout = setTimeout( function() { + panUpdateInterval = setInterval( pan, 1000 / 60 ); + }, 800 ); + + } + } + } + }, + + /** + * Resets the document zoom state to its default. + */ + out: function() { + clearTimeout( panEngageTimeout ); + clearInterval( panUpdateInterval ); + + magnify( { x: 0, y: 0 }, 1 ); + + level = 1; + }, + + // Alias + magnify: function( options ) { this.to( options ) }, + reset: function() { this.out() }, + + zoomLevel: function() { + return level; + } + } + +})(); diff --git a/yknjs/reveal.js/test/assets/external-script-a.js b/yknjs/reveal.js/test/assets/external-script-a.js new file mode 100644 index 0000000..cbc8da1 --- /dev/null +++ b/yknjs/reveal.js/test/assets/external-script-a.js @@ -0,0 +1 @@ +window.externalScriptSequence += 'A'; \ No newline at end of file diff --git a/yknjs/reveal.js/test/assets/external-script-b.js b/yknjs/reveal.js/test/assets/external-script-b.js new file mode 100644 index 0000000..e5bca5a --- /dev/null +++ b/yknjs/reveal.js/test/assets/external-script-b.js @@ -0,0 +1 @@ +window.externalScriptSequence += 'B'; \ No newline at end of file diff --git a/yknjs/reveal.js/test/assets/external-script-c.js b/yknjs/reveal.js/test/assets/external-script-c.js new file mode 100644 index 0000000..7d4ccf6 --- /dev/null +++ b/yknjs/reveal.js/test/assets/external-script-c.js @@ -0,0 +1 @@ +window.externalScriptSequence += 'C'; \ No newline at end of file diff --git a/yknjs/reveal.js/test/assets/external-script-d.js b/yknjs/reveal.js/test/assets/external-script-d.js new file mode 100644 index 0000000..1c5925b --- /dev/null +++ b/yknjs/reveal.js/test/assets/external-script-d.js @@ -0,0 +1 @@ +window.externalScriptSequence += 'D'; \ No newline at end of file diff --git a/yknjs/reveal.js/test/examples/assets/beeping.txt b/yknjs/reveal.js/test/examples/assets/beeping.txt new file mode 100644 index 0000000..bf41997 --- /dev/null +++ b/yknjs/reveal.js/test/examples/assets/beeping.txt @@ -0,0 +1,2 @@ +Source: https://freesound.org/people/fennelliott/sounds/379419/ +License: CC0 (public domain) \ No newline at end of file diff --git a/yknjs/reveal.js/test/examples/assets/beeping.wav b/yknjs/reveal.js/test/examples/assets/beeping.wav new file mode 100644 index 0000000000000000000000000000000000000000..38747a533a78497c52134dc0ea13ba197eec9e85 GIT binary patch literal 422472 zcmeFaWtbedvo9>Edw6GOnG9=Ywi8p#Oo^G96Enn)A!cTdnK_2U%#5*PW{PRoUf$tp zkaSC)DpmbdDwU*CZR;it8`d6aL>=n1Z_t0p=zL)aA&dyB zzYn3XKM9gi80y<=bgz3OjBqFCCkKHX1ac6_K_CZ#90YO@$Uz_nfgA*K5XeCw2Z0;} zauCQtAP0dQ1ac6_K_CZ#90YO@$Uz_nfgA*K5XeCw2Z0;}auCQtAP0dQ1ac6_K_CZ# z90YO@$Uz_nfgA*K5XeCw2Z0;}auCQtAP0dQ1ac6_K_CZ#90YO@$Uz_nfgA*K5XeCw z2Z8@TA;9^+(*EanaTR~LC4L9Lefjf${QA!_;`@I-iBa(G*K1$zi_hS9&e?yL;qXI{ z1a}yGk}tLDT;mw7XIWJRGsDHKY^ARA&l zz*Tr60MEL(lN*o`Xi;v0r(;lFpc)QO$Dwo{hCXmVSK!%fp7!ON8RZ6w)-TljaK*zP zavORNoIQf8S-c?1gF;XQibti910@1|6>14bsZjnie*=^#&*C3}V^N<4soV{SAW#Z@i}C}dP*e&eP2*LNpY1}M`8E`Z?!)z0 zs5{!gKk=RB4`h9K3wD54=M&J6s3u;-xALW^8k$Lpksas+P@c(#;Y`4_ zDKE>MtP3m0kFtHNl>S`H<#&3o`-*#ZD`S0ss7(Xgv5t}*H^YV{Ov>Fa*Xq3G=M6cK- zd|2zi+W0Ce&9d@3Ns{!@|6%YuIpuJ&H7zP-xpPBy3;u}hv+cGV3sr43?BTXv5lF7*K@9i3rH99cPKMv310}MyV2)UBf&a}z6DD0IZB4J&^+`K5?(Oi#m z&yU#?iy~vAkC-Rg_9^?Q-CJIL=IgGSJxzVfvd%aQr2UdoEXDfaSjMO16z8S111@jo zYj0)WQ!SERL<6K}c!;5~w9I(GwmYO(?5dbHiCgp5OWd2cU%W3aEQZ7!bo?9|f)Db> zN=N0KdPL^uJF-(6Z5Xk#o}+oH;jsku4>wADMQbZ;+hqwDPFqIv)F$p z^=+E+F6Qmfcl}@2{8agUt@I9`3SSmgQLe_Jb#FSEXeCCqL#OVvz|9o-#D9z!li z!Bcr|B{quxDOa(Wb}^kJir8OT^N~!_RFC6}HI2Rqyi^xEr?|I%+Wx7<`$2DWe{v*k zNq3}H&4^8J=`7@V7;wx4H6DKVbtQjtv@ z*&%o2@1>jc5v@$G>Swis>Yv_RzAb6n)3QGdes4;)Cml&kN%d!(�H}cLh9$l+Oxd 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 xew|VLM&3s#=50$LtvH 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≫3ZEarH~xrHBVj{4GFnEEY@`rc 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 fM=9{qE4H}`h;0{c+MZu1)J4X&|qom@(L8(bu8 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뫶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 literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js/test/examples/assets/image2.png b/yknjs/reveal.js/test/examples/assets/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c403a0d20be97d7f4ce000487fac783764dbaf7 GIT binary patch literal 10237 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 Gg#Hhj!X@AU literal 0 HcmV?d00001 diff --git a/yknjs/reveal.js/test/examples/barebones.html b/yknjs/reveal.js/test/examples/barebones.html new file mode 100644 index 0000000..2bee3cb --- /dev/null +++ b/yknjs/reveal.js/test/examples/barebones.html @@ -0,0 +1,41 @@ + + + + + + + reveal.js - Barebones + + + + + + +
    + +
    + +
    +

    Barebones Presentation

    +

    This example contains the bare minimum includes and markup required to run a reveal.js presentation.

    +
    + +
    +

    No Theme

    +

    There's no theme included, so it will fall back on browser defaults.

    +
    + +
    + +
    + + + + + + + diff --git a/yknjs/reveal.js/test/examples/embedded-media.html b/yknjs/reveal.js/test/examples/embedded-media.html new file mode 100644 index 0000000..91457e4 --- /dev/null +++ b/yknjs/reveal.js/test/examples/embedded-media.html @@ -0,0 +1,53 @@ + + + + + + + reveal.js - Embedded Media + + + + + + + + + +
    + +
    + +
    +

    Embedded Media Test

    +
    + +
    + +
    + +
    +

    Empty Slide

    +
    + +
    +

    Auto-playing audio

    + +
    + +
    + +
    + + + + + + + diff --git a/yknjs/reveal.js/test/examples/math.html b/yknjs/reveal.js/test/examples/math.html new file mode 100644 index 0000000..0f74a8f --- /dev/null +++ b/yknjs/reveal.js/test/examples/math.html @@ -0,0 +1,205 @@ + + + + + + + reveal.js - Math Plugin + + + + + + + + + +
    + +
    + +
    +

    reveal.js Math Plugin

    +

    A thin wrapper for MathJax

    +
    + +
    +

    The Lorenz Equations

    + + \[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \] +
    + +
    +

    The Cauchy-Schwarz Inequality

    + + +
    + +
    +

    A Cross Product Formula

    + + \[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} + \mathbf{i} & \mathbf{j} & \mathbf{k} \\ + \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ + \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 + \end{vmatrix} \] +
    + +
    +

    The probability of getting \(k\) heads when flipping \(n\) coins is

    + + \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] +
    + +
    +

    An Identity of Ramanujan

    + + \[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = + 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} + {1+\frac{e^{-8\pi}} {1+\ldots} } } } \] +
    + +
    +

    A Rogers-Ramanujan Identity

    + + \[ 1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = + \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\] +
    + +
    +

    Maxwell’s Equations

    + + \[ \begin{aligned} + \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ + \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ + \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} + \] +
    + +
    +

    TeX Macros

    + + Here is a common vector space: + \[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 < +\infty}\] + used in functional analysis. +
    + +
    +
    +

    The Lorenz Equations

    + +
    + \[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \] +
    +
    + +
    +

    The Cauchy-Schwarz Inequality

    + +
    + \[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \] +
    +
    + +
    +

    A Cross Product Formula

    + +
    + \[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} + \mathbf{i} & \mathbf{j} & \mathbf{k} \\ + \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ + \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 + \end{vmatrix} \] +
    +
    + +
    +

    The probability of getting \(k\) heads when flipping \(n\) coins is

    + +
    + \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] +
    +
    + +
    +

    An Identity of Ramanujan

    + +
    + \[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = + 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} + {1+\frac{e^{-8\pi}} {1+\ldots} } } } \] +
    +
    + +
    +

    A Rogers-Ramanujan Identity

    + +
    + \[ 1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = + \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\] +
    +
    + +
    +

    Maxwell’s Equations

    + +
    + \[ \begin{aligned} + \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ + \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ + \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} + \] +
    +
    + +
    +

    TeX Macros

    + + Here is a common vector space: + \[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 < +\infty}\] + used in functional analysis. +
    +
    + +
    + +
    + + + + + + + diff --git a/yknjs/reveal.js/test/examples/slide-backgrounds.html b/yknjs/reveal.js/test/examples/slide-backgrounds.html new file mode 100644 index 0000000..e08d260 --- /dev/null +++ b/yknjs/reveal.js/test/examples/slide-backgrounds.html @@ -0,0 +1,143 @@ + + + + + + + reveal.js - Slide Backgrounds + + + + + + + + + + +
    + +
    + +
    +

    data-background: #00ffff

    +
    + +
    +

    data-background: #bb00bb

    +
    + +
    +

    data-background: lightblue

    +
    + +
    +
    +

    data-background: #ff0000

    +
    +
    +

    data-background: rgba(0, 0, 0, 0.2)

    +
    +
    +

    data-background: salmon

    +
    +
    + +
    +
    +

    Background applied to stack

    +
    +
    +

    Background applied to stack

    +
    +
    +

    Background applied to slide inside of stack

    +
    +
    + +
    +

    Background image

    +
    + +
    +
    +

    Background image

    +
    +
    +

    Background image

    +
    +
    + +
    +

    Background image

    +
    data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"
    +
    + +
    +

    Same background twice (1/2)

    +
    +
    +

    Same background twice (2/2)

    +
    + +
    +

    Video background

    +
    + +
    +

    Iframe background

    +
    + +
    +
    +

    Same background twice vertical (1/2)

    +
    +
    +

    Same background twice vertical (2/2)

    +
    +
    + +
    +

    Same background from horizontal to vertical (1/3)

    +
    +
    +
    +

    Same background from horizontal to vertical (2/3)

    +
    +
    +

    Same background from horizontal to vertical (3/3)

    +
    +
    + +
    + +
    + + + + + + + diff --git a/yknjs/reveal.js/test/examples/slide-transitions.html b/yknjs/reveal.js/test/examples/slide-transitions.html new file mode 100644 index 0000000..b7520ab --- /dev/null +++ b/yknjs/reveal.js/test/examples/slide-transitions.html @@ -0,0 +1,100 @@ + + + + + + + reveal.js - Slide Transitions + + + + + + + + +
    + +
    + +
    +

    Default

    +
    + +
    +

    Default

    +
    + +
    +

    data-transition: zoom

    +
    + +
    +

    data-transition: zoom-in fade-out

    +
    + +
    +

    Default

    +
    + +
    +

    data-transition: convex

    +
    + +
    +

    data-transition: convex-in concave-out

    +
    + +
    +
    +

    Default

    +
    +
    +

    data-transition: concave

    +
    +
    +

    data-transition: convex-in fade-out

    +
    +
    +

    Default

    +
    +
    + +
    +

    data-transition: none

    +
    + +
    +

    Default

    +
    + +
    + +
    + + + + + + + diff --git a/yknjs/reveal.js/test/qunit-2.5.0.css b/yknjs/reveal.js/test/qunit-2.5.0.css new file mode 100644 index 0000000..21ac68b --- /dev/null +++ b/yknjs/reveal.js/test/qunit-2.5.0.css @@ -0,0 +1,436 @@ +/*! + * QUnit 2.5.0 + * https://qunitjs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2018-01-10T02:56Z + */ + +/** Font Family and Sizes */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult { + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; +} + +#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } +#qunit-tests { font-size: smaller; } + + +/** Resets */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { + margin: 0; + padding: 0; +} + + +/** Header (excluding toolbar) */ + +#qunit-header { + padding: 0.5em 0 0.5em 1em; + + color: #8699A4; + background-color: #0D3349; + + font-size: 1.5em; + line-height: 1em; + font-weight: 400; + + border-radius: 5px 5px 0 0; +} + +#qunit-header a { + text-decoration: none; + color: #C2CCD1; +} + +#qunit-header a:hover, +#qunit-header a:focus { + color: #FFF; +} + +#qunit-banner { + height: 5px; +} + +#qunit-filteredTest { + padding: 0.5em 1em 0.5em 1em; + color: #366097; + background-color: #F4FF77; +} + +#qunit-userAgent { + padding: 0.5em 1em 0.5em 1em; + color: #FFF; + background-color: #2B81AF; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} + + +/** Toolbar */ + +#qunit-testrunner-toolbar { + padding: 0.5em 1em 0.5em 1em; + color: #5E740B; + background-color: #EEE; +} + +#qunit-testrunner-toolbar .clearfix { + height: 0; + clear: both; +} + +#qunit-testrunner-toolbar label { + display: inline-block; +} + +#qunit-testrunner-toolbar input[type=checkbox], +#qunit-testrunner-toolbar input[type=radio] { + margin: 3px; + vertical-align: -2px; +} + +#qunit-testrunner-toolbar input[type=text] { + box-sizing: border-box; + height: 1.6em; +} + +.qunit-url-config, +.qunit-filter, +#qunit-modulefilter { + display: inline-block; + line-height: 2.1em; +} + +.qunit-filter, +#qunit-modulefilter { + float: right; + position: relative; + margin-left: 1em; +} + +.qunit-url-config label { + margin-right: 0.5em; +} + +#qunit-modulefilter-search { + box-sizing: border-box; + width: 400px; +} + +#qunit-modulefilter-search-container:after { + position: absolute; + right: 0.3em; + content: "\25bc"; + color: black; +} + +#qunit-modulefilter-dropdown { + /* align with #qunit-modulefilter-search */ + box-sizing: border-box; + width: 400px; + position: absolute; + right: 0; + top: 50%; + margin-top: 0.8em; + + border: 1px solid #D3D3D3; + border-top: none; + border-radius: 0 0 .25em .25em; + color: #000; + background-color: #F5F5F5; + z-index: 99; +} + +#qunit-modulefilter-dropdown a { + color: inherit; + text-decoration: none; +} + +#qunit-modulefilter-dropdown .clickable.checked { + font-weight: bold; + color: #000; + background-color: #D2E0E6; +} + +#qunit-modulefilter-dropdown .clickable:hover { + color: #FFF; + background-color: #0D3349; +} + +#qunit-modulefilter-actions { + display: block; + overflow: auto; + + /* align with #qunit-modulefilter-dropdown-list */ + font: smaller/1.5em sans-serif; +} + +#qunit-modulefilter-dropdown #qunit-modulefilter-actions > * { + box-sizing: border-box; + max-height: 2.8em; + display: block; + padding: 0.4em; +} + +#qunit-modulefilter-dropdown #qunit-modulefilter-actions > button { + float: right; + font: inherit; +} + +#qunit-modulefilter-dropdown #qunit-modulefilter-actions > :last-child { + /* insert padding to align with checkbox margins */ + padding-left: 3px; +} + +#qunit-modulefilter-dropdown-list { + max-height: 200px; + overflow-y: auto; + margin: 0; + border-top: 2px groove threedhighlight; + padding: 0.4em 0 0; + font: smaller/1.5em sans-serif; +} + +#qunit-modulefilter-dropdown-list li { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#qunit-modulefilter-dropdown-list .clickable { + display: block; + padding-left: 0.15em; +} + + +/** Tests: Pass/Fail */ + +#qunit-tests { + list-style-position: inside; +} + +#qunit-tests li { + padding: 0.4em 1em 0.4em 1em; + border-bottom: 1px solid #FFF; + list-style-position: inside; +} + +#qunit-tests > li { + display: none; +} + +#qunit-tests li.running, +#qunit-tests li.pass, +#qunit-tests li.fail, +#qunit-tests li.skipped, +#qunit-tests li.aborted { + display: list-item; +} + +#qunit-tests.hidepass { + position: relative; +} + +#qunit-tests.hidepass li.running, +#qunit-tests.hidepass li.pass:not(.todo) { + visibility: hidden; + position: absolute; + width: 0; + height: 0; + padding: 0; + border: 0; + margin: 0; +} + +#qunit-tests li strong { + cursor: pointer; +} + +#qunit-tests li.skipped strong { + cursor: default; +} + +#qunit-tests li a { + padding: 0.5em; + color: #C2CCD1; + text-decoration: none; +} + +#qunit-tests li p a { + padding: 0.25em; + color: #6B6464; +} +#qunit-tests li a:hover, +#qunit-tests li a:focus { + color: #000; +} + +#qunit-tests li .runtime { + float: right; + font-size: smaller; +} + +.qunit-assert-list { + margin-top: 0.5em; + padding: 0.5em; + + background-color: #FFF; + + border-radius: 5px; +} + +.qunit-source { + margin: 0.6em 0 0.3em; +} + +.qunit-collapsed { + display: none; +} + +#qunit-tests table { + border-collapse: collapse; + margin-top: 0.2em; +} + +#qunit-tests th { + text-align: right; + vertical-align: top; + padding: 0 0.5em 0 0; +} + +#qunit-tests td { + vertical-align: top; +} + +#qunit-tests pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; +} + +#qunit-tests del { + color: #374E0C; + background-color: #E0F2BE; + text-decoration: none; +} + +#qunit-tests ins { + color: #500; + background-color: #FFCACA; + text-decoration: none; +} + +/*** Test Counts */ + +#qunit-tests b.counts { color: #000; } +#qunit-tests b.passed { color: #5E740B; } +#qunit-tests b.failed { color: #710909; } + +#qunit-tests li li { + padding: 5px; + background-color: #FFF; + border-bottom: none; + list-style-position: inside; +} + +/*** Passing Styles */ + +#qunit-tests li li.pass { + color: #3C510C; + background-color: #FFF; + border-left: 10px solid #C6E746; +} + +#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } +#qunit-tests .pass .test-name { color: #366097; } + +#qunit-tests .pass .test-actual, +#qunit-tests .pass .test-expected { color: #999; } + +#qunit-banner.qunit-pass { background-color: #C6E746; } + +/*** Failing Styles */ + +#qunit-tests li li.fail { + color: #710909; + background-color: #FFF; + border-left: 10px solid #EE5757; + white-space: pre; +} + +#qunit-tests > li:last-child { + border-radius: 0 0 5px 5px; +} + +#qunit-tests .fail { color: #000; background-color: #EE5757; } +#qunit-tests .fail .test-name, +#qunit-tests .fail .module-name { color: #000; } + +#qunit-tests .fail .test-actual { color: #EE5757; } +#qunit-tests .fail .test-expected { color: #008000; } + +#qunit-banner.qunit-fail { background-color: #EE5757; } + + +/*** Aborted tests */ +#qunit-tests .aborted { color: #000; background-color: orange; } +/*** Skipped tests */ + +#qunit-tests .skipped { + background-color: #EBECE9; +} + +#qunit-tests .qunit-todo-label, +#qunit-tests .qunit-skipped-label { + background-color: #F4FF77; + display: inline-block; + font-style: normal; + color: #366097; + line-height: 1.8em; + padding: 0 0.5em; + margin: -0.4em 0.4em -0.4em 0; +} + +#qunit-tests .qunit-todo-label { + background-color: #EEE; +} + +/** Result */ + +#qunit-testresult { + color: #2B81AF; + background-color: #D2E0E6; + + border-bottom: 1px solid #FFF; +} +#qunit-testresult .clearfix { + height: 0; + clear: both; +} +#qunit-testresult .module-name { + font-weight: 700; +} +#qunit-testresult-display { + padding: 0.5em 1em 0.5em 1em; + width: 85%; + float:left; +} +#qunit-testresult-controls { + padding: 0.5em 1em 0.5em 1em; + width: 10%; + float:left; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; + width: 1000px; + height: 1000px; +} diff --git a/yknjs/reveal.js/test/qunit-2.5.0.js b/yknjs/reveal.js/test/qunit-2.5.0.js new file mode 100644 index 0000000..db72a26 --- /dev/null +++ b/yknjs/reveal.js/test/qunit-2.5.0.js @@ -0,0 +1,5188 @@ +/*! + * QUnit 2.5.0 + * https://qunitjs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2018-01-10T02:56Z + */ +(function (global$1) { + 'use strict'; + + global$1 = global$1 && global$1.hasOwnProperty('default') ? global$1['default'] : global$1; + + var window = global$1.window; + var self$1 = global$1.self; + var console = global$1.console; + var setTimeout = global$1.setTimeout; + var clearTimeout = global$1.clearTimeout; + + var document = window && window.document; + var navigator = window && window.navigator; + + var localSessionStorage = function () { + var x = "qunit-test-string"; + try { + global$1.sessionStorage.setItem(x, x); + global$1.sessionStorage.removeItem(x); + return global$1.sessionStorage; + } catch (e) { + return undefined; + } + }(); + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + + + + + + + + + + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } + }; + + var toString = Object.prototype.toString; + var hasOwn = Object.prototype.hasOwnProperty; + var now = Date.now || function () { + return new Date().getTime(); + }; + + var defined = { + document: window && window.document !== undefined, + setTimeout: setTimeout !== undefined + }; + + // Returns a new Array with the elements that are in a but not in b + function diff(a, b) { + var i, + j, + result = a.slice(); + + for (i = 0; i < result.length; i++) { + for (j = 0; j < b.length; j++) { + if (result[i] === b[j]) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; + } + + /** + * Determines whether an element exists in a given array or not. + * + * @method inArray + * @param {Any} elem + * @param {Array} array + * @return {Boolean} + */ + function inArray(elem, array) { + return array.indexOf(elem) !== -1; + } + + /** + * Makes a clone of an object using only Array or Object as base, + * and copies over the own enumerable properties. + * + * @param {Object} obj + * @return {Object} New object with only the own properties (recursively). + */ + function objectValues(obj) { + var key, + val, + vals = is("array", obj) ? [] : {}; + for (key in obj) { + if (hasOwn.call(obj, key)) { + val = obj[key]; + vals[key] = val === Object(val) ? objectValues(val) : val; + } + } + return vals; + } + + function extend(a, b, undefOnly) { + for (var prop in b) { + if (hasOwn.call(b, prop)) { + if (b[prop] === undefined) { + delete a[prop]; + } else if (!(undefOnly && typeof a[prop] !== "undefined")) { + a[prop] = b[prop]; + } + } + } + + return a; + } + + function objectType(obj) { + if (typeof obj === "undefined") { + return "undefined"; + } + + // Consider: typeof null === object + if (obj === null) { + return "null"; + } + + var match = toString.call(obj).match(/^\[object\s(.*)\]$/), + type = match && match[1]; + + switch (type) { + case "Number": + if (isNaN(obj)) { + return "nan"; + } + return "number"; + case "String": + case "Boolean": + case "Array": + case "Set": + case "Map": + case "Date": + case "RegExp": + case "Function": + case "Symbol": + return type.toLowerCase(); + default: + return typeof obj === "undefined" ? "undefined" : _typeof(obj); + } + } + + // Safe object type checking + function is(type, obj) { + return objectType(obj) === type; + } + + // Based on Java's String.hashCode, a simple but not + // rigorously collision resistant hashing function + function generateHash(module, testName) { + var str = module + "\x1C" + testName; + var hash = 0; + + for (var i = 0; i < str.length; i++) { + hash = (hash << 5) - hash + str.charCodeAt(i); + hash |= 0; + } + + // Convert the possibly negative integer hash code into an 8 character hex string, which isn't + // strictly necessary but increases user understanding that the id is a SHA-like hash + var hex = (0x100000000 + hash).toString(16); + if (hex.length < 8) { + hex = "0000000" + hex; + } + + return hex.slice(-8); + } + + // Test for equality any JavaScript type. + // Authors: Philippe Rathé , David Chan + var equiv = (function () { + + // Value pairs queued for comparison. Used for breadth-first processing order, recursion + // detection and avoiding repeated comparison (see below for details). + // Elements are { a: val, b: val }. + var pairs = []; + + var getProto = Object.getPrototypeOf || function (obj) { + return obj.__proto__; + }; + + function useStrictEquality(a, b) { + + // This only gets called if a and b are not strict equal, and is used to compare on + // the primitive values inside object wrappers. For example: + // `var i = 1;` + // `var j = new Number(1);` + // Neither a nor b can be null, as a !== b and they have the same type. + if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object") { + a = a.valueOf(); + } + if ((typeof b === "undefined" ? "undefined" : _typeof(b)) === "object") { + b = b.valueOf(); + } + + return a === b; + } + + function compareConstructors(a, b) { + var protoA = getProto(a); + var protoB = getProto(b); + + // Comparing constructors is more strict than using `instanceof` + if (a.constructor === b.constructor) { + return true; + } + + // Ref #851 + // If the obj prototype descends from a null constructor, treat it + // as a null prototype. + if (protoA && protoA.constructor === null) { + protoA = null; + } + if (protoB && protoB.constructor === null) { + protoB = null; + } + + // Allow objects with no prototype to be equivalent to + // objects with Object as their constructor. + if (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) { + return true; + } + + return false; + } + + function getRegExpFlags(regexp) { + return "flags" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0]; + } + + function isContainer(val) { + return ["object", "array", "map", "set"].indexOf(objectType(val)) !== -1; + } + + function breadthFirstCompareChild(a, b) { + + // If a is a container not reference-equal to b, postpone the comparison to the + // end of the pairs queue -- unless (a, b) has been seen before, in which case skip + // over the pair. + if (a === b) { + return true; + } + if (!isContainer(a)) { + return typeEquiv(a, b); + } + if (pairs.every(function (pair) { + return pair.a !== a || pair.b !== b; + })) { + + // Not yet started comparing this pair + pairs.push({ a: a, b: b }); + } + return true; + } + + var callbacks = { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + "symbol": useStrictEquality, + "date": useStrictEquality, + + "nan": function nan() { + return true; + }, + + "regexp": function regexp(a, b) { + return a.source === b.source && + + // Include flags in the comparison + getRegExpFlags(a) === getRegExpFlags(b); + }, + + // abort (identical references / instance methods were skipped earlier) + "function": function _function() { + return false; + }, + + "array": function array(a, b) { + var i, len; + + len = a.length; + if (len !== b.length) { + + // Safe and faster + return false; + } + + for (i = 0; i < len; i++) { + + // Compare non-containers; queue non-reference-equal containers + if (!breadthFirstCompareChild(a[i], b[i])) { + return false; + } + } + return true; + }, + + // Define sets a and b to be equivalent if for each element aVal in a, there + // is some element bVal in b such that aVal and bVal are equivalent. Element + // repetitions are not counted, so these are equivalent: + // a = new Set( [ {}, [], [] ] ); + // b = new Set( [ {}, {}, [] ] ); + "set": function set$$1(a, b) { + var innerEq, + outerEq = true; + + if (a.size !== b.size) { + + // This optimization has certain quirks because of the lack of + // repetition counting. For instance, adding the same + // (reference-identical) element to two equivalent sets can + // make them non-equivalent. + return false; + } + + a.forEach(function (aVal) { + + // Short-circuit if the result is already known. (Using for...of + // with a break clause would be cleaner here, but it would cause + // a syntax error on older Javascript implementations even if + // Set is unused) + if (!outerEq) { + return; + } + + innerEq = false; + + b.forEach(function (bVal) { + var parentPairs; + + // Likewise, short-circuit if the result is already known + if (innerEq) { + return; + } + + // Swap out the global pairs list, as the nested call to + // innerEquiv will clobber its contents + parentPairs = pairs; + if (innerEquiv(bVal, aVal)) { + innerEq = true; + } + + // Replace the global pairs list + pairs = parentPairs; + }); + + if (!innerEq) { + outerEq = false; + } + }); + + return outerEq; + }, + + // Define maps a and b to be equivalent if for each key-value pair (aKey, aVal) + // in a, there is some key-value pair (bKey, bVal) in b such that + // [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not + // counted, so these are equivalent: + // a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] ); + // b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] ); + "map": function map(a, b) { + var innerEq, + outerEq = true; + + if (a.size !== b.size) { + + // This optimization has certain quirks because of the lack of + // repetition counting. For instance, adding the same + // (reference-identical) key-value pair to two equivalent maps + // can make them non-equivalent. + return false; + } + + a.forEach(function (aVal, aKey) { + + // Short-circuit if the result is already known. (Using for...of + // with a break clause would be cleaner here, but it would cause + // a syntax error on older Javascript implementations even if + // Map is unused) + if (!outerEq) { + return; + } + + innerEq = false; + + b.forEach(function (bVal, bKey) { + var parentPairs; + + // Likewise, short-circuit if the result is already known + if (innerEq) { + return; + } + + // Swap out the global pairs list, as the nested call to + // innerEquiv will clobber its contents + parentPairs = pairs; + if (innerEquiv([bVal, bKey], [aVal, aKey])) { + innerEq = true; + } + + // Replace the global pairs list + pairs = parentPairs; + }); + + if (!innerEq) { + outerEq = false; + } + }); + + return outerEq; + }, + + "object": function object(a, b) { + var i, + aProperties = [], + bProperties = []; + + if (compareConstructors(a, b) === false) { + return false; + } + + // Be strict: don't ensure hasOwnProperty and go deep + for (i in a) { + + // Collect a's properties + aProperties.push(i); + + // Skip OOP methods that look the same + if (a.constructor !== Object && typeof a.constructor !== "undefined" && typeof a[i] === "function" && typeof b[i] === "function" && a[i].toString() === b[i].toString()) { + continue; + } + + // Compare non-containers; queue non-reference-equal containers + if (!breadthFirstCompareChild(a[i], b[i])) { + return false; + } + } + + for (i in b) { + + // Collect b's properties + bProperties.push(i); + } + + // Ensures identical properties name + return typeEquiv(aProperties.sort(), bProperties.sort()); + } + }; + + function typeEquiv(a, b) { + var type = objectType(a); + + // Callbacks for containers will append to the pairs queue to achieve breadth-first + // search order. The pairs queue is also used to avoid reprocessing any pair of + // containers that are reference-equal to a previously visited pair (a special case + // this being recursion detection). + // + // Because of this approach, once typeEquiv returns a false value, it should not be + // called again without clearing the pair queue else it may wrongly report a visited + // pair as being equivalent. + return objectType(b) === type && callbacks[type](a, b); + } + + function innerEquiv(a, b) { + var i, pair; + + // We're done when there's nothing more to compare + if (arguments.length < 2) { + return true; + } + + // Clear the global pair queue and add the top-level values being compared + pairs = [{ a: a, b: b }]; + + for (i = 0; i < pairs.length; i++) { + pair = pairs[i]; + + // Perform type-specific comparison on any pairs that are not strictly + // equal. For container types, that comparison will postpone comparison + // of any sub-container pair to the end of the pair queue. This gives + // breadth-first search order. It also avoids the reprocessing of + // reference-equal siblings, cousins etc, which can have a significant speed + // impact when comparing a container of small objects each of which has a + // reference to the same (singleton) large object. + if (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) { + return false; + } + } + + // ...across all consecutive argument pairs + return arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1)); + } + + return function () { + var result = innerEquiv.apply(undefined, arguments); + + // Release any retained objects + pairs.length = 0; + return result; + }; + })(); + + /** + * Config object: Maintain internal state + * Later exposed as QUnit.config + * `config` initialized at top of scope + */ + var config = { + + // The queue of tests to run + queue: [], + + // Block until document ready + blocking: true, + + // By default, run previously failed tests first + // very useful in combination with "Hide passed tests" checked + reorder: true, + + // By default, modify document.title when suite is done + altertitle: true, + + // HTML Reporter: collapse every test except the first failing test + // If false, all failing tests will be expanded + collapse: true, + + // By default, scroll to top of the page when suite is done + scrolltop: true, + + // Depth up-to which object will be dumped + maxDepth: 5, + + // When enabled, all tests must call expect() + requireExpects: false, + + // Placeholder for user-configurable form-exposed URL parameters + urlConfig: [], + + // Set of all modules. + modules: [], + + // The first unnamed module + currentModule: { + name: "", + tests: [], + childModules: [], + testsRun: 0, + unskippedTestsRun: 0, + hooks: { + before: [], + beforeEach: [], + afterEach: [], + after: [] + } + }, + + callbacks: {}, + + // The storage module to use for reordering tests + storage: localSessionStorage + }; + + // take a predefined QUnit.config and extend the defaults + var globalConfig = window && window.QUnit && window.QUnit.config; + + // only extend the global config if there is no QUnit overload + if (window && window.QUnit && !window.QUnit.version) { + extend(config, globalConfig); + } + + // Push a loose unnamed module to the modules collection + config.modules.push(config.currentModule); + + // Based on jsDump by Ariel Flesler + // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html + var dump = (function () { + function quote(str) { + return "\"" + str.toString().replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\""; + } + function literal(o) { + return o + ""; + } + function join(pre, arr, post) { + var s = dump.separator(), + base = dump.indent(), + inner = dump.indent(1); + if (arr.join) { + arr = arr.join("," + s + inner); + } + if (!arr) { + return pre + post; + } + return [pre, inner + arr, base + post].join(s); + } + function array(arr, stack) { + var i = arr.length, + ret = new Array(i); + + if (dump.maxDepth && dump.depth > dump.maxDepth) { + return "[object Array]"; + } + + this.up(); + while (i--) { + ret[i] = this.parse(arr[i], undefined, stack); + } + this.down(); + return join("[", ret, "]"); + } + + function isArray(obj) { + return ( + + //Native Arrays + toString.call(obj) === "[object Array]" || + + // NodeList objects + typeof obj.length === "number" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined) + ); + } + + var reName = /^function (\w+)/, + dump = { + + // The objType is used mostly internally, you can fix a (custom) type in advance + parse: function parse(obj, objType, stack) { + stack = stack || []; + var res, + parser, + parserType, + objIndex = stack.indexOf(obj); + + if (objIndex !== -1) { + return "recursion(" + (objIndex - stack.length) + ")"; + } + + objType = objType || this.typeOf(obj); + parser = this.parsers[objType]; + parserType = typeof parser === "undefined" ? "undefined" : _typeof(parser); + + if (parserType === "function") { + stack.push(obj); + res = parser.call(this, obj, stack); + stack.pop(); + return res; + } + return parserType === "string" ? parser : this.parsers.error; + }, + typeOf: function typeOf(obj) { + var type; + + if (obj === null) { + type = "null"; + } else if (typeof obj === "undefined") { + type = "undefined"; + } else if (is("regexp", obj)) { + type = "regexp"; + } else if (is("date", obj)) { + type = "date"; + } else if (is("function", obj)) { + type = "function"; + } else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) { + type = "window"; + } else if (obj.nodeType === 9) { + type = "document"; + } else if (obj.nodeType) { + type = "node"; + } else if (isArray(obj)) { + type = "array"; + } else if (obj.constructor === Error.prototype.constructor) { + type = "error"; + } else { + type = typeof obj === "undefined" ? "undefined" : _typeof(obj); + } + return type; + }, + + separator: function separator() { + if (this.multiline) { + return this.HTML ? "
    " : "\n"; + } else { + return this.HTML ? " " : " "; + } + }, + + // Extra can be a number, shortcut for increasing-calling-decreasing + indent: function indent(extra) { + if (!this.multiline) { + return ""; + } + var chr = this.indentChar; + if (this.HTML) { + chr = chr.replace(/\t/g, " ").replace(/ /g, " "); + } + return new Array(this.depth + (extra || 0)).join(chr); + }, + up: function up(a) { + this.depth += a || 1; + }, + down: function down(a) { + this.depth -= a || 1; + }, + setParser: function setParser(name, parser) { + this.parsers[name] = parser; + }, + + // The next 3 are exposed so you can use them + quote: quote, + literal: literal, + join: join, + depth: 1, + maxDepth: config.maxDepth, + + // This is the list of parsers, to modify them, use dump.setParser + parsers: { + window: "[Window]", + document: "[Document]", + error: function error(_error) { + return "Error(\"" + _error.message + "\")"; + }, + unknown: "[Unknown]", + "null": "null", + "undefined": "undefined", + "function": function _function(fn) { + var ret = "function", + + + // Functions never have name in IE + name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; + + if (name) { + ret += " " + name; + } + ret += "("; + + ret = [ret, dump.parse(fn, "functionArgs"), "){"].join(""); + return join(ret, dump.parse(fn, "functionCode"), "}"); + }, + array: array, + nodelist: array, + "arguments": array, + object: function object(map, stack) { + var keys, + key, + val, + i, + nonEnumerableProperties, + ret = []; + + if (dump.maxDepth && dump.depth > dump.maxDepth) { + return "[object Object]"; + } + + dump.up(); + keys = []; + for (key in map) { + keys.push(key); + } + + // Some properties are not always enumerable on Error objects. + nonEnumerableProperties = ["message", "name"]; + for (i in nonEnumerableProperties) { + key = nonEnumerableProperties[i]; + if (key in map && !inArray(key, keys)) { + keys.push(key); + } + } + keys.sort(); + for (i = 0; i < keys.length; i++) { + key = keys[i]; + val = map[key]; + ret.push(dump.parse(key, "key") + ": " + dump.parse(val, undefined, stack)); + } + dump.down(); + return join("{", ret, "}"); + }, + node: function node(_node) { + var len, + i, + val, + open = dump.HTML ? "<" : "<", + close = dump.HTML ? ">" : ">", + tag = _node.nodeName.toLowerCase(), + ret = open + tag, + attrs = _node.attributes; + + if (attrs) { + for (i = 0, len = attrs.length; i < len; i++) { + val = attrs[i].nodeValue; + + // IE6 includes all attributes in .attributes, even ones not explicitly + // set. Those have values like undefined, null, 0, false, "" or + // "inherit". + if (val && val !== "inherit") { + ret += " " + attrs[i].nodeName + "=" + dump.parse(val, "attribute"); + } + } + } + ret += close; + + // Show content of TextNode or CDATASection + if (_node.nodeType === 3 || _node.nodeType === 4) { + ret += _node.nodeValue; + } + + return ret + open + "/" + tag + close; + }, + + // Function calls it internally, it's the arguments part of the function + functionArgs: function functionArgs(fn) { + var args, + l = fn.length; + + if (!l) { + return ""; + } + + args = new Array(l); + while (l--) { + + // 97 is 'a' + args[l] = String.fromCharCode(97 + l); + } + return " " + args.join(", ") + " "; + }, + + // Object calls it internally, the key part of an item in a map + key: quote, + + // Function calls it internally, it's the content of the function + functionCode: "[code]", + + // Node calls it internally, it's a html attribute value + attribute: quote, + string: quote, + date: quote, + regexp: literal, + number: literal, + "boolean": literal, + symbol: function symbol(sym) { + return sym.toString(); + } + }, + + // If true, entities are escaped ( <, >, \t, space and \n ) + HTML: false, + + // Indentation unit + indentChar: " ", + + // If true, items in a collection, are separated by a \n, else just a space. + multiline: true + }; + + return dump; + })(); + + var LISTENERS = Object.create(null); + var SUPPORTED_EVENTS = ["runStart", "suiteStart", "testStart", "assertion", "testEnd", "suiteEnd", "runEnd"]; + + /** + * Emits an event with the specified data to all currently registered listeners. + * Callbacks will fire in the order in which they are registered (FIFO). This + * function is not exposed publicly; it is used by QUnit internals to emit + * logging events. + * + * @private + * @method emit + * @param {String} eventName + * @param {Object} data + * @return {Void} + */ + function emit(eventName, data) { + if (objectType(eventName) !== "string") { + throw new TypeError("eventName must be a string when emitting an event"); + } + + // Clone the callbacks in case one of them registers a new callback + var originalCallbacks = LISTENERS[eventName]; + var callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : []; + + for (var i = 0; i < callbacks.length; i++) { + callbacks[i](data); + } + } + + /** + * Registers a callback as a listener to the specified event. + * + * @public + * @method on + * @param {String} eventName + * @param {Function} callback + * @return {Void} + */ + function on(eventName, callback) { + if (objectType(eventName) !== "string") { + throw new TypeError("eventName must be a string when registering a listener"); + } else if (!inArray(eventName, SUPPORTED_EVENTS)) { + var events = SUPPORTED_EVENTS.join(", "); + throw new Error("\"" + eventName + "\" is not a valid event; must be one of: " + events + "."); + } else if (objectType(callback) !== "function") { + throw new TypeError("callback must be a function when registering a listener"); + } + + if (!LISTENERS[eventName]) { + LISTENERS[eventName] = []; + } + + // Don't register the same callback more than once + if (!inArray(callback, LISTENERS[eventName])) { + LISTENERS[eventName].push(callback); + } + } + + // Register logging callbacks + function registerLoggingCallbacks(obj) { + var i, + l, + key, + callbackNames = ["begin", "done", "log", "testStart", "testDone", "moduleStart", "moduleDone"]; + + function registerLoggingCallback(key) { + var loggingCallback = function loggingCallback(callback) { + if (objectType(callback) !== "function") { + throw new Error("QUnit logging methods require a callback function as their first parameters."); + } + + config.callbacks[key].push(callback); + }; + + return loggingCallback; + } + + for (i = 0, l = callbackNames.length; i < l; i++) { + key = callbackNames[i]; + + // Initialize key collection of logging callback + if (objectType(config.callbacks[key]) === "undefined") { + config.callbacks[key] = []; + } + + obj[key] = registerLoggingCallback(key); + } + } + + function runLoggingCallbacks(key, args) { + var i, l, callbacks; + + callbacks = config.callbacks[key]; + for (i = 0, l = callbacks.length; i < l; i++) { + callbacks[i](args); + } + } + + // Doesn't support IE9, it will return undefined on these browsers + // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack + var fileName = (sourceFromStacktrace(0) || "").replace(/(:\d+)+\)?/, "").replace(/.+\//, ""); + + function extractStacktrace(e, offset) { + offset = offset === undefined ? 4 : offset; + + var stack, include, i; + + if (e && e.stack) { + stack = e.stack.split("\n"); + if (/^error$/i.test(stack[0])) { + stack.shift(); + } + if (fileName) { + include = []; + for (i = offset; i < stack.length; i++) { + if (stack[i].indexOf(fileName) !== -1) { + break; + } + include.push(stack[i]); + } + if (include.length) { + return include.join("\n"); + } + } + return stack[offset]; + } + } + + function sourceFromStacktrace(offset) { + var error = new Error(); + + // Support: Safari <=7 only, IE <=10 - 11 only + // Not all browsers generate the `stack` property for `new Error()`, see also #636 + if (!error.stack) { + try { + throw error; + } catch (err) { + error = err; + } + } + + return extractStacktrace(error, offset); + } + + var priorityCount = 0; + var unitSampler = void 0; + + /** + * Advances the ProcessingQueue to the next item if it is ready. + * @param {Boolean} last + */ + function advance() { + var start = now(); + config.depth = (config.depth || 0) + 1; + + while (config.queue.length && !config.blocking) { + var elapsedTime = now() - start; + + if (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) { + if (priorityCount > 0) { + priorityCount--; + } + + config.queue.shift()(); + } else { + setTimeout(advance); + break; + } + } + + config.depth--; + + if (!config.blocking && !config.queue.length && config.depth === 0) { + done(); + } + } + + function addToQueueImmediate(callback) { + if (objectType(callback) === "array") { + while (callback.length) { + addToQueueImmediate(callback.pop()); + } + + return; + } + + config.queue.unshift(callback); + priorityCount++; + } + + /** + * Adds a function to the ProcessingQueue for execution. + * @param {Function|Array} callback + * @param {Boolean} priority + * @param {String} seed + */ + function addToQueue(callback, prioritize, seed) { + if (prioritize) { + config.queue.splice(priorityCount++, 0, callback); + } else if (seed) { + if (!unitSampler) { + unitSampler = unitSamplerGenerator(seed); + } + + // Insert into a random position after all prioritized items + var index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1)); + config.queue.splice(priorityCount + index, 0, callback); + } else { + config.queue.push(callback); + } + } + + /** + * Creates a seeded "sample" generator which is used for randomizing tests. + */ + function unitSamplerGenerator(seed) { + + // 32-bit xorshift, requires only a nonzero seed + // http://excamera.com/sphinx/article-xorshift.html + var sample = parseInt(generateHash(seed), 16) || -1; + return function () { + sample ^= sample << 13; + sample ^= sample >>> 17; + sample ^= sample << 5; + + // ECMAScript has no unsigned number type + if (sample < 0) { + sample += 0x100000000; + } + + return sample / 0x100000000; + }; + } + + /** + * This function is called when the ProcessingQueue is done processing all + * items. It handles emitting the final run events. + */ + function done() { + var storage = config.storage; + + ProcessingQueue.finished = true; + + var runtime = now() - config.started; + var passed = config.stats.all - config.stats.bad; + + emit("runEnd", globalSuite.end(true)); + runLoggingCallbacks("done", { + passed: passed, + failed: config.stats.bad, + total: config.stats.all, + runtime: runtime + }); + + // Clear own storage items if all tests passed + if (storage && config.stats.bad === 0) { + for (var i = storage.length - 1; i >= 0; i--) { + var key = storage.key(i); + + if (key.indexOf("qunit-test-") === 0) { + storage.removeItem(key); + } + } + } + } + + var ProcessingQueue = { + finished: false, + add: addToQueue, + addImmediate: addToQueueImmediate, + advance: advance + }; + + var TestReport = function () { + function TestReport(name, suite, options) { + classCallCheck(this, TestReport); + + this.name = name; + this.suiteName = suite.name; + this.fullName = suite.fullName.concat(name); + this.runtime = 0; + this.assertions = []; + + this.skipped = !!options.skip; + this.todo = !!options.todo; + + this.valid = options.valid; + + this._startTime = 0; + this._endTime = 0; + + suite.pushTest(this); + } + + createClass(TestReport, [{ + key: "start", + value: function start(recordTime) { + if (recordTime) { + this._startTime = Date.now(); + } + + return { + name: this.name, + suiteName: this.suiteName, + fullName: this.fullName.slice() + }; + } + }, { + key: "end", + value: function end(recordTime) { + if (recordTime) { + this._endTime = Date.now(); + } + + return extend(this.start(), { + runtime: this.getRuntime(), + status: this.getStatus(), + errors: this.getFailedAssertions(), + assertions: this.getAssertions() + }); + } + }, { + key: "pushAssertion", + value: function pushAssertion(assertion) { + this.assertions.push(assertion); + } + }, { + key: "getRuntime", + value: function getRuntime() { + return this._endTime - this._startTime; + } + }, { + key: "getStatus", + value: function getStatus() { + if (this.skipped) { + return "skipped"; + } + + var testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo; + + if (!testPassed) { + return "failed"; + } else if (this.todo) { + return "todo"; + } else { + return "passed"; + } + } + }, { + key: "getFailedAssertions", + value: function getFailedAssertions() { + return this.assertions.filter(function (assertion) { + return !assertion.passed; + }); + } + }, { + key: "getAssertions", + value: function getAssertions() { + return this.assertions.slice(); + } + + // Remove actual and expected values from assertions. This is to prevent + // leaking memory throughout a test suite. + + }, { + key: "slimAssertions", + value: function slimAssertions() { + this.assertions = this.assertions.map(function (assertion) { + delete assertion.actual; + delete assertion.expected; + return assertion; + }); + } + }]); + return TestReport; + }(); + + var focused$1 = false; + + function Test(settings) { + var i, l; + + ++Test.count; + + this.expected = null; + this.assertions = []; + this.semaphore = 0; + this.module = config.currentModule; + this.stack = sourceFromStacktrace(3); + this.steps = []; + this.timeout = undefined; + + // If a module is skipped, all its tests and the tests of the child suites + // should be treated as skipped even if they are defined as `only` or `todo`. + // As for `todo` module, all its tests will be treated as `todo` except for + // tests defined as `skip` which will be left intact. + // + // So, if a test is defined as `todo` and is inside a skipped module, we should + // then treat that test as if was defined as `skip`. + if (this.module.skip) { + settings.skip = true; + settings.todo = false; + + // Skipped tests should be left intact + } else if (this.module.todo && !settings.skip) { + settings.todo = true; + } + + extend(this, settings); + + this.testReport = new TestReport(settings.testName, this.module.suiteReport, { + todo: settings.todo, + skip: settings.skip, + valid: this.valid() + }); + + // Register unique strings + for (i = 0, l = this.module.tests; i < l.length; i++) { + if (this.module.tests[i].name === this.testName) { + this.testName += " "; + } + } + + this.testId = generateHash(this.module.name, this.testName); + + this.module.tests.push({ + name: this.testName, + testId: this.testId, + skip: !!settings.skip + }); + + if (settings.skip) { + + // Skipped tests will fully ignore any sent callback + this.callback = function () {}; + this.async = false; + this.expected = 0; + } else { + if (typeof this.callback !== "function") { + var method = this.todo ? "todo" : "test"; + + // eslint-disable-next-line max-len + throw new TypeError("You must provide a function as a test callback to QUnit." + method + "(\"" + settings.testName + "\")"); + } + + this.assert = new Assert(this); + } + } + + Test.count = 0; + + function getNotStartedModules(startModule) { + var module = startModule, + modules = []; + + while (module && module.testsRun === 0) { + modules.push(module); + module = module.parentModule; + } + + return modules; + } + + Test.prototype = { + before: function before() { + var i, + startModule, + module = this.module, + notStartedModules = getNotStartedModules(module); + + for (i = notStartedModules.length - 1; i >= 0; i--) { + startModule = notStartedModules[i]; + startModule.stats = { all: 0, bad: 0, started: now() }; + emit("suiteStart", startModule.suiteReport.start(true)); + runLoggingCallbacks("moduleStart", { + name: startModule.name, + tests: startModule.tests + }); + } + + config.current = this; + + this.testEnvironment = extend({}, module.testEnvironment); + + this.started = now(); + emit("testStart", this.testReport.start(true)); + runLoggingCallbacks("testStart", { + name: this.testName, + module: module.name, + testId: this.testId, + previousFailure: this.previousFailure + }); + + if (!config.pollution) { + saveGlobal(); + } + }, + + run: function run() { + var promise; + + config.current = this; + + this.callbackStarted = now(); + + if (config.notrycatch) { + runTest(this); + return; + } + + try { + runTest(this); + } catch (e) { + this.pushFailure("Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + (e.message || e), extractStacktrace(e, 0)); + + // Else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if (config.blocking) { + internalRecover(this); + } + } + + function runTest(test) { + promise = test.callback.call(test.testEnvironment, test.assert); + test.resolvePromise(promise); + + // If the test has a "lock" on it, but the timeout is 0, then we push a + // failure as the test should be synchronous. + if (test.timeout === 0 && test.semaphore !== 0) { + pushFailure("Test did not finish synchronously even though assert.timeout( 0 ) was used.", sourceFromStacktrace(2)); + } + } + }, + + after: function after() { + checkPollution(); + }, + + queueHook: function queueHook(hook, hookName, hookOwner) { + var _this = this; + + var callHook = function callHook() { + var promise = hook.call(_this.testEnvironment, _this.assert); + _this.resolvePromise(promise, hookName); + }; + + var runHook = function runHook() { + if (hookName === "before") { + if (hookOwner.unskippedTestsRun !== 0) { + return; + } + + _this.preserveEnvironment = true; + } + + if (hookName === "after" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && config.queue.length > 2) { + return; + } + + config.current = _this; + if (config.notrycatch) { + callHook(); + return; + } + try { + callHook(); + } catch (error) { + _this.pushFailure(hookName + " failed on " + _this.testName + ": " + (error.message || error), extractStacktrace(error, 0)); + } + }; + + return runHook; + }, + + + // Currently only used for module level hooks, can be used to add global level ones + hooks: function hooks(handler) { + var hooks = []; + + function processHooks(test, module) { + if (module.parentModule) { + processHooks(test, module.parentModule); + } + + if (module.hooks[handler].length) { + for (var i = 0; i < module.hooks[handler].length; i++) { + hooks.push(test.queueHook(module.hooks[handler][i], handler, module)); + } + } + } + + // Hooks are ignored on skipped tests + if (!this.skip) { + processHooks(this, this.module); + } + + return hooks; + }, + + + finish: function finish() { + config.current = this; + if (config.requireExpects && this.expected === null) { + this.pushFailure("Expected number of assertions to be defined, but expect() was " + "not called.", this.stack); + } else if (this.expected !== null && this.expected !== this.assertions.length) { + this.pushFailure("Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack); + } else if (this.expected === null && !this.assertions.length) { + this.pushFailure("Expected at least one assertion, but none were run - call " + "expect(0) to accept zero assertions.", this.stack); + } + + var i, + module = this.module, + moduleName = module.name, + testName = this.testName, + skipped = !!this.skip, + todo = !!this.todo, + bad = 0, + storage = config.storage; + + this.runtime = now() - this.started; + + config.stats.all += this.assertions.length; + module.stats.all += this.assertions.length; + + for (i = 0; i < this.assertions.length; i++) { + if (!this.assertions[i].result) { + bad++; + config.stats.bad++; + module.stats.bad++; + } + } + + notifyTestsRan(module, skipped); + + // Store result when possible + if (storage) { + if (bad) { + storage.setItem("qunit-test-" + moduleName + "-" + testName, bad); + } else { + storage.removeItem("qunit-test-" + moduleName + "-" + testName); + } + } + + // After emitting the js-reporters event we cleanup the assertion data to + // avoid leaking it. It is not used by the legacy testDone callbacks. + emit("testEnd", this.testReport.end(true)); + this.testReport.slimAssertions(); + + runLoggingCallbacks("testDone", { + name: testName, + module: moduleName, + skipped: skipped, + todo: todo, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length, + runtime: skipped ? 0 : this.runtime, + + // HTML Reporter use + assertions: this.assertions, + testId: this.testId, + + // Source of Test + source: this.stack + }); + + if (module.testsRun === numberOfTests(module)) { + logSuiteEnd(module); + + // Check if the parent modules, iteratively, are done. If that the case, + // we emit the `suiteEnd` event and trigger `moduleDone` callback. + var parent = module.parentModule; + while (parent && parent.testsRun === numberOfTests(parent)) { + logSuiteEnd(parent); + parent = parent.parentModule; + } + } + + config.current = undefined; + + function logSuiteEnd(module) { + emit("suiteEnd", module.suiteReport.end(true)); + runLoggingCallbacks("moduleDone", { + name: module.name, + tests: module.tests, + failed: module.stats.bad, + passed: module.stats.all - module.stats.bad, + total: module.stats.all, + runtime: now() - module.stats.started + }); + } + }, + + preserveTestEnvironment: function preserveTestEnvironment() { + if (this.preserveEnvironment) { + this.module.testEnvironment = this.testEnvironment; + this.testEnvironment = extend({}, this.module.testEnvironment); + } + }, + + queue: function queue() { + var test = this; + + if (!this.valid()) { + return; + } + + function runTest() { + + // Each of these can by async + ProcessingQueue.addImmediate([function () { + test.before(); + }, test.hooks("before"), function () { + test.preserveTestEnvironment(); + }, test.hooks("beforeEach"), function () { + test.run(); + }, test.hooks("afterEach").reverse(), test.hooks("after").reverse(), function () { + test.after(); + }, function () { + test.finish(); + }]); + } + + var previousFailCount = config.storage && +config.storage.getItem("qunit-test-" + this.module.name + "-" + this.testName); + + // Prioritize previously failed tests, detected from storage + var prioritize = config.reorder && !!previousFailCount; + + this.previousFailure = !!previousFailCount; + + ProcessingQueue.add(runTest, prioritize, config.seed); + + // If the queue has already finished, we manually process the new test + if (ProcessingQueue.finished) { + ProcessingQueue.advance(); + } + }, + + + pushResult: function pushResult(resultInfo) { + if (this !== config.current) { + throw new Error("Assertion occurred after test had finished."); + } + + // Destructure of resultInfo = { result, actual, expected, message, negative } + var source, + details = { + module: this.module.name, + name: this.testName, + result: resultInfo.result, + message: resultInfo.message, + actual: resultInfo.actual, + testId: this.testId, + negative: resultInfo.negative || false, + runtime: now() - this.started, + todo: !!this.todo + }; + + if (hasOwn.call(resultInfo, "expected")) { + details.expected = resultInfo.expected; + } + + if (!resultInfo.result) { + source = resultInfo.source || sourceFromStacktrace(); + + if (source) { + details.source = source; + } + } + + this.logAssertion(details); + + this.assertions.push({ + result: !!resultInfo.result, + message: resultInfo.message + }); + }, + + pushFailure: function pushFailure(message, source, actual) { + if (!(this instanceof Test)) { + throw new Error("pushFailure() assertion outside test context, was " + sourceFromStacktrace(2)); + } + + this.pushResult({ + result: false, + message: message || "error", + actual: actual || null, + source: source + }); + }, + + /** + * Log assertion details using both the old QUnit.log interface and + * QUnit.on( "assertion" ) interface. + * + * @private + */ + logAssertion: function logAssertion(details) { + runLoggingCallbacks("log", details); + + var assertion = { + passed: details.result, + actual: details.actual, + expected: details.expected, + message: details.message, + stack: details.source, + todo: details.todo + }; + this.testReport.pushAssertion(assertion); + emit("assertion", assertion); + }, + + + resolvePromise: function resolvePromise(promise, phase) { + var then, + resume, + message, + test = this; + if (promise != null) { + then = promise.then; + if (objectType(then) === "function") { + resume = internalStop(test); + if (config.notrycatch) { + then.call(promise, function () { + resume(); + }); + } else { + then.call(promise, function () { + resume(); + }, function (error) { + message = "Promise rejected " + (!phase ? "during" : phase.replace(/Each$/, "")) + " \"" + test.testName + "\": " + (error && error.message || error); + test.pushFailure(message, extractStacktrace(error, 0)); + + // Else next test will carry the responsibility + saveGlobal(); + + // Unblock + resume(); + }); + } + } + } + }, + + valid: function valid() { + var filter = config.filter, + regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec(filter), + module = config.module && config.module.toLowerCase(), + fullName = this.module.name + ": " + this.testName; + + function moduleChainNameMatch(testModule) { + var testModuleName = testModule.name ? testModule.name.toLowerCase() : null; + if (testModuleName === module) { + return true; + } else if (testModule.parentModule) { + return moduleChainNameMatch(testModule.parentModule); + } else { + return false; + } + } + + function moduleChainIdMatch(testModule) { + return inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule); + } + + // Internally-generated tests are always valid + if (this.callback && this.callback.validTest) { + return true; + } + + if (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) { + + return false; + } + + if (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) { + + return false; + } + + if (module && !moduleChainNameMatch(this.module)) { + return false; + } + + if (!filter) { + return true; + } + + return regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName); + }, + + regexFilter: function regexFilter(exclude, pattern, flags, fullName) { + var regex = new RegExp(pattern, flags); + var match = regex.test(fullName); + + return match !== exclude; + }, + + stringFilter: function stringFilter(filter, fullName) { + filter = filter.toLowerCase(); + fullName = fullName.toLowerCase(); + + var include = filter.charAt(0) !== "!"; + if (!include) { + filter = filter.slice(1); + } + + // If the filter matches, we need to honour include + if (fullName.indexOf(filter) !== -1) { + return include; + } + + // Otherwise, do the opposite + return !include; + } + }; + + function pushFailure() { + if (!config.current) { + throw new Error("pushFailure() assertion outside test context, in " + sourceFromStacktrace(2)); + } + + // Gets current test obj + var currentTest = config.current; + + return currentTest.pushFailure.apply(currentTest, arguments); + } + + function saveGlobal() { + config.pollution = []; + + if (config.noglobals) { + for (var key in global$1) { + if (hasOwn.call(global$1, key)) { + + // In Opera sometimes DOM element ids show up here, ignore them + if (/^qunit-test-output/.test(key)) { + continue; + } + config.pollution.push(key); + } + } + } + } + + function checkPollution() { + var newGlobals, + deletedGlobals, + old = config.pollution; + + saveGlobal(); + + newGlobals = diff(config.pollution, old); + if (newGlobals.length > 0) { + pushFailure("Introduced global variable(s): " + newGlobals.join(", ")); + } + + deletedGlobals = diff(old, config.pollution); + if (deletedGlobals.length > 0) { + pushFailure("Deleted global variable(s): " + deletedGlobals.join(", ")); + } + } + + // Will be exposed as QUnit.test + function test(testName, callback) { + if (focused$1) { + return; + } + + var newTest = new Test({ + testName: testName, + callback: callback + }); + + newTest.queue(); + } + + function todo(testName, callback) { + if (focused$1) { + return; + } + + var newTest = new Test({ + testName: testName, + callback: callback, + todo: true + }); + + newTest.queue(); + } + + // Will be exposed as QUnit.skip + function skip(testName) { + if (focused$1) { + return; + } + + var test = new Test({ + testName: testName, + skip: true + }); + + test.queue(); + } + + // Will be exposed as QUnit.only + function only(testName, callback) { + if (focused$1) { + return; + } + + config.queue.length = 0; + focused$1 = true; + + var newTest = new Test({ + testName: testName, + callback: callback + }); + + newTest.queue(); + } + + // Put a hold on processing and return a function that will release it. + function internalStop(test) { + test.semaphore += 1; + config.blocking = true; + + // Set a recovery timeout, if so configured. + if (defined.setTimeout) { + var timeoutDuration = void 0; + + if (typeof test.timeout === "number") { + timeoutDuration = test.timeout; + } else if (typeof config.testTimeout === "number") { + timeoutDuration = config.testTimeout; + } + + if (typeof timeoutDuration === "number" && timeoutDuration > 0) { + clearTimeout(config.timeout); + config.timeout = setTimeout(function () { + pushFailure("Test took longer than " + timeoutDuration + "ms; test timed out.", sourceFromStacktrace(2)); + internalRecover(test); + }, timeoutDuration); + } + } + + var released = false; + return function resume() { + if (released) { + return; + } + + released = true; + test.semaphore -= 1; + internalStart(test); + }; + } + + // Forcefully release all processing holds. + function internalRecover(test) { + test.semaphore = 0; + internalStart(test); + } + + // Release a processing hold, scheduling a resumption attempt if no holds remain. + function internalStart(test) { + + // If semaphore is non-numeric, throw error + if (isNaN(test.semaphore)) { + test.semaphore = 0; + + pushFailure("Invalid value on test.semaphore", sourceFromStacktrace(2)); + return; + } + + // Don't start until equal number of stop-calls + if (test.semaphore > 0) { + return; + } + + // Throw an Error if start is called more often than stop + if (test.semaphore < 0) { + test.semaphore = 0; + + pushFailure("Tried to restart test while already started (test's semaphore was 0 already)", sourceFromStacktrace(2)); + return; + } + + // Add a slight delay to allow more assertions etc. + if (defined.setTimeout) { + if (config.timeout) { + clearTimeout(config.timeout); + } + config.timeout = setTimeout(function () { + if (test.semaphore > 0) { + return; + } + + if (config.timeout) { + clearTimeout(config.timeout); + } + + begin(); + }); + } else { + begin(); + } + } + + function collectTests(module) { + var tests = [].concat(module.tests); + var modules = [].concat(toConsumableArray(module.childModules)); + + // Do a breadth-first traversal of the child modules + while (modules.length) { + var nextModule = modules.shift(); + tests.push.apply(tests, nextModule.tests); + modules.push.apply(modules, toConsumableArray(nextModule.childModules)); + } + + return tests; + } + + function numberOfTests(module) { + return collectTests(module).length; + } + + function numberOfUnskippedTests(module) { + return collectTests(module).filter(function (test) { + return !test.skip; + }).length; + } + + function notifyTestsRan(module, skipped) { + module.testsRun++; + if (!skipped) { + module.unskippedTestsRun++; + } + while (module = module.parentModule) { + module.testsRun++; + if (!skipped) { + module.unskippedTestsRun++; + } + } + } + + /** + * Returns a function that proxies to the given method name on the globals + * console object. The proxy will also detect if the console doesn't exist and + * will appropriately no-op. This allows support for IE9, which doesn't have a + * console if the developer tools are not open. + */ + function consoleProxy(method) { + return function () { + if (console) { + console[method].apply(console, arguments); + } + }; + } + + var Logger = { + warn: consoleProxy("warn") + }; + + var Assert = function () { + function Assert(testContext) { + classCallCheck(this, Assert); + + this.test = testContext; + } + + // Assert helpers + + createClass(Assert, [{ + key: "timeout", + value: function timeout(duration) { + if (typeof duration !== "number") { + throw new Error("You must pass a number as the duration to assert.timeout"); + } + + this.test.timeout = duration; + } + + // Documents a "step", which is a string value, in a test as a passing assertion + + }, { + key: "step", + value: function step(message) { + var result = !!message; + + this.test.steps.push(message); + + return this.pushResult({ + result: result, + message: message || "You must provide a message to assert.step" + }); + } + + // Verifies the steps in a test match a given array of string values + + }, { + key: "verifySteps", + value: function verifySteps(steps, message) { + this.deepEqual(this.test.steps, steps, message); + this.test.steps.length = 0; + } + + // Specify the number of expected assertions to guarantee that failed test + // (no assertions are run at all) don't slip through. + + }, { + key: "expect", + value: function expect(asserts) { + if (arguments.length === 1) { + this.test.expected = asserts; + } else { + return this.test.expected; + } + } + + // Put a hold on processing and return a function that will release it a maximum of once. + + }, { + key: "async", + value: function async(count) { + var test$$1 = this.test; + + var popped = false, + acceptCallCount = count; + + if (typeof acceptCallCount === "undefined") { + acceptCallCount = 1; + } + + var resume = internalStop(test$$1); + + return function done() { + if (config.current !== test$$1) { + throw Error("assert.async callback called after test finished."); + } + + if (popped) { + test$$1.pushFailure("Too many calls to the `assert.async` callback", sourceFromStacktrace(2)); + return; + } + + acceptCallCount -= 1; + if (acceptCallCount > 0) { + return; + } + + popped = true; + resume(); + }; + } + + // Exports test.push() to the user API + // Alias of pushResult. + + }, { + key: "push", + value: function push(result, actual, expected, message, negative) { + Logger.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult)."); + + var currentAssert = this instanceof Assert ? this : config.current.assert; + return currentAssert.pushResult({ + result: result, + actual: actual, + expected: expected, + message: message, + negative: negative + }); + } + }, { + key: "pushResult", + value: function pushResult(resultInfo) { + + // Destructure of resultInfo = { result, actual, expected, message, negative } + var assert = this; + var currentTest = assert instanceof Assert && assert.test || config.current; + + // Backwards compatibility fix. + // Allows the direct use of global exported assertions and QUnit.assert.* + // Although, it's use is not recommended as it can leak assertions + // to other tests from async tests, because we only get a reference to the current test, + // not exactly the test where assertion were intended to be called. + if (!currentTest) { + throw new Error("assertion outside test context, in " + sourceFromStacktrace(2)); + } + + if (!(assert instanceof Assert)) { + assert = currentTest.assert; + } + + return assert.test.pushResult(resultInfo); + } + }, { + key: "ok", + value: function ok(result, message) { + if (!message) { + message = result ? "okay" : "failed, expected argument to be truthy, was: " + dump.parse(result); + } + + this.pushResult({ + result: !!result, + actual: result, + expected: true, + message: message + }); + } + }, { + key: "notOk", + value: function notOk(result, message) { + if (!message) { + message = !result ? "okay" : "failed, expected argument to be falsy, was: " + dump.parse(result); + } + + this.pushResult({ + result: !result, + actual: result, + expected: false, + message: message + }); + } + }, { + key: "equal", + value: function equal(actual, expected, message) { + + // eslint-disable-next-line eqeqeq + var result = expected == actual; + + this.pushResult({ + result: result, + actual: actual, + expected: expected, + message: message + }); + } + }, { + key: "notEqual", + value: function notEqual(actual, expected, message) { + + // eslint-disable-next-line eqeqeq + var result = expected != actual; + + this.pushResult({ + result: result, + actual: actual, + expected: expected, + message: message, + negative: true + }); + } + }, { + key: "propEqual", + value: function propEqual(actual, expected, message) { + actual = objectValues(actual); + expected = objectValues(expected); + + this.pushResult({ + result: equiv(actual, expected), + actual: actual, + expected: expected, + message: message + }); + } + }, { + key: "notPropEqual", + value: function notPropEqual(actual, expected, message) { + actual = objectValues(actual); + expected = objectValues(expected); + + this.pushResult({ + result: !equiv(actual, expected), + actual: actual, + expected: expected, + message: message, + negative: true + }); + } + }, { + key: "deepEqual", + value: function deepEqual(actual, expected, message) { + this.pushResult({ + result: equiv(actual, expected), + actual: actual, + expected: expected, + message: message + }); + } + }, { + key: "notDeepEqual", + value: function notDeepEqual(actual, expected, message) { + this.pushResult({ + result: !equiv(actual, expected), + actual: actual, + expected: expected, + message: message, + negative: true + }); + } + }, { + key: "strictEqual", + value: function strictEqual(actual, expected, message) { + this.pushResult({ + result: expected === actual, + actual: actual, + expected: expected, + message: message + }); + } + }, { + key: "notStrictEqual", + value: function notStrictEqual(actual, expected, message) { + this.pushResult({ + result: expected !== actual, + actual: actual, + expected: expected, + message: message, + negative: true + }); + } + }, { + key: "throws", + value: function throws(block, expected, message) { + var actual = void 0, + result = false; + + var currentTest = this instanceof Assert && this.test || config.current; + + // 'expected' is optional unless doing string comparison + if (objectType(expected) === "string") { + if (message == null) { + message = expected; + expected = null; + } else { + throw new Error("throws/raises does not accept a string value for the expected argument.\n" + "Use a non-string object value (e.g. regExp) instead if it's necessary."); + } + } + + currentTest.ignoreGlobalErrors = true; + try { + block.call(currentTest.testEnvironment); + } catch (e) { + actual = e; + } + currentTest.ignoreGlobalErrors = false; + + if (actual) { + var expectedType = objectType(expected); + + // We don't want to validate thrown error + if (!expected) { + result = true; + expected = null; + + // Expected is a regexp + } else if (expectedType === "regexp") { + result = expected.test(errorString(actual)); + + // Expected is a constructor, maybe an Error constructor + } else if (expectedType === "function" && actual instanceof expected) { + result = true; + + // Expected is an Error object + } else if (expectedType === "object") { + result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message; + + // Expected is a validation function which returns true if validation passed + } else if (expectedType === "function" && expected.call({}, actual) === true) { + expected = null; + result = true; + } + } + + currentTest.assert.pushResult({ + result: result, + actual: actual, + expected: expected, + message: message + }); + } + }, { + key: "rejects", + value: function rejects(promise, expected, message) { + var result = false; + + var currentTest = this instanceof Assert && this.test || config.current; + + // 'expected' is optional unless doing string comparison + if (objectType(expected) === "string") { + if (message === undefined) { + message = expected; + expected = undefined; + } else { + message = "assert.rejects does not accept a string value for the expected " + "argument.\nUse a non-string object value (e.g. validator function) instead " + "if necessary."; + + currentTest.assert.pushResult({ + result: false, + message: message + }); + + return; + } + } + + var then = promise && promise.then; + if (objectType(then) !== "function") { + var _message = "The value provided to `assert.rejects` in " + "\"" + currentTest.testName + "\" was not a promise."; + + currentTest.assert.pushResult({ + result: false, + message: _message, + actual: promise + }); + + return; + } + + var done = this.async(); + + return then.call(promise, function handleFulfillment() { + var message = "The promise returned by the `assert.rejects` callback in " + "\"" + currentTest.testName + "\" did not reject."; + + currentTest.assert.pushResult({ + result: false, + message: message, + actual: promise + }); + + done(); + }, function handleRejection(actual) { + if (actual) { + var expectedType = objectType(expected); + + // We don't want to validate + if (expected === undefined) { + result = true; + expected = null; + + // Expected is a regexp + } else if (expectedType === "regexp") { + result = expected.test(errorString(actual)); + + // Expected is a constructor, maybe an Error constructor + } else if (expectedType === "function" && actual instanceof expected) { + result = true; + + // Expected is an Error object + } else if (expectedType === "object") { + result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message; + + // Expected is a validation function which returns true if validation passed + } else { + if (expectedType === "function") { + result = expected.call({}, actual) === true; + expected = null; + + // Expected is some other invalid type + } else { + result = false; + message = "invalid expected value provided to `assert.rejects` " + "callback in \"" + currentTest.testName + "\": " + expectedType + "."; + } + } + } + + currentTest.assert.pushResult({ + result: result, + actual: actual, + expected: expected, + message: message + }); + + done(); + }); + } + }]); + return Assert; + }(); + + // Provide an alternative to assert.throws(), for environments that consider throws a reserved word + // Known to us are: Closure Compiler, Narwhal + // eslint-disable-next-line dot-notation + + + Assert.prototype.raises = Assert.prototype["throws"]; + + /** + * Converts an error into a simple string for comparisons. + * + * @param {Error} error + * @return {String} + */ + function errorString(error) { + var resultErrorString = error.toString(); + + if (resultErrorString.substring(0, 7) === "[object") { + var name = error.name ? error.name.toString() : "Error"; + var message = error.message ? error.message.toString() : ""; + + if (name && message) { + return name + ": " + message; + } else if (name) { + return name; + } else if (message) { + return message; + } else { + return "Error"; + } + } else { + return resultErrorString; + } + } + + /* global module, exports, define */ + function exportQUnit(QUnit) { + + if (defined.document) { + + // QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined. + if (window.QUnit && window.QUnit.version) { + throw new Error("QUnit has already been defined."); + } + + window.QUnit = QUnit; + } + + // For nodejs + if (typeof module !== "undefined" && module && module.exports) { + module.exports = QUnit; + + // For consistency with CommonJS environments' exports + module.exports.QUnit = QUnit; + } + + // For CommonJS with exports, but without module.exports, like Rhino + if (typeof exports !== "undefined" && exports) { + exports.QUnit = QUnit; + } + + if (typeof define === "function" && define.amd) { + define(function () { + return QUnit; + }); + QUnit.config.autostart = false; + } + + // For Web/Service Workers + if (self$1 && self$1.WorkerGlobalScope && self$1 instanceof self$1.WorkerGlobalScope) { + self$1.QUnit = QUnit; + } + } + + var SuiteReport = function () { + function SuiteReport(name, parentSuite) { + classCallCheck(this, SuiteReport); + + this.name = name; + this.fullName = parentSuite ? parentSuite.fullName.concat(name) : []; + + this.tests = []; + this.childSuites = []; + + if (parentSuite) { + parentSuite.pushChildSuite(this); + } + } + + createClass(SuiteReport, [{ + key: "start", + value: function start(recordTime) { + if (recordTime) { + this._startTime = Date.now(); + } + + return { + name: this.name, + fullName: this.fullName.slice(), + tests: this.tests.map(function (test) { + return test.start(); + }), + childSuites: this.childSuites.map(function (suite) { + return suite.start(); + }), + testCounts: { + total: this.getTestCounts().total + } + }; + } + }, { + key: "end", + value: function end(recordTime) { + if (recordTime) { + this._endTime = Date.now(); + } + + return { + name: this.name, + fullName: this.fullName.slice(), + tests: this.tests.map(function (test) { + return test.end(); + }), + childSuites: this.childSuites.map(function (suite) { + return suite.end(); + }), + testCounts: this.getTestCounts(), + runtime: this.getRuntime(), + status: this.getStatus() + }; + } + }, { + key: "pushChildSuite", + value: function pushChildSuite(suite) { + this.childSuites.push(suite); + } + }, { + key: "pushTest", + value: function pushTest(test) { + this.tests.push(test); + } + }, { + key: "getRuntime", + value: function getRuntime() { + return this._endTime - this._startTime; + } + }, { + key: "getTestCounts", + value: function getTestCounts() { + var counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 }; + + counts = this.tests.reduce(function (counts, test) { + if (test.valid) { + counts[test.getStatus()]++; + counts.total++; + } + + return counts; + }, counts); + + return this.childSuites.reduce(function (counts, suite) { + return suite.getTestCounts(counts); + }, counts); + } + }, { + key: "getStatus", + value: function getStatus() { + var _getTestCounts = this.getTestCounts(), + total = _getTestCounts.total, + failed = _getTestCounts.failed, + skipped = _getTestCounts.skipped, + todo = _getTestCounts.todo; + + if (failed) { + return "failed"; + } else { + if (skipped === total) { + return "skipped"; + } else if (todo === total) { + return "todo"; + } else { + return "passed"; + } + } + } + }]); + return SuiteReport; + }(); + + // Handle an unhandled exception. By convention, returns true if further + // error handling should be suppressed and false otherwise. + // In this case, we will only suppress further error handling if the + // "ignoreGlobalErrors" configuration option is enabled. + function onError(error) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (config.current) { + if (config.current.ignoreGlobalErrors) { + return true; + } + pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args)); + } else { + test("global failure", extend(function () { + pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args)); + }, { validTest: true })); + } + + return false; + } + + // Handle an unhandled rejection + function onUnhandledRejection(reason) { + var resultInfo = { + result: false, + message: reason.message || "error", + actual: reason, + source: reason.stack || sourceFromStacktrace(3) + }; + + var currentTest = config.current; + if (currentTest) { + currentTest.assert.pushResult(resultInfo); + } else { + test("global failure", extend(function (assert) { + assert.pushResult(resultInfo); + }, { validTest: true })); + } + } + + var focused = false; + var QUnit = {}; + var globalSuite = new SuiteReport(); + + // The initial "currentModule" represents the global (or top-level) module that + // is not explicitly defined by the user, therefore we add the "globalSuite" to + // it since each module has a suiteReport associated with it. + config.currentModule.suiteReport = globalSuite; + + var moduleStack = []; + var globalStartCalled = false; + var runStarted = false; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !(defined.document && window.location.protocol !== "file:"); + + // Expose the current QUnit version + QUnit.version = "2.5.0"; + + function createModule(name, testEnvironment, modifiers) { + var parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null; + var moduleName = parentModule !== null ? [parentModule.name, name].join(" > ") : name; + var parentSuite = parentModule ? parentModule.suiteReport : globalSuite; + + var skip$$1 = parentModule !== null && parentModule.skip || modifiers.skip; + var todo$$1 = parentModule !== null && parentModule.todo || modifiers.todo; + + var module = { + name: moduleName, + parentModule: parentModule, + tests: [], + moduleId: generateHash(moduleName), + testsRun: 0, + unskippedTestsRun: 0, + childModules: [], + suiteReport: new SuiteReport(name, parentSuite), + + // Pass along `skip` and `todo` properties from parent module, in case + // there is one, to childs. And use own otherwise. + // This property will be used to mark own tests and tests of child suites + // as either `skipped` or `todo`. + skip: skip$$1, + todo: skip$$1 ? false : todo$$1 + }; + + var env = {}; + if (parentModule) { + parentModule.childModules.push(module); + extend(env, parentModule.testEnvironment); + } + extend(env, testEnvironment); + module.testEnvironment = env; + + config.modules.push(module); + return module; + } + + function processModule(name, options, executeNow) { + var modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var module = createModule(name, options, modifiers); + + // Move any hooks to a 'hooks' object + var testEnvironment = module.testEnvironment; + var hooks = module.hooks = {}; + + setHookFromEnvironment(hooks, testEnvironment, "before"); + setHookFromEnvironment(hooks, testEnvironment, "beforeEach"); + setHookFromEnvironment(hooks, testEnvironment, "afterEach"); + setHookFromEnvironment(hooks, testEnvironment, "after"); + + function setHookFromEnvironment(hooks, environment, name) { + var potentialHook = environment[name]; + hooks[name] = typeof potentialHook === "function" ? [potentialHook] : []; + delete environment[name]; + } + + var moduleFns = { + before: setHookFunction(module, "before"), + beforeEach: setHookFunction(module, "beforeEach"), + afterEach: setHookFunction(module, "afterEach"), + after: setHookFunction(module, "after") + }; + + var currentModule = config.currentModule; + if (objectType(executeNow) === "function") { + moduleStack.push(module); + config.currentModule = module; + executeNow.call(module.testEnvironment, moduleFns); + moduleStack.pop(); + module = module.parentModule || currentModule; + } + + config.currentModule = module; + } + + // TODO: extract this to a new file alongside its related functions + function module$1(name, options, executeNow) { + if (focused) { + return; + } + + if (arguments.length === 2) { + if (objectType(options) === "function") { + executeNow = options; + options = undefined; + } + } + + processModule(name, options, executeNow); + } + + module$1.only = function () { + if (focused) { + return; + } + + config.modules.length = 0; + config.queue.length = 0; + + module$1.apply(undefined, arguments); + + focused = true; + }; + + module$1.skip = function (name, options, executeNow) { + if (focused) { + return; + } + + if (arguments.length === 2) { + if (objectType(options) === "function") { + executeNow = options; + options = undefined; + } + } + + processModule(name, options, executeNow, { skip: true }); + }; + + module$1.todo = function (name, options, executeNow) { + if (focused) { + return; + } + + if (arguments.length === 2) { + if (objectType(options) === "function") { + executeNow = options; + options = undefined; + } + } + + processModule(name, options, executeNow, { todo: true }); + }; + + extend(QUnit, { + on: on, + + module: module$1, + + test: test, + + todo: todo, + + skip: skip, + + only: only, + + start: function start(count) { + var globalStartAlreadyCalled = globalStartCalled; + + if (!config.current) { + globalStartCalled = true; + + if (runStarted) { + throw new Error("Called start() while test already started running"); + } else if (globalStartAlreadyCalled || count > 1) { + throw new Error("Called start() outside of a test context too many times"); + } else if (config.autostart) { + throw new Error("Called start() outside of a test context when " + "QUnit.config.autostart was true"); + } else if (!config.pageLoaded) { + + // The page isn't completely loaded yet, so we set autostart and then + // load if we're in Node or wait for the browser's load event. + config.autostart = true; + + // Starts from Node even if .load was not previously called. We still return + // early otherwise we'll wind up "beginning" twice. + if (!defined.document) { + QUnit.load(); + } + + return; + } + } else { + throw new Error("QUnit.start cannot be called inside a test context."); + } + + scheduleBegin(); + }, + + config: config, + + is: is, + + objectType: objectType, + + extend: extend, + + load: function load() { + config.pageLoaded = true; + + // Initialize the configuration options + extend(config, { + stats: { all: 0, bad: 0 }, + started: 0, + updateRate: 1000, + autostart: true, + filter: "" + }, true); + + if (!runStarted) { + config.blocking = false; + + if (config.autostart) { + scheduleBegin(); + } + } + }, + + stack: function stack(offset) { + offset = (offset || 0) + 2; + return sourceFromStacktrace(offset); + }, + + onError: onError, + + onUnhandledRejection: onUnhandledRejection + }); + + QUnit.pushFailure = pushFailure; + QUnit.assert = Assert.prototype; + QUnit.equiv = equiv; + QUnit.dump = dump; + + registerLoggingCallbacks(QUnit); + + function scheduleBegin() { + + runStarted = true; + + // Add a slight delay to allow definition of more modules and tests. + if (defined.setTimeout) { + setTimeout(function () { + begin(); + }); + } else { + begin(); + } + } + + function begin() { + var i, + l, + modulesLog = []; + + // If the test run hasn't officially begun yet + if (!config.started) { + + // Record the time of the test run's beginning + config.started = now(); + + // Delete the loose unnamed module if unused. + if (config.modules[0].name === "" && config.modules[0].tests.length === 0) { + config.modules.shift(); + } + + // Avoid unnecessary information by not logging modules' test environments + for (i = 0, l = config.modules.length; i < l; i++) { + modulesLog.push({ + name: config.modules[i].name, + tests: config.modules[i].tests + }); + } + + // The test run is officially beginning now + emit("runStart", globalSuite.start(true)); + runLoggingCallbacks("begin", { + totalTests: Test.count, + modules: modulesLog + }); + } + + config.blocking = false; + ProcessingQueue.advance(); + } + + function setHookFunction(module, hookName) { + return function setHook(callback) { + module.hooks[hookName].push(callback); + }; + } + + exportQUnit(QUnit); + + (function () { + + if (typeof window === "undefined" || typeof document === "undefined") { + return; + } + + var config = QUnit.config, + hasOwn = Object.prototype.hasOwnProperty; + + // Stores fixture HTML for resetting later + function storeFixture() { + + // Avoid overwriting user-defined values + if (hasOwn.call(config, "fixture")) { + return; + } + + var fixture = document.getElementById("qunit-fixture"); + if (fixture) { + config.fixture = fixture.innerHTML; + } + } + + QUnit.begin(storeFixture); + + // Resets the fixture DOM element if available. + function resetFixture() { + if (config.fixture == null) { + return; + } + + var fixture = document.getElementById("qunit-fixture"); + if (fixture) { + fixture.innerHTML = config.fixture; + } + } + + QUnit.testStart(resetFixture); + })(); + + (function () { + + // Only interact with URLs via window.location + var location = typeof window !== "undefined" && window.location; + if (!location) { + return; + } + + var urlParams = getUrlParams(); + + QUnit.urlParams = urlParams; + + // Match module/test by inclusion in an array + QUnit.config.moduleId = [].concat(urlParams.moduleId || []); + QUnit.config.testId = [].concat(urlParams.testId || []); + + // Exact case-insensitive match of the module name + QUnit.config.module = urlParams.module; + + // Regular expression or case-insenstive substring match against "moduleName: testName" + QUnit.config.filter = urlParams.filter; + + // Test order randomization + if (urlParams.seed === true) { + + // Generate a random seed if the option is specified without a value + QUnit.config.seed = Math.random().toString(36).slice(2); + } else if (urlParams.seed) { + QUnit.config.seed = urlParams.seed; + } + + // Add URL-parameter-mapped config values with UI form rendering data + QUnit.config.urlConfig.push({ + id: "hidepassed", + label: "Hide passed tests", + tooltip: "Only show tests and assertions that fail. Stored as query-strings." + }, { + id: "noglobals", + label: "Check for Globals", + tooltip: "Enabling this will test if any test introduces new properties on the " + "global object (`window` in Browsers). Stored as query-strings." + }, { + id: "notrycatch", + label: "No try-catch", + tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " + "exceptions in IE reasonable. Stored as query-strings." + }); + + QUnit.begin(function () { + var i, + option, + urlConfig = QUnit.config.urlConfig; + + for (i = 0; i < urlConfig.length; i++) { + + // Options can be either strings or objects with nonempty "id" properties + option = QUnit.config.urlConfig[i]; + if (typeof option !== "string") { + option = option.id; + } + + if (QUnit.config[option] === undefined) { + QUnit.config[option] = urlParams[option]; + } + } + }); + + function getUrlParams() { + var i, param, name, value; + var urlParams = Object.create(null); + var params = location.search.slice(1).split("&"); + var length = params.length; + + for (i = 0; i < length; i++) { + if (params[i]) { + param = params[i].split("="); + name = decodeQueryParam(param[0]); + + // Allow just a key to turn on a flag, e.g., test.html?noglobals + value = param.length === 1 || decodeQueryParam(param.slice(1).join("=")); + if (name in urlParams) { + urlParams[name] = [].concat(urlParams[name], value); + } else { + urlParams[name] = value; + } + } + } + + return urlParams; + } + + function decodeQueryParam(param) { + return decodeURIComponent(param.replace(/\+/g, "%20")); + } + })(); + + var stats = { + passedTests: 0, + failedTests: 0, + skippedTests: 0, + todoTests: 0 + }; + + // Escape text for attribute or text content. + function escapeText(s) { + if (!s) { + return ""; + } + s = s + ""; + + // Both single quotes and double quotes (for attributes) + return s.replace(/['"<>&]/g, function (s) { + switch (s) { + case "'": + return "'"; + case "\"": + return """; + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + } + }); + } + + (function () { + + // Don't load the HTML Reporter on non-browser environments + if (typeof window === "undefined" || !window.document) { + return; + } + + var config = QUnit.config, + document$$1 = window.document, + collapseNext = false, + hasOwn = Object.prototype.hasOwnProperty, + unfilteredUrl = setUrl({ filter: undefined, module: undefined, + moduleId: undefined, testId: undefined }), + modulesList = []; + + function addEvent(elem, type, fn) { + elem.addEventListener(type, fn, false); + } + + function removeEvent(elem, type, fn) { + elem.removeEventListener(type, fn, false); + } + + function addEvents(elems, type, fn) { + var i = elems.length; + while (i--) { + addEvent(elems[i], type, fn); + } + } + + function hasClass(elem, name) { + return (" " + elem.className + " ").indexOf(" " + name + " ") >= 0; + } + + function addClass(elem, name) { + if (!hasClass(elem, name)) { + elem.className += (elem.className ? " " : "") + name; + } + } + + function toggleClass(elem, name, force) { + if (force || typeof force === "undefined" && !hasClass(elem, name)) { + addClass(elem, name); + } else { + removeClass(elem, name); + } + } + + function removeClass(elem, name) { + var set = " " + elem.className + " "; + + // Class name may appear multiple times + while (set.indexOf(" " + name + " ") >= 0) { + set = set.replace(" " + name + " ", " "); + } + + // Trim for prettiness + elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, ""); + } + + function id(name) { + return document$$1.getElementById && document$$1.getElementById(name); + } + + function abortTests() { + var abortButton = id("qunit-abort-tests-button"); + if (abortButton) { + abortButton.disabled = true; + abortButton.innerHTML = "Aborting..."; + } + QUnit.config.queue.length = 0; + return false; + } + + function interceptNavigation(ev) { + applyUrlParams(); + + if (ev && ev.preventDefault) { + ev.preventDefault(); + } + + return false; + } + + function getUrlConfigHtml() { + var i, + j, + val, + escaped, + escapedTooltip, + selection = false, + urlConfig = config.urlConfig, + urlConfigHtml = ""; + + for (i = 0; i < urlConfig.length; i++) { + + // Options can be either strings or objects with nonempty "id" properties + val = config.urlConfig[i]; + if (typeof val === "string") { + val = { + id: val, + label: val + }; + } + + escaped = escapeText(val.id); + escapedTooltip = escapeText(val.tooltip); + + if (!val.value || typeof val.value === "string") { + urlConfigHtml += ""; + } else { + urlConfigHtml += ""; + } + } + + return urlConfigHtml; + } + + // Handle "click" events on toolbar checkboxes and "change" for select menus. + // Updates the URL with the new state of `config.urlConfig` values. + function toolbarChanged() { + var updatedUrl, + value, + tests, + field = this, + params = {}; + + // Detect if field is a select menu or a checkbox + if ("selectedIndex" in field) { + value = field.options[field.selectedIndex].value || undefined; + } else { + value = field.checked ? field.defaultValue || true : undefined; + } + + params[field.name] = value; + updatedUrl = setUrl(params); + + // Check if we can apply the change without a page refresh + if ("hidepassed" === field.name && "replaceState" in window.history) { + QUnit.urlParams[field.name] = value; + config[field.name] = value || false; + tests = id("qunit-tests"); + if (tests) { + toggleClass(tests, "hidepass", value || false); + } + window.history.replaceState(null, "", updatedUrl); + } else { + window.location = updatedUrl; + } + } + + function setUrl(params) { + var key, + arrValue, + i, + querystring = "?", + location = window.location; + + params = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params); + + for (key in params) { + + // Skip inherited or undefined properties + if (hasOwn.call(params, key) && params[key] !== undefined) { + + // Output a parameter for each value of this key + // (but usually just one) + arrValue = [].concat(params[key]); + for (i = 0; i < arrValue.length; i++) { + querystring += encodeURIComponent(key); + if (arrValue[i] !== true) { + querystring += "=" + encodeURIComponent(arrValue[i]); + } + querystring += "&"; + } + } + } + return location.protocol + "//" + location.host + location.pathname + querystring.slice(0, -1); + } + + function applyUrlParams() { + var i, + selectedModules = [], + modulesList = id("qunit-modulefilter-dropdown-list").getElementsByTagName("input"), + filter = id("qunit-filter-input").value; + + for (i = 0; i < modulesList.length; i++) { + if (modulesList[i].checked) { + selectedModules.push(modulesList[i].value); + } + } + + window.location = setUrl({ + filter: filter === "" ? undefined : filter, + moduleId: selectedModules.length === 0 ? undefined : selectedModules, + + // Remove module and testId filter + module: undefined, + testId: undefined + }); + } + + function toolbarUrlConfigContainer() { + var urlConfigContainer = document$$1.createElement("span"); + + urlConfigContainer.innerHTML = getUrlConfigHtml(); + addClass(urlConfigContainer, "qunit-url-config"); + + addEvents(urlConfigContainer.getElementsByTagName("input"), "change", toolbarChanged); + addEvents(urlConfigContainer.getElementsByTagName("select"), "change", toolbarChanged); + + return urlConfigContainer; + } + + function abortTestsButton() { + var button = document$$1.createElement("button"); + button.id = "qunit-abort-tests-button"; + button.innerHTML = "Abort"; + addEvent(button, "click", abortTests); + return button; + } + + function toolbarLooseFilter() { + var filter = document$$1.createElement("form"), + label = document$$1.createElement("label"), + input = document$$1.createElement("input"), + button = document$$1.createElement("button"); + + addClass(filter, "qunit-filter"); + + label.innerHTML = "Filter: "; + + input.type = "text"; + input.value = config.filter || ""; + input.name = "filter"; + input.id = "qunit-filter-input"; + + button.innerHTML = "Go"; + + label.appendChild(input); + + filter.appendChild(label); + filter.appendChild(document$$1.createTextNode(" ")); + filter.appendChild(button); + addEvent(filter, "submit", interceptNavigation); + + return filter; + } + + function moduleListHtml() { + var i, + checked, + html = ""; + + for (i = 0; i < config.modules.length; i++) { + if (config.modules[i].name !== "") { + checked = config.moduleId.indexOf(config.modules[i].moduleId) > -1; + html += "
  • "; + } + } + + return html; + } + + function toolbarModuleFilter() { + var allCheckbox, + commit, + reset, + moduleFilter = document$$1.createElement("form"), + label = document$$1.createElement("label"), + moduleSearch = document$$1.createElement("input"), + dropDown = document$$1.createElement("div"), + actions = document$$1.createElement("span"), + dropDownList = document$$1.createElement("ul"), + dirty = false; + + moduleSearch.id = "qunit-modulefilter-search"; + addEvent(moduleSearch, "input", searchInput); + addEvent(moduleSearch, "input", searchFocus); + addEvent(moduleSearch, "focus", searchFocus); + addEvent(moduleSearch, "click", searchFocus); + + label.id = "qunit-modulefilter-search-container"; + label.innerHTML = "Module: "; + label.appendChild(moduleSearch); + + actions.id = "qunit-modulefilter-actions"; + actions.innerHTML = "" + "" + ""; + allCheckbox = actions.lastChild.firstChild; + commit = actions.firstChild; + reset = commit.nextSibling; + addEvent(commit, "click", applyUrlParams); + + dropDownList.id = "qunit-modulefilter-dropdown-list"; + dropDownList.innerHTML = moduleListHtml(); + + dropDown.id = "qunit-modulefilter-dropdown"; + dropDown.style.display = "none"; + dropDown.appendChild(actions); + dropDown.appendChild(dropDownList); + addEvent(dropDown, "change", selectionChange); + selectionChange(); + + moduleFilter.id = "qunit-modulefilter"; + moduleFilter.appendChild(label); + moduleFilter.appendChild(dropDown); + addEvent(moduleFilter, "submit", interceptNavigation); + addEvent(moduleFilter, "reset", function () { + + // Let the reset happen, then update styles + window.setTimeout(selectionChange); + }); + + // Enables show/hide for the dropdown + function searchFocus() { + if (dropDown.style.display !== "none") { + return; + } + + dropDown.style.display = "block"; + addEvent(document$$1, "click", hideHandler); + addEvent(document$$1, "keydown", hideHandler); + + // Hide on Escape keydown or outside-container click + function hideHandler(e) { + var inContainer = moduleFilter.contains(e.target); + + if (e.keyCode === 27 || !inContainer) { + if (e.keyCode === 27 && inContainer) { + moduleSearch.focus(); + } + dropDown.style.display = "none"; + removeEvent(document$$1, "click", hideHandler); + removeEvent(document$$1, "keydown", hideHandler); + moduleSearch.value = ""; + searchInput(); + } + } + } + + // Processes module search box input + function searchInput() { + var i, + item, + searchText = moduleSearch.value.toLowerCase(), + listItems = dropDownList.children; + + for (i = 0; i < listItems.length; i++) { + item = listItems[i]; + if (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) { + item.style.display = ""; + } else { + item.style.display = "none"; + } + } + } + + // Processes selection changes + function selectionChange(evt) { + var i, + item, + checkbox = evt && evt.target || allCheckbox, + modulesList = dropDownList.getElementsByTagName("input"), + selectedNames = []; + + toggleClass(checkbox.parentNode, "checked", checkbox.checked); + + dirty = false; + if (checkbox.checked && checkbox !== allCheckbox) { + allCheckbox.checked = false; + removeClass(allCheckbox.parentNode, "checked"); + } + for (i = 0; i < modulesList.length; i++) { + item = modulesList[i]; + if (!evt) { + toggleClass(item.parentNode, "checked", item.checked); + } else if (checkbox === allCheckbox && checkbox.checked) { + item.checked = false; + removeClass(item.parentNode, "checked"); + } + dirty = dirty || item.checked !== item.defaultChecked; + if (item.checked) { + selectedNames.push(item.parentNode.textContent); + } + } + + commit.style.display = reset.style.display = dirty ? "" : "none"; + moduleSearch.placeholder = selectedNames.join(", ") || allCheckbox.parentNode.textContent; + moduleSearch.title = "Type to filter list. Current selection:\n" + (selectedNames.join("\n") || allCheckbox.parentNode.textContent); + } + + return moduleFilter; + } + + function appendToolbar() { + var toolbar = id("qunit-testrunner-toolbar"); + + if (toolbar) { + toolbar.appendChild(toolbarUrlConfigContainer()); + toolbar.appendChild(toolbarModuleFilter()); + toolbar.appendChild(toolbarLooseFilter()); + toolbar.appendChild(document$$1.createElement("div")).className = "clearfix"; + } + } + + function appendHeader() { + var header = id("qunit-header"); + + if (header) { + header.innerHTML = "" + header.innerHTML + " "; + } + } + + function appendBanner() { + var banner = id("qunit-banner"); + + if (banner) { + banner.className = ""; + } + } + + function appendTestResults() { + var tests = id("qunit-tests"), + result = id("qunit-testresult"), + controls; + + if (result) { + result.parentNode.removeChild(result); + } + + if (tests) { + tests.innerHTML = ""; + result = document$$1.createElement("p"); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore(result, tests); + result.innerHTML = "
    Running...
     
    " + "
    " + "
    "; + controls = id("qunit-testresult-controls"); + } + + if (controls) { + controls.appendChild(abortTestsButton()); + } + } + + function appendFilteredTest() { + var testId = QUnit.config.testId; + if (!testId || testId.length <= 0) { + return ""; + } + return "
    Rerunning selected tests: " + escapeText(testId.join(", ")) + " Run all tests
    "; + } + + function appendUserAgent() { + var userAgent = id("qunit-userAgent"); + + if (userAgent) { + userAgent.innerHTML = ""; + userAgent.appendChild(document$$1.createTextNode("QUnit " + QUnit.version + "; " + navigator.userAgent)); + } + } + + function appendInterface() { + var qunit = id("qunit"); + + if (qunit) { + qunit.innerHTML = "

    " + escapeText(document$$1.title) + "

    " + "

    " + "
    " + appendFilteredTest() + "

    " + "
      "; + } + + appendHeader(); + appendBanner(); + appendTestResults(); + appendUserAgent(); + appendToolbar(); + } + + function appendTestsList(modules) { + var i, l, x, z, test, moduleObj; + + for (i = 0, l = modules.length; i < l; i++) { + moduleObj = modules[i]; + + for (x = 0, z = moduleObj.tests.length; x < z; x++) { + test = moduleObj.tests[x]; + + appendTest(test.name, test.testId, moduleObj.name); + } + } + } + + function appendTest(name, testId, moduleName) { + var title, + rerunTrigger, + testBlock, + assertList, + tests = id("qunit-tests"); + + if (!tests) { + return; + } + + title = document$$1.createElement("strong"); + title.innerHTML = getNameHtml(name, moduleName); + + rerunTrigger = document$$1.createElement("a"); + rerunTrigger.innerHTML = "Rerun"; + rerunTrigger.href = setUrl({ testId: testId }); + + testBlock = document$$1.createElement("li"); + testBlock.appendChild(title); + testBlock.appendChild(rerunTrigger); + testBlock.id = "qunit-test-output-" + testId; + + assertList = document$$1.createElement("ol"); + assertList.className = "qunit-assert-list"; + + testBlock.appendChild(assertList); + + tests.appendChild(testBlock); + } + + // HTML Reporter initialization and load + QUnit.begin(function (details) { + var i, moduleObj, tests; + + // Sort modules by name for the picker + for (i = 0; i < details.modules.length; i++) { + moduleObj = details.modules[i]; + if (moduleObj.name) { + modulesList.push(moduleObj.name); + } + } + modulesList.sort(function (a, b) { + return a.localeCompare(b); + }); + + // Initialize QUnit elements + appendInterface(); + appendTestsList(details.modules); + tests = id("qunit-tests"); + if (tests && config.hidepassed) { + addClass(tests, "hidepass"); + } + }); + + QUnit.done(function (details) { + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + abortButton = id("qunit-abort-tests-button"), + totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests, + html = [totalTests, " tests completed in ", details.runtime, " milliseconds, with ", stats.failedTests, " failed, ", stats.skippedTests, " skipped, and ", stats.todoTests, " todo.
      ", "", details.passed, " assertions of ", details.total, " passed, ", details.failed, " failed."].join(""), + test, + assertLi, + assertList; + + // Update remaing tests to aborted + if (abortButton && abortButton.disabled) { + html = "Tests aborted after " + details.runtime + " milliseconds."; + + for (var i = 0; i < tests.children.length; i++) { + test = tests.children[i]; + if (test.className === "" || test.className === "running") { + test.className = "aborted"; + assertList = test.getElementsByTagName("ol")[0]; + assertLi = document$$1.createElement("li"); + assertLi.className = "fail"; + assertLi.innerHTML = "Test aborted."; + assertList.appendChild(assertLi); + } + } + } + + if (banner && (!abortButton || abortButton.disabled === false)) { + banner.className = stats.failedTests ? "qunit-fail" : "qunit-pass"; + } + + if (abortButton) { + abortButton.parentNode.removeChild(abortButton); + } + + if (tests) { + id("qunit-testresult-display").innerHTML = html; + } + + if (config.altertitle && document$$1.title) { + + // Show ✖ for good, ✔ for bad suite result in title + // use escape sequences in case file gets loaded with non-utf-8 + // charset + document$$1.title = [stats.failedTests ? "\u2716" : "\u2714", document$$1.title.replace(/^[\u2714\u2716] /i, "")].join(" "); + } + + // Scroll back to top to show results + if (config.scrolltop && window.scrollTo) { + window.scrollTo(0, 0); + } + }); + + function getNameHtml(name, module) { + var nameHtml = ""; + + if (module) { + nameHtml = "" + escapeText(module) + ": "; + } + + nameHtml += "" + escapeText(name) + ""; + + return nameHtml; + } + + QUnit.testStart(function (details) { + var running, testBlock, bad; + + testBlock = id("qunit-test-output-" + details.testId); + if (testBlock) { + testBlock.className = "running"; + } else { + + // Report later registered tests + appendTest(details.name, details.testId, details.module); + } + + running = id("qunit-testresult-display"); + if (running) { + bad = QUnit.config.reorder && details.previousFailure; + + running.innerHTML = [bad ? "Rerunning previously failed test:
      " : "Running:
      ", getNameHtml(details.name, details.module)].join(""); + } + }); + + function stripHtml(string) { + + // Strip tags, html entity and whitespaces + return string.replace(/<\/?[^>]+(>|$)/g, "").replace(/\"/g, "").replace(/\s+/g, ""); + } + + QUnit.log(function (details) { + var assertList, + assertLi, + message, + expected, + actual, + diff, + showDiff = false, + testItem = id("qunit-test-output-" + details.testId); + + if (!testItem) { + return; + } + + message = escapeText(details.message) || (details.result ? "okay" : "failed"); + message = "" + message + ""; + message += "@ " + details.runtime + " ms"; + + // The pushFailure doesn't provide details.expected + // when it calls, it's implicit to also not show expected and diff stuff + // Also, we need to check details.expected existence, as it can exist and be undefined + if (!details.result && hasOwn.call(details, "expected")) { + if (details.negative) { + expected = "NOT " + QUnit.dump.parse(details.expected); + } else { + expected = QUnit.dump.parse(details.expected); + } + + actual = QUnit.dump.parse(details.actual); + message += ""; + + if (actual !== expected) { + + message += ""; + + if (typeof details.actual === "number" && typeof details.expected === "number") { + if (!isNaN(details.actual) && !isNaN(details.expected)) { + showDiff = true; + diff = details.actual - details.expected; + diff = (diff > 0 ? "+" : "") + diff; + } + } else if (typeof details.actual !== "boolean" && typeof details.expected !== "boolean") { + diff = QUnit.diff(expected, actual); + + // don't show diff if there is zero overlap + showDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length; + } + + if (showDiff) { + message += ""; + } + } else if (expected.indexOf("[object Array]") !== -1 || expected.indexOf("[object Object]") !== -1) { + message += ""; + } else { + message += ""; + } + + if (details.source) { + message += ""; + } + + message += "
      Expected:
      " + escapeText(expected) + "
      Result:
      " + escapeText(actual) + "
      Diff:
      " + diff + "
      Message: " + "Diff suppressed as the depth of object is more than current max depth (" + QUnit.config.maxDepth + ").

      Hint: Use QUnit.dump.maxDepth to " + " run with a higher max depth or " + "Rerun without max depth.

      Message: " + "Diff suppressed as the expected and actual results have an equivalent" + " serialization
      Source:
      " + escapeText(details.source) + "
      "; + + // This occurs when pushFailure is set and we have an extracted stack trace + } else if (!details.result && details.source) { + message += "" + "" + "
      Source:
      " + escapeText(details.source) + "
      "; + } + + assertList = testItem.getElementsByTagName("ol")[0]; + + assertLi = document$$1.createElement("li"); + assertLi.className = details.result ? "pass" : "fail"; + assertLi.innerHTML = message; + assertList.appendChild(assertLi); + }); + + QUnit.testDone(function (details) { + var testTitle, + time, + testItem, + assertList, + good, + bad, + testCounts, + skipped, + sourceName, + tests = id("qunit-tests"); + + if (!tests) { + return; + } + + testItem = id("qunit-test-output-" + details.testId); + + assertList = testItem.getElementsByTagName("ol")[0]; + + good = details.passed; + bad = details.failed; + + // This test passed if it has no unexpected failed assertions + var testPassed = details.failed > 0 ? details.todo : !details.todo; + + if (testPassed) { + + // Collapse the passing tests + addClass(assertList, "qunit-collapsed"); + } else if (config.collapse) { + if (!collapseNext) { + + // Skip collapsing the first failing test + collapseNext = true; + } else { + + // Collapse remaining tests + addClass(assertList, "qunit-collapsed"); + } + } + + // The testItem.firstChild is the test name + testTitle = testItem.firstChild; + + testCounts = bad ? "" + bad + ", " + "" + good + ", " : ""; + + testTitle.innerHTML += " (" + testCounts + details.assertions.length + ")"; + + if (details.skipped) { + stats.skippedTests++; + + testItem.className = "skipped"; + skipped = document$$1.createElement("em"); + skipped.className = "qunit-skipped-label"; + skipped.innerHTML = "skipped"; + testItem.insertBefore(skipped, testTitle); + } else { + addEvent(testTitle, "click", function () { + toggleClass(assertList, "qunit-collapsed"); + }); + + testItem.className = testPassed ? "pass" : "fail"; + + if (details.todo) { + var todoLabel = document$$1.createElement("em"); + todoLabel.className = "qunit-todo-label"; + todoLabel.innerHTML = "todo"; + testItem.className += " todo"; + testItem.insertBefore(todoLabel, testTitle); + } + + time = document$$1.createElement("span"); + time.className = "runtime"; + time.innerHTML = details.runtime + " ms"; + testItem.insertBefore(time, assertList); + + if (!testPassed) { + stats.failedTests++; + } else if (details.todo) { + stats.todoTests++; + } else { + stats.passedTests++; + } + } + + // Show the source of the test when showing assertions + if (details.source) { + sourceName = document$$1.createElement("p"); + sourceName.innerHTML = "Source: " + details.source; + addClass(sourceName, "qunit-source"); + if (testPassed) { + addClass(sourceName, "qunit-collapsed"); + } + addEvent(testTitle, "click", function () { + toggleClass(sourceName, "qunit-collapsed"); + }); + testItem.appendChild(sourceName); + } + }); + + // Avoid readyState issue with phantomjs + // Ref: #818 + var notPhantom = function (p) { + return !(p && p.version && p.version.major > 0); + }(window.phantom); + + if (notPhantom && document$$1.readyState === "complete") { + QUnit.load(); + } else { + addEvent(window, "load", QUnit.load); + } + + // Wrap window.onerror. We will call the original window.onerror to see if + // the existing handler fully handles the error; if not, we will call the + // QUnit.onError function. + var originalWindowOnError = window.onerror; + + // Cover uncaught exceptions + // Returning true will suppress the default browser handler, + // returning false will let it run. + window.onerror = function (message, fileName, lineNumber) { + var ret = false; + if (originalWindowOnError) { + for (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { + args[_key - 3] = arguments[_key]; + } + + ret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args)); + } + + // Treat return value as window.onerror itself does, + // Only do our handling if not suppressed. + if (ret !== true) { + var error = { + message: message, + fileName: fileName, + lineNumber: lineNumber + }; + + ret = QUnit.onError(error); + } + + return ret; + }; + + // Listen for unhandled rejections, and call QUnit.onUnhandledRejection + window.addEventListener("unhandledrejection", function (event) { + QUnit.onUnhandledRejection(event.reason); + }); + })(); + + /* + * This file is a modified version of google-diff-match-patch's JavaScript implementation + * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js), + * modifications are licensed as more fully set forth in LICENSE.txt. + * + * The original source of google-diff-match-patch is attributable and licensed as follows: + * + * Copyright 2006 Google Inc. + * https://code.google.com/p/google-diff-match-patch/ + * + * 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 + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * More Info: + * https://code.google.com/p/google-diff-match-patch/ + * + * Usage: QUnit.diff(expected, actual) + * + */ + QUnit.diff = function () { + function DiffMatchPatch() {} + + // DIFF FUNCTIONS + + /** + * The data structure representing a diff is an array of tuples: + * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']] + * which means: delete 'Hello', add 'Goodbye' and keep ' world.' + */ + var DIFF_DELETE = -1, + DIFF_INSERT = 1, + DIFF_EQUAL = 0; + + /** + * Find the differences between two texts. Simplifies the problem by stripping + * any common prefix or suffix off the texts before diffing. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean=} optChecklines Optional speedup flag. If present and false, + * then don't run a line-level diff first to identify the changed areas. + * Defaults to true, which does a faster, slightly less optimal diff. + * @return {!Array.} Array of diff tuples. + */ + DiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) { + var deadline, checklines, commonlength, commonprefix, commonsuffix, diffs; + + // The diff must be complete in up to 1 second. + deadline = new Date().getTime() + 1000; + + // Check for null inputs. + if (text1 === null || text2 === null) { + throw new Error("Null input. (DiffMain)"); + } + + // Check for equality (speedup). + if (text1 === text2) { + if (text1) { + return [[DIFF_EQUAL, text1]]; + } + return []; + } + + if (typeof optChecklines === "undefined") { + optChecklines = true; + } + + checklines = optChecklines; + + // Trim off common prefix (speedup). + commonlength = this.diffCommonPrefix(text1, text2); + commonprefix = text1.substring(0, commonlength); + text1 = text1.substring(commonlength); + text2 = text2.substring(commonlength); + + // Trim off common suffix (speedup). + commonlength = this.diffCommonSuffix(text1, text2); + commonsuffix = text1.substring(text1.length - commonlength); + text1 = text1.substring(0, text1.length - commonlength); + text2 = text2.substring(0, text2.length - commonlength); + + // Compute the diff on the middle block. + diffs = this.diffCompute(text1, text2, checklines, deadline); + + // Restore the prefix and suffix. + if (commonprefix) { + diffs.unshift([DIFF_EQUAL, commonprefix]); + } + if (commonsuffix) { + diffs.push([DIFF_EQUAL, commonsuffix]); + } + this.diffCleanupMerge(diffs); + return diffs; + }; + + /** + * Reduce the number of edits by eliminating operationally trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) { + var changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + + // Is there an insertion operation before the last equality. + preIns = false; + + // Is there a deletion operation before the last equality. + preDel = false; + + // Is there an insertion operation after the last equality. + postIns = false; + + // Is there a deletion operation after the last equality. + postDel = false; + while (pointer < diffs.length) { + + // Equality found. + if (diffs[pointer][0] === DIFF_EQUAL) { + if (diffs[pointer][1].length < 4 && (postIns || postDel)) { + + // Candidate found. + equalities[equalitiesLength++] = pointer; + preIns = postIns; + preDel = postDel; + lastequality = diffs[pointer][1]; + } else { + + // Not a candidate, and can never become one. + equalitiesLength = 0; + lastequality = null; + } + postIns = postDel = false; + + // An insertion or deletion. + } else { + + if (diffs[pointer][0] === DIFF_DELETE) { + postDel = true; + } else { + postIns = true; + } + + /* + * Five types to be split: + * ABXYCD + * AXCD + * ABXC + * AXCD + * ABXC + */ + if (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) { + + // Duplicate record. + diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]); + + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + equalitiesLength--; // Throw away the equality we just deleted; + lastequality = null; + if (preIns && preDel) { + + // No changes made which could affect previous entry, keep going. + postIns = postDel = true; + equalitiesLength = 0; + } else { + equalitiesLength--; // Throw away the previous equality. + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + postIns = postDel = false; + } + changes = true; + } + } + pointer++; + } + + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + + /** + * Convert a diff array into a pretty HTML report. + * @param {!Array.} diffs Array of diff tuples. + * @param {integer} string to be beautified. + * @return {string} HTML representation. + */ + DiffMatchPatch.prototype.diffPrettyHtml = function (diffs) { + var op, + data, + x, + html = []; + for (x = 0; x < diffs.length; x++) { + op = diffs[x][0]; // Operation (insert, delete, equal) + data = diffs[x][1]; // Text of change. + switch (op) { + case DIFF_INSERT: + html[x] = "" + escapeText(data) + ""; + break; + case DIFF_DELETE: + html[x] = "" + escapeText(data) + ""; + break; + case DIFF_EQUAL: + html[x] = "" + escapeText(data) + ""; + break; + } + } + return html.join(""); + }; + + /** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ + DiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) { + var pointermid, pointermax, pointermin, pointerstart; + + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) { + return 0; + } + + // Binary search. + // Performance analysis: https://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerstart = 0; + while (pointermin < pointermid) { + if (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; + }; + + /** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ + DiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) { + var pointermid, pointermax, pointermin, pointerend; + + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) { + return 0; + } + + // Binary search. + // Performance analysis: https://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerend = 0; + while (pointermin < pointermid) { + if (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; + }; + + /** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean} checklines Speedup flag. If false, then don't run a + * line-level diff first to identify the changed areas. + * If true, then run a faster, slightly less optimal diff. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) { + var diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB; + + if (!text1) { + + // Just add some text (speedup). + return [[DIFF_INSERT, text2]]; + } + + if (!text2) { + + // Just delete some text (speedup). + return [[DIFF_DELETE, text1]]; + } + + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + i = longtext.indexOf(shorttext); + if (i !== -1) { + + // Shorter text is inside the longer text (speedup). + diffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]]; + + // Swap insertions for deletions if diff is reversed. + if (text1.length > text2.length) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if (shorttext.length === 1) { + + // Single character string. + // After the previous speedup, the character can't be an equality. + return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; + } + + // Check to see if the problem can be split in two. + hm = this.diffHalfMatch(text1, text2); + if (hm) { + + // A half-match was found, sort out the return data. + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + midCommon = hm[4]; + + // Send both pairs off for separate processing. + diffsA = this.DiffMain(text1A, text2A, checklines, deadline); + diffsB = this.DiffMain(text1B, text2B, checklines, deadline); + + // Merge the results. + return diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB); + } + + if (checklines && text1.length > 100 && text2.length > 100) { + return this.diffLineMode(text1, text2, deadline); + } + + return this.diffBisect(text1, text2, deadline); + }; + + /** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + * @private + */ + DiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) { + var longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm; + + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + dmp = this; // 'this' becomes 'window' in a closure. + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diffHalfMatchI(longtext, shorttext, i) { + var seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB; + + // Start with a 1/4 length substring at position i as a seed. + seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + j = -1; + bestCommon = ""; + while ((j = shorttext.indexOf(seed, j + 1)) !== -1) { + prefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j)); + suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j)); + if (bestCommon.length < suffixLength + prefixLength) { + bestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength); + bestLongtextA = longtext.substring(0, i - suffixLength); + bestLongtextB = longtext.substring(i + prefixLength); + bestShorttextA = shorttext.substring(0, j - suffixLength); + bestShorttextB = shorttext.substring(j + prefixLength); + } + } + if (bestCommon.length * 2 >= longtext.length) { + return [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + hm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4)); + + // Check again based on the third quarter. + hm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2)); + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + if (text1.length > text2.length) { + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + } else { + text2A = hm[0]; + text2B = hm[1]; + text1A = hm[2]; + text1B = hm[3]; + } + midCommon = hm[4]; + return [text1A, text1B, text2A, text2B, midCommon]; + }; + + /** + * Do a quick line-level diff on both strings, then rediff the parts for + * greater accuracy. + * This speedup can produce non-minimal diffs. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) { + var a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j; + + // Scan the text on a line-by-line basis first. + a = this.diffLinesToChars(text1, text2); + text1 = a.chars1; + text2 = a.chars2; + linearray = a.lineArray; + + diffs = this.DiffMain(text1, text2, false, deadline); + + // Convert the diff back to original text. + this.diffCharsToLines(diffs, linearray); + + // Eliminate freak matches (e.g. blank lines) + this.diffCleanupSemantic(diffs); + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs.push([DIFF_EQUAL, ""]); + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + break; + case DIFF_EQUAL: + + // Upon reaching an equality, check for prior redundancies. + if (countDelete >= 1 && countInsert >= 1) { + + // Delete the offending records and add the merged ones. + diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert); + pointer = pointer - countDelete - countInsert; + a = this.DiffMain(textDelete, textInsert, false, deadline); + for (j = a.length - 1; j >= 0; j--) { + diffs.splice(pointer, 0, a[j]); + } + pointer = pointer + a.length; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + pointer++; + } + diffs.pop(); // Remove the dummy entry at the end. + + return diffs; + }; + + /** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) { + var text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2; + + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + maxD = Math.ceil((text1Length + text2Length) / 2); + vOffset = maxD; + vLength = 2 * maxD; + v1 = new Array(vLength); + v2 = new Array(vLength); + + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (x = 0; x < vLength; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[vOffset + 1] = 0; + v2[vOffset + 1] = 0; + delta = text1Length - text2Length; + + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + front = delta % 2 !== 0; + + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + k1start = 0; + k1end = 0; + k2start = 0; + k2end = 0; + for (d = 0; d < maxD; d++) { + + // Bail out if deadline is reached. + if (new Date().getTime() > deadline) { + break; + } + + // Walk the front path one step. + for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + k1Offset = vOffset + k1; + if (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) { + x1 = v1[k1Offset + 1]; + } else { + x1 = v1[k1Offset - 1] + 1; + } + y1 = x1 - k1; + while (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) { + x1++; + y1++; + } + v1[k1Offset] = x1; + if (x1 > text1Length) { + + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2Length) { + + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + k2Offset = vOffset + delta - k1; + if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) { + + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - v2[k2Offset]; + if (x1 >= x2) { + + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + + // Walk the reverse path one step. + for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + k2Offset = vOffset + k2; + if (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) { + x2 = v2[k2Offset + 1]; + } else { + x2 = v2[k2Offset - 1] + 1; + } + y2 = x2 - k2; + while (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) { + x2++; + y2++; + } + v2[k2Offset] = x2; + if (x2 > text1Length) { + + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2Length) { + + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + k1Offset = vOffset + delta - k2; + if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) { + x1 = v1[k1Offset]; + y1 = vOffset + x1 - k1Offset; + + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - x2; + if (x1 >= x2) { + + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + } + + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; + }; + + /** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) { + var text1a, text1b, text2a, text2b, diffs, diffsb; + text1a = text1.substring(0, x); + text2a = text2.substring(0, y); + text1b = text1.substring(x); + text2b = text2.substring(y); + + // Compute both diffs serially. + diffs = this.DiffMain(text1a, text2a, false, deadline); + diffsb = this.DiffMain(text1b, text2b, false, deadline); + + return diffs.concat(diffsb); + }; + + /** + * Reduce the number of edits by eliminating semantically trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) { + var changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + + // Number of characters that changed prior to the equality. + lengthInsertions1 = 0; + lengthDeletions1 = 0; + + // Number of characters that changed after the equality. + lengthInsertions2 = 0; + lengthDeletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer][0] === DIFF_EQUAL) { + // Equality found. + equalities[equalitiesLength++] = pointer; + lengthInsertions1 = lengthInsertions2; + lengthDeletions1 = lengthDeletions2; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = diffs[pointer][1]; + } else { + // An insertion or deletion. + if (diffs[pointer][0] === DIFF_INSERT) { + lengthInsertions2 += diffs[pointer][1].length; + } else { + lengthDeletions2 += diffs[pointer][1].length; + } + + // Eliminate an equality that is smaller or equal to the edits on both + // sides of it. + if (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) { + + // Duplicate record. + diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]); + + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + + // Throw away the equality we just deleted. + equalitiesLength--; + + // Throw away the previous equality (it needs to be reevaluated). + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + + // Reset the counters. + lengthInsertions1 = 0; + lengthDeletions1 = 0; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = null; + changes = true; + } + } + pointer++; + } + + // Normalize the diff. + if (changes) { + this.diffCleanupMerge(diffs); + } + + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1; + while (pointer < diffs.length) { + if (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) { + deletion = diffs[pointer - 1][1]; + insertion = diffs[pointer][1]; + overlapLength1 = this.diffCommonOverlap(deletion, insertion); + overlapLength2 = this.diffCommonOverlap(insertion, deletion); + if (overlapLength1 >= overlapLength2) { + if (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) { + + // Overlap found. Insert an equality and trim the surrounding edits. + diffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]); + diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1); + diffs[pointer + 1][1] = insertion.substring(overlapLength1); + pointer++; + } + } else { + if (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) { + + // Reverse overlap found. + // Insert an equality and swap and trim the surrounding edits. + diffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]); + + diffs[pointer - 1][0] = DIFF_INSERT; + diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2); + diffs[pointer + 1][0] = DIFF_DELETE; + diffs[pointer + 1][1] = deletion.substring(overlapLength2); + pointer++; + } + } + pointer++; + } + pointer++; + } + }; + + /** + * Determine if the suffix of one string is the prefix of another. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of the first + * string and the start of the second string. + * @private + */ + DiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) { + var text1Length, text2Length, textLength, best, length, pattern, found; + + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + + // Eliminate the null case. + if (text1Length === 0 || text2Length === 0) { + return 0; + } + + // Truncate the longer string. + if (text1Length > text2Length) { + text1 = text1.substring(text1Length - text2Length); + } else if (text1Length < text2Length) { + text2 = text2.substring(0, text1Length); + } + textLength = Math.min(text1Length, text2Length); + + // Quick check for the worst case. + if (text1 === text2) { + return textLength; + } + + // Start by looking for a single character match + // and increase length until no match is found. + // Performance analysis: https://neil.fraser.name/news/2010/11/04/ + best = 0; + length = 1; + while (true) { + pattern = text1.substring(textLength - length); + found = text2.indexOf(pattern); + if (found === -1) { + return best; + } + length += found; + if (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) { + best = length; + length++; + } + } + }; + + /** + * Split two texts into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {{chars1: string, chars2: string, lineArray: !Array.}} + * An object containing the encoded text1, the encoded text2 and + * the array of unique strings. + * The zeroth element of the array of unique strings is intentionally blank. + * @private + */ + DiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) { + var lineArray, lineHash, chars1, chars2; + lineArray = []; // E.g. lineArray[4] === 'Hello\n' + lineHash = {}; // E.g. lineHash['Hello\n'] === 4 + + // '\x00' is a valid character, but various debuggers don't like it. + // So we'll insert a junk entry to avoid generating a null character. + lineArray[0] = ""; + + /** + * Split a text into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * Modifies linearray and linehash through being a closure. + * @param {string} text String to encode. + * @return {string} Encoded string. + * @private + */ + function diffLinesToCharsMunge(text) { + var chars, lineStart, lineEnd, lineArrayLength, line; + chars = ""; + + // Walk the text, pulling out a substring for each line. + // text.split('\n') would would temporarily double our memory footprint. + // Modifying text would create many large strings to garbage collect. + lineStart = 0; + lineEnd = -1; + + // Keeping our own length variable is faster than looking it up. + lineArrayLength = lineArray.length; + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf("\n", lineStart); + if (lineEnd === -1) { + lineEnd = text.length - 1; + } + line = text.substring(lineStart, lineEnd + 1); + lineStart = lineEnd + 1; + + var lineHashExists = lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined; + + if (lineHashExists) { + chars += String.fromCharCode(lineHash[line]); + } else { + chars += String.fromCharCode(lineArrayLength); + lineHash[line] = lineArrayLength; + lineArray[lineArrayLength++] = line; + } + } + return chars; + } + + chars1 = diffLinesToCharsMunge(text1); + chars2 = diffLinesToCharsMunge(text2); + return { + chars1: chars1, + chars2: chars2, + lineArray: lineArray + }; + }; + + /** + * Rehydrate the text in a diff from a string of line hashes to real lines of + * text. + * @param {!Array.} diffs Array of diff tuples. + * @param {!Array.} lineArray Array of unique strings. + * @private + */ + DiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) { + var x, chars, text, y; + for (x = 0; x < diffs.length; x++) { + chars = diffs[x][1]; + text = []; + for (y = 0; y < chars.length; y++) { + text[y] = lineArray[chars.charCodeAt(y)]; + } + diffs[x][1] = text.join(""); + } + }; + + /** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupMerge = function (diffs) { + var pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position; + diffs.push([DIFF_EQUAL, ""]); // Add a dummy entry at the end. + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + + // Upon reaching an equality, check for prior redundancies. + if (countDelete + countInsert > 1) { + if (countDelete !== 0 && countInsert !== 0) { + + // Factor out any common prefixes. + commonlength = this.diffCommonPrefix(textInsert, textDelete); + if (commonlength !== 0) { + if (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) { + diffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength); + } else { + diffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]); + pointer++; + } + textInsert = textInsert.substring(commonlength); + textDelete = textDelete.substring(commonlength); + } + + // Factor out any common suffixies. + commonlength = this.diffCommonSuffix(textInsert, textDelete); + if (commonlength !== 0) { + diffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1]; + textInsert = textInsert.substring(0, textInsert.length - commonlength); + textDelete = textDelete.substring(0, textDelete.length - commonlength); + } + } + + // Delete the offending records and add the merged ones. + if (countDelete === 0) { + diffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]); + } else if (countInsert === 0) { + diffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]); + } else { + diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]); + } + pointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1; + } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) { + + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + } + if (diffs[diffs.length - 1][1] === "") { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + changes = false; + pointer = 1; + + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) { + + diffPointer = diffs[pointer][1]; + position = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length); + + // This is a single edit surrounded by equalities. + if (position === diffs[pointer - 1][1]) { + + // Shift the edit over the previous equality. + diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) { + + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + + return function (o, n) { + var diff, output, text; + diff = new DiffMatchPatch(); + output = diff.DiffMain(o, n); + diff.diffCleanupEfficiency(output); + text = diff.diffPrettyHtml(output); + + return text; + }; + }(); + +}((function() { return this; }()))); diff --git a/yknjs/reveal.js/test/simple.md b/yknjs/reveal.js/test/simple.md new file mode 100644 index 0000000..c72a440 --- /dev/null +++ b/yknjs/reveal.js/test/simple.md @@ -0,0 +1,12 @@ +## Slide 1.1 + +```js +var a = 1; +``` + + +## Slide 1.2 + + + +## Slide 2 diff --git a/yknjs/reveal.js/test/test-dependencies-async.html b/yknjs/reveal.js/test/test-dependencies-async.html new file mode 100644 index 0000000..b36c31b --- /dev/null +++ b/yknjs/reveal.js/test/test-dependencies-async.html @@ -0,0 +1,78 @@ + + + + + + + reveal.js - Test Async Dependencies + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-dependencies.html b/yknjs/reveal.js/test/test-dependencies.html new file mode 100644 index 0000000..49aaf60 --- /dev/null +++ b/yknjs/reveal.js/test/test-dependencies.html @@ -0,0 +1,54 @@ + + + + + + + reveal.js - Test Dependencies + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-grid-navigation.html b/yknjs/reveal.js/test/test-grid-navigation.html new file mode 100644 index 0000000..21e7636 --- /dev/null +++ b/yknjs/reveal.js/test/test-grid-navigation.html @@ -0,0 +1,74 @@ + + + + + + + reveal.js - Test Grid + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-iframes.html b/yknjs/reveal.js/test/test-iframes.html new file mode 100644 index 0000000..979bb7d --- /dev/null +++ b/yknjs/reveal.js/test/test-iframes.html @@ -0,0 +1,108 @@ + + + + + + + reveal.js - Test Iframes + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-markdown-element-attributes.html b/yknjs/reveal.js/test/test-markdown-element-attributes.html new file mode 100644 index 0000000..741131f --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-element-attributes.html @@ -0,0 +1,132 @@ + + + + + + + reveal.js - Test Markdown Element Attributes + + + + + + + +
      +
      + + + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-markdown-element-attributes.js b/yknjs/reveal.js/test/test-markdown-element-attributes.js new file mode 100644 index 0000000..fc87b7b --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-element-attributes.js @@ -0,0 +1,44 @@ +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + QUnit.test( 'Vertical separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' ); + }); + + QUnit.test( 'Attributes on element header in vertical slides', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' ); + }); + + QUnit.test( 'Attributes on element paragraphs in vertical slides', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' ); + }); + + QUnit.test( 'Attributes on element list items in vertical slides', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.grow' ).length, 3, 'found a vertical slide with three list items with class fragment.grow' ); + }); + + QUnit.test( 'Attributes on element paragraphs in horizontal slides', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' ); + }); + + QUnit.test( 'Attributes on element list items in horizontal slides', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' ); + }); + + QUnit.test( 'Attributes on element image in horizontal slides', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' ); + }); + + QUnit.test( 'Attributes on elements in vertical slides with default element attribute separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section h2.fragment.highlight-red' ).length, 2, 'found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator' ); + }); + + QUnit.test( 'Attributes on elements in single slides with default element attribute separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-blue' ).length, 3, 'found three elements with fragment highlight-blue in single slide with default element attribute separator' ); + }); + +} ); + +Reveal.initialize(); diff --git a/yknjs/reveal.js/test/test-markdown-external.html b/yknjs/reveal.js/test/test-markdown-external.html new file mode 100644 index 0000000..93cd983 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-external.html @@ -0,0 +1,37 @@ + + + + + + + reveal.js - Test Markdown + + + + + + + +
      +
      + + + + + + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-markdown-external.js b/yknjs/reveal.js/test/test-markdown-external.js new file mode 100644 index 0000000..f924986 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-external.js @@ -0,0 +1,20 @@ +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + QUnit.test( 'Vertical separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); + }); + + QUnit.test( 'Horizontal separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section' ).length, 2, 'found two slides' ); + }); + + QUnit.test( 'Language highlighter', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.hljs-keyword' ).length, 1, 'got rendered highlight tag.' ); + assert.strictEqual( document.querySelector( '.hljs-keyword' ).innerHTML, 'var', 'the same keyword: var.' ); + }); + +} ); + +Reveal.initialize(); diff --git a/yknjs/reveal.js/test/test-markdown-options.html b/yknjs/reveal.js/test/test-markdown-options.html new file mode 100644 index 0000000..5391a19 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-options.html @@ -0,0 +1,40 @@ + + + + + + + reveal.js - Test Markdown Options + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-markdown-options.js b/yknjs/reveal.js/test/test-markdown-options.js new file mode 100644 index 0000000..ef61659 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-options.js @@ -0,0 +1,27 @@ +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + QUnit.test( 'Options are set', function( assert ) { + assert.strictEqual( marked.defaults.smartypants, true ); + }); + + QUnit.test( 'Smart quotes are activated', function( assert ) { + var text = document.querySelector( '.reveal .slides>section>p' ).textContent; + + assert.strictEqual( /['"]/.test( text ), false ); + assert.strictEqual( /[“”‘’]/.test( text ), true ); + }); + +} ); + +Reveal.initialize({ + dependencies: [ + { src: '../plugin/markdown/marked.js' }, + // Test loading JS files with query strings + { src: '../plugin/markdown/markdown.js?query=string' }, + ], + markdown: { + smartypants: true + } +}); diff --git a/yknjs/reveal.js/test/test-markdown-slide-attributes.html b/yknjs/reveal.js/test/test-markdown-slide-attributes.html new file mode 100644 index 0000000..ba9e710 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-slide-attributes.html @@ -0,0 +1,127 @@ + + + + + + + reveal.js - Test Markdown Attributes + + + + + + + +
      +
      + + + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-markdown-slide-attributes.js b/yknjs/reveal.js/test/test-markdown-slide-attributes.js new file mode 100644 index 0000000..b44323a --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown-slide-attributes.js @@ -0,0 +1,44 @@ +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + QUnit.test( 'Vertical separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' ); + }); + + QUnit.test( 'Id on slide', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' ); + }); + + QUnit.test( 'data-background attributes', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); + }); + + QUnit.test( 'data-transition attributes', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' ); + }); + + QUnit.test( 'data-background attributes with default separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); + }); + + QUnit.test( 'data-transition attributes with default separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' ); + }); + + QUnit.test( 'data-transition attributes with inline content', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' ); + }); + +} ); + +Reveal.initialize(); diff --git a/yknjs/reveal.js/test/test-markdown.html b/yknjs/reveal.js/test/test-markdown.html new file mode 100644 index 0000000..e1e5926 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown.html @@ -0,0 +1,51 @@ + + + + + + + reveal.js - Test Markdown + + + + + + + +
      +
      + + + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-markdown.js b/yknjs/reveal.js/test/test-markdown.js new file mode 100644 index 0000000..5ea8bf2 --- /dev/null +++ b/yknjs/reveal.js/test/test-markdown.js @@ -0,0 +1,11 @@ +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + QUnit.test( 'Vertical separator', function( assert ) { + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); + }); + +} ); + +Reveal.initialize(); diff --git a/yknjs/reveal.js/test/test-pdf.html b/yknjs/reveal.js/test/test-pdf.html new file mode 100644 index 0000000..a0b8282 --- /dev/null +++ b/yknjs/reveal.js/test/test-pdf.html @@ -0,0 +1,82 @@ + + + + + + + reveal.js - Test PDF exports + + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-pdf.js b/yknjs/reveal.js/test/test-pdf.js new file mode 100644 index 0000000..1ebf997 --- /dev/null +++ b/yknjs/reveal.js/test/test-pdf.js @@ -0,0 +1,12 @@ +Reveal.addEventListener( 'ready', function() { + + // Only one test for now, we're mainly ensuring that there + // are no execution errors when running PDF mode + + QUnit.test( 'Reveal.isReady', function( assert ) { + assert.strictEqual( Reveal.isReady(), true, 'returns true' ); + }); + +} ); + +Reveal.initialize({ pdf: true }); diff --git a/yknjs/reveal.js/test/test-plugins.html b/yknjs/reveal.js/test/test-plugins.html new file mode 100644 index 0000000..dfd65b7 --- /dev/null +++ b/yknjs/reveal.js/test/test-plugins.html @@ -0,0 +1,105 @@ + + + + + + + reveal.js - Test Plugins + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test-state.html b/yknjs/reveal.js/test/test-state.html new file mode 100644 index 0000000..e6ae423 --- /dev/null +++ b/yknjs/reveal.js/test/test-state.html @@ -0,0 +1,139 @@ + + + + + + + reveal.js - Test State + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test.html b/yknjs/reveal.js/test/test.html new file mode 100644 index 0000000..309b201 --- /dev/null +++ b/yknjs/reveal.js/test/test.html @@ -0,0 +1,85 @@ + + + + + + + reveal.js - Tests + + + + + + + +
      +
      + + + + + + + + + + diff --git a/yknjs/reveal.js/test/test.js b/yknjs/reveal.js/test/test.js new file mode 100644 index 0000000..2738403 --- /dev/null +++ b/yknjs/reveal.js/test/test.js @@ -0,0 +1,598 @@ +// These tests expect the DOM to contain a presentation +// with the following slide structure: +// +// 1 +// 2 - Three sub-slides +// 3 - Three fragment elements +// 3 - Two fragments with same data-fragment-index +// 4 + +Reveal.addEventListener( 'ready', function() { + + // --------------------------------------------------------------- + // DOM TESTS + + QUnit.module( 'DOM' ); + + QUnit.test( 'Initial slides classes', function( assert ) { + var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' ) + + assert.strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' ); + assert.strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' ); + + assert.strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' ); + + assert.ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' ); + }); + + // --------------------------------------------------------------- + // API TESTS + + QUnit.module( 'API' ); + + QUnit.test( 'Reveal.isReady', function( assert ) { + assert.strictEqual( Reveal.isReady(), true, 'returns true' ); + }); + + QUnit.test( 'Reveal.isOverview', function( assert ) { + assert.strictEqual( Reveal.isOverview(), false, 'false by default' ); + + Reveal.toggleOverview(); + assert.strictEqual( Reveal.isOverview(), true, 'true after toggling on' ); + + Reveal.toggleOverview(); + assert.strictEqual( Reveal.isOverview(), false, 'false after toggling off' ); + }); + + QUnit.test( 'Reveal.isPaused', function( assert ) { + assert.strictEqual( Reveal.isPaused(), false, 'false by default' ); + + Reveal.togglePause(); + assert.strictEqual( Reveal.isPaused(), true, 'true after pausing' ); + + Reveal.togglePause(); + assert.strictEqual( Reveal.isPaused(), false, 'false after resuming' ); + }); + + QUnit.test( 'Reveal.isFirstSlide', function( assert ) { + Reveal.slide( 0, 0 ); + assert.strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); + + Reveal.slide( 1, 0 ); + assert.strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' ); + + Reveal.slide( 0, 0 ); + assert.strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); + }); + + QUnit.test( 'Reveal.isFirstSlide after vertical slide', function( assert ) { + Reveal.slide( 1, 1 ); + Reveal.slide( 0, 0 ); + assert.strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( 0, 0 )' ); + }); + + QUnit.test( 'Reveal.isLastSlide', function( assert ) { + Reveal.slide( 0, 0 ); + assert.strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); + + var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; + + Reveal.slide( lastSlideIndex, 0 ); + assert.strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( '+ lastSlideIndex +', 0 )' ); + + Reveal.slide( 0, 0 ); + assert.strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); + }); + + QUnit.test( 'Reveal.isLastSlide after vertical slide', function( assert ) { + var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; + + Reveal.slide( 1, 1 ); + Reveal.slide( lastSlideIndex ); + assert.strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' ); + }); + + QUnit.test( 'Reveal.getTotalSlides', function( assert ) { + assert.strictEqual( Reveal.getTotalSlides(), 8, 'eight slides in total' ); + }); + + QUnit.test( 'Reveal.getIndices', function( assert ) { + var indices = Reveal.getIndices(); + + assert.ok( indices.hasOwnProperty( 'h' ), 'h exists' ); + assert.ok( indices.hasOwnProperty( 'v' ), 'v exists' ); + assert.ok( indices.hasOwnProperty( 'f' ), 'f exists' ); + + Reveal.slide( 1, 0 ); + assert.strictEqual( Reveal.getIndices().h, 1, 'h 1' ); + assert.strictEqual( Reveal.getIndices().v, 0, 'v 0' ); + + Reveal.slide( 1, 2 ); + assert.strictEqual( Reveal.getIndices().h, 1, 'h 1' ); + assert.strictEqual( Reveal.getIndices().v, 2, 'v 2' ); + + Reveal.slide( 0, 0 ); + assert.strictEqual( Reveal.getIndices().h, 0, 'h 0' ); + assert.strictEqual( Reveal.getIndices().v, 0, 'v 0' ); + }); + + QUnit.test( 'Reveal.getSlide', function( assert ) { + assert.equal( Reveal.getSlide( 0 ), document.querySelector( '.reveal .slides>section:first-child' ), 'gets correct first slide' ); + assert.equal( Reveal.getSlide( 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)' ), 'no v index returns stack' ); + assert.equal( Reveal.getSlide( 1, 0 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(1)' ), 'v index 0 returns first vertical child' ); + assert.equal( Reveal.getSlide( 1, 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(2)' ), 'v index 1 returns second vertical child' ); + + assert.strictEqual( Reveal.getSlide( 100 ), undefined, 'undefined when out of horizontal bounds' ); + assert.strictEqual( Reveal.getSlide( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); + }); + + QUnit.test( 'Reveal.getSlideBackground', function( assert ) { + assert.equal( Reveal.getSlideBackground( 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ), 'gets correct first background' ); + assert.equal( Reveal.getSlideBackground( 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2)' ), 'no v index returns stack' ); + assert.equal( Reveal.getSlideBackground( 1, 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(2)' ), 'v index 0 returns first vertical child' ); + assert.equal( Reveal.getSlideBackground( 1, 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(3)' ), 'v index 1 returns second vertical child' ); + + assert.strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'undefined when out of horizontal bounds' ); + assert.strictEqual( Reveal.getSlideBackground( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); + }); + + QUnit.test( 'Reveal.getSlideNotes', function( assert ) { + Reveal.slide( 0, 0 ); + assert.ok( Reveal.getSlideNotes() === 'speaker notes 1', 'works with